drv_sample.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright (c) 2006-2024, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-07-23 Wangyuqiang first version
  9. */
  10. /*
  11. * 程序清单:这是一个 模拟test字符设备驱动使用例程
  12. * 例程导出了 drv_sample 命令到控制终端
  13. * 命令调用格式:drv_sample
  14. * 程序功能:模拟一个字符设备驱动,使开发者无需对接驱动框架即可体验RT-Thread设备驱动。
  15. */
  16. #include <rtthread.h>
  17. #include <rtdevice.h>
  18. static rt_err_t drv_test_init(rt_device_t dev)
  19. {
  20. rt_kprintf("Test drv init!\n");
  21. return RT_EOK;
  22. }
  23. static rt_err_t drv_test_open(rt_device_t dev, rt_uint16_t oflag)
  24. {
  25. rt_kprintf("Test drv open flag = %d.\n", oflag);
  26. return RT_EOK;
  27. }
  28. static rt_err_t drv_test_close(rt_device_t dev)
  29. {
  30. rt_kprintf("Test drv close!\n");
  31. return RT_EOK;
  32. }
  33. static rt_ssize_t drv_test_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
  34. {
  35. rt_kprintf("Test drv read pos = %d, size = %d.\n", pos, size);
  36. return size;
  37. }
  38. static rt_ssize_t drv_test_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
  39. {
  40. rt_kprintf("Test drv write pos = %d, size = %d.\n", pos, size);
  41. return size;
  42. }
  43. static rt_err_t drv_test_control(rt_device_t dev, int cmd, void *args)
  44. {
  45. rt_kprintf("Test drv control cmd = %d.\n", cmd);
  46. return RT_EOK;
  47. }
  48. int rt_drv_test_init(void)
  49. {
  50. rt_device_t test_dev = rt_device_create(RT_Device_Class_Char, 0);
  51. if(!test_dev)
  52. {
  53. rt_kprintf("Test drv create failed!\n");
  54. return -RT_ERROR;
  55. }
  56. test_dev->init = drv_test_init;
  57. test_dev->open = drv_test_open;
  58. test_dev->close = drv_test_close;
  59. test_dev->read = drv_test_read;
  60. test_dev->write = drv_test_write;
  61. test_dev->control = drv_test_control;
  62. if(rt_device_register(test_dev, "test_drv", RT_DEVICE_FLAG_RDWR) != RT_EOK)
  63. {
  64. rt_kprintf("Test drv register failed!\n");
  65. return -RT_ERROR;
  66. }
  67. return RT_EOK;
  68. }
  69. INIT_BOARD_EXPORT(rt_drv_test_init);
  70. static int drv_sample(void)
  71. {
  72. rt_device_t test_dev = rt_device_find("test_drv");
  73. if(test_dev == RT_NULL)
  74. {
  75. rt_kprintf("Can not find test drv!\n");
  76. return -RT_ERROR;
  77. }
  78. rt_device_open(test_dev, RT_DEVICE_OFLAG_RDWR);
  79. rt_device_control(test_dev, RT_DEVICE_CTRL_CONFIG, RT_NULL);
  80. rt_device_write(test_dev, 100, RT_NULL, 1024);
  81. rt_device_read(test_dev, 20, RT_NULL, 128);
  82. rt_device_close(test_dev);
  83. return RT_EOK;
  84. }
  85. MSH_CMD_EXPORT(drv_sample, enable test drv sample);