国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

迅為i.MX6ULL終結(jié)者設(shè)備樹下的Platform驅(qū)動(dòng)實(shí)驗(yàn)程序編寫

發(fā)布時(shí)間:2020-12-31 11:17    發(fā)布者:就是塔塔
文章目錄
  • 1 修改設(shè)備樹文件
  • 2 platform驅(qū)動(dòng)程序
  • 3 應(yīng)用測(cè)試程序

1 修改設(shè)備樹文件

設(shè)備樹文件可以直接使用第三十五章中添加的gpioled子節(jié)點(diǎn)即可,不用重復(fù)添加。

2 platform驅(qū)動(dòng)程序

本實(shí)驗(yàn)例程路徑:i.MX6UL終結(jié)者光盤資料/06_Linux驅(qū)動(dòng)例程/15_gpioled_dts
創(chuàng)建led_driver.c文件,具體內(nèi)容如下:

  1.   1 #include
  2.   2 #include
  3.   3 #include
  4.   4 #include
  5.   5 #include
  6.   6 #include
  7.   7 #include
  8.   8 #include
  9.   9 #include
  10. 10 #include
  11. 11 #include
  12. 12 #include
  13. 13 #include
  14. 14 #include
  15. 15 #include
  16. 16 #include
  17. 17 #include
  18. 18 #include
  19. 19 #include
  20. 20 #include
  21. 21 #include
  22. 22 #include
  23. 23
  24. 24 #define LEDDEV_CNT              1                    /* 設(shè)備號(hào)長(zhǎng)度   */
  25. 25 #define LEDDEV_NAME             "dtsplatled"    /* 設(shè)備名字     */
  26. 26 #define LEDOFF                  0
  27. 27 #define LEDON                   1
  28. 28
  29. 29 /* leddev設(shè)備結(jié)構(gòu)體 */
  30. 30 struct leddev_dev{
  31. 31         dev_t devid;                            /* 設(shè)備號(hào)       */
  32. 32         struct cdev cdev;                       /* cdev         */
  33. 33         struct class *class;            /* 類           */
  34. 34         struct device *device;          /* 設(shè)備 */
  35. 35         int major;                     /* 主設(shè)備號(hào)     */
  36. 36         struct device_node *node;       /* LED設(shè)備節(jié)點(diǎn) */
  37. 37         int led0;                      /* LED燈GPIO標(biāo)號(hào) */
  38. 38 };
  39. 39
  40. 40 struct leddev_dev leddev;               /* led設(shè)備 */
  41. 41
  42. 42 /*
  43. 43  * @description         : LED打開/關(guān)閉
  44. 44  * @param - sta         : LEDON(0) 打開LED,LEDOFF(1) 關(guān)閉LED
  45. 45  * @return                      : 無
  46. 46  */
  47. 47 void led0_switch(u8 sta)
  48. 48 {
  49. 49         if (sta == LEDON )
  50. 50                 gpio_set_value(leddev.led0, 0);
  51. 51         else if (sta == LEDOFF)
  52. 52                 gpio_set_value(leddev.led0, 1);
  53. 53 }
  54. 54
  55. 55 /*
  56. 56  * @description         : 打開設(shè)備
  57. 57  * @param - inode       : 傳遞給驅(qū)動(dòng)的inode
  58. 58  * @param - filp        : 設(shè)備文件,file結(jié)構(gòu)體有個(gè)叫做private_data的成員變量
  59. 59  * 一般在open的時(shí)候?qū)rivate_data指向設(shè)備結(jié)構(gòu)體。
  60. 60  * @return                      : 0 成功;其他 失敗
  61. 61  */
  62. 62 static int led_open(struct inode *inode, struct file *filp)
  63. 63 {
  64. 64         filp->private_data = &leddev; /* 設(shè)置私有數(shù)據(jù)  */
  65. 65         return 0;
  66. 66 }
  67. 67
  68. 68 /*
  69. 69  * @description         : 向設(shè)備寫數(shù)據(jù)
  70. 70  * @param - filp        : 設(shè)備文件,表示打開的文件描述符
  71. 71  * @param - buf         : 要寫給設(shè)備寫入的數(shù)據(jù)
  72. 72  * @param - cnt         : 要寫入的數(shù)據(jù)長(zhǎng)度
  73. 73  * @param - offt        : 相對(duì)于文件首地址的偏移
  74. 74  * @return                      : 寫入的字節(jié)數(shù),如果為負(fù)值,表示寫入失敗
  75. 75  */
  76. 76 static ssize_t led_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
  77. 77 {
  78. 78         int retvalue;
  79. 79         unsigned char databuf[2];
  80. 80         unsigned char ledstat;
  81. 81
  82. 82         retvalue = copy_from_user(databuf, buf, cnt);
  83. 83         if(retvalue < 0) {
  84. 84
  85. 85                 printk("kernel write failed!\r\n");
  86. 86                 return -EFAULT;
  87. 87         }
  88. 88
  89. 89         ledstat = databuf[0];
  90. 90         if (ledstat == LEDON) {
  91. 91                 led0_switch(LEDON);
  92. 92         } else if (ledstat == LEDOFF) {
  93. 93                 led0_switch(LEDOFF);
  94. 94         }
  95. 95         return 0;
  96. 96 }
  97. 97
  98. 98 /* 設(shè)備操作函數(shù) */
  99. 99 static struct file_operations led_fops = {
  100. 100         .owner = THIS_MODULE,
  101. 101         .open = led_open,
  102. 102         .write = led_write,
  103. 103 };
  104. 104
  105. 105 /*
  106. 106  * @description         : flatform驅(qū)動(dòng)的probe函數(shù),當(dāng)驅(qū)動(dòng)與
  107. 107  *                                        設(shè)備匹配以后此函數(shù)就會(huì)執(zhí)行
  108. 108  * @param - dev         : platform設(shè)備
  109. 109  * @return                      : 0,成功;其他負(fù)值,失敗
  110. 110  */
  111. 111 static int led_probe(struct platform_device *dev)
  112. 112 {
  113. 113         printk("led driver and device was matched!\r\n");
  114. 114         /* 1、設(shè)置設(shè)備號(hào) */
  115. 115         if (leddev.major) {
  116. 116                 leddev.devid = MKDEV(leddev.major, 0);
  117. 117               register_chrdev_region(leddev.devid, LEDDEV_CNT, LEDDEV_NAME);
  118. 118         } else {
  119. 119              alloc_chrdev_region(&leddev.devid, 0, LEDDEV_CNT, LEDDEV_NAME);
  120. 120                 leddev.major = MAJOR(leddev.devid);
  121. 121         }
  122. 122
  123. 123         /* 2、注冊(cè)設(shè)備      */
  124. 124         cdev_init(&leddev.cdev, &led_fops);
  125. 125         cdev_add(&leddev.cdev, leddev.devid, LEDDEV_CNT);
  126. 126
  127. 127         /* 3、創(chuàng)建類      */
  128. 128         leddev.class = class_create(THIS_MODULE, LEDDEV_NAME);
  129. 129         if (IS_ERR(leddev.class)) {
  130. 130                 return PTR_ERR(leddev.class);
  131. 131         }
  132. 132
  133. 133         /* 4、創(chuàng)建設(shè)備 */
  134. 134         leddev.device = device_create(leddev.class, NULL, leddev.devid,
  135. NULL, LEDDEV_NAME);
  136. 135         if (IS_ERR(leddev.device)) {
  137. 136                 return PTR_ERR(leddev.device);
  138. 137         }
  139. 138
  140. 139         /* 5、初始化IO */
  141. 140         leddev.node = of_find_node_by_path("/gpioled");
  142. 141         if (leddev.node == NULL){
  143. 142                 printk("gpioled node nost find!\r\n");
  144. 143                 return -EINVAL;
  145. 144         }
  146. 145
  147. 146         leddev.led0 = of_get_named_gpio(leddev.node, "led-gpio", 0);
  148. 147         if (leddev.led0 < 0) {
  149. 148                 printk("can't get led-gpio\r\n");
  150. 149                 return -EINVAL;
  151. 150         }
  152. 151
  153. 152         gpio_request(leddev.led0, "led0");
  154. 153     gpio_direction_output(leddev.led0, 1); /* led0 IO設(shè)置為輸出,默認(rèn)高電平 */
  155. 154         return 0;
  156. 155 }
  157. 156
  158. 157 /*
  159. 158  * @description : platform驅(qū)動(dòng)的remove函數(shù),移除platform
  160. 驅(qū)動(dòng)的時(shí)候此函數(shù)會(huì)執(zhí)行
  161. 159  * @param - dev         : platform設(shè)備
  162. 160  * @return         : 0,成功;其他負(fù)值,失敗
  163. 161  */
  164. 162 static int led_remove(struct platform_device *dev)
  165. 163 {
  166. 164         gpio_set_value(leddev.led0, 1);         /* 卸載驅(qū)動(dòng)的時(shí)候關(guān)閉LED */
  167. 165
  168. 166         cdev_del(&leddev.cdev);                         /*  刪除cdev */
  169. 167         unregister_chrdev_region(leddev.devid, LEDDEV_CNT); /* 注銷設(shè)備號(hào) */
  170. 168         device_destroy(leddev.class, leddev.devid);
  171. 169         class_destroy(leddev.class);
  172. 170         return 0;
  173. 171 }
  174. 172
  175. 173 /* 匹配列表 */
  176. 174 static const struct of_device_id led_of_match[] = {
  177. 175         { .compatible = "gpioled" },
  178. 176         { /* Sentinel */ }
  179. 177 };
  180. 178
  181. 179 /* platform驅(qū)動(dòng)結(jié)構(gòu)體 */
  182. 180 static struct platform_driver led_driver = {
  183. 181         .driver         = {
  184. 182                 .name   = "imx6ul-led",     /* 驅(qū)動(dòng)名字,用于和設(shè)備匹配 */
  185. 183                 .of_match_table = led_of_match, /* 設(shè)備樹匹配表 */
  186. 184         },
  187. 185         .probe          = led_probe,
  188. 186         .remove         = led_remove,
  189. 187 };
  190. 188
  191. 189 /*
  192. 190  * @description : 驅(qū)動(dòng)模塊加載函數(shù)
  193. 191  * @param               : 無
  194. 192  * @return              : 無
  195. 193  */
  196. 194 static int __init leddriver_init(void)
  197. 195 {
  198. 196         return platform_driver_register(&led_driver);
  199. 197 }
  200. 198
  201. 199 /*
  202. 200  * @description : 驅(qū)動(dòng)模塊卸載函數(shù)
  203. 201  * @param               : 無
  204. 202  * @return              : 無
  205. 203  */
  206. 204 static void __exit leddriver_exit(void)
  207. 205 {
  208. 206         platform_driver_unregister(&led_driver);
  209. 207 }
  210. 208
  211. 209 module_init(leddriver_init);
  212. 210 module_exit(leddriver_exit);
  213. 211 MODULE_LICENSE("GPL");
  214. 212 MODULE_AUTHOR("topeet");
復(fù)制代碼

第 174~177 行,匹配表,描述了此驅(qū)動(dòng)都和什么樣的設(shè)備匹配,第 175 行添加了一條值為"gpioled"的 compatible 屬性值,當(dāng)設(shè)備樹中某個(gè)設(shè)備節(jié)點(diǎn)的 compatible 屬性值也為 “gpioled”的時(shí)候就會(huì)與此驅(qū)動(dòng)匹配。
第 180~187 行,platform_driver 驅(qū)動(dòng)結(jié)構(gòu)體,182 行設(shè)置這個(gè) platform 驅(qū)動(dòng)的名字為“imx6ul-led”,因此,當(dāng)驅(qū)動(dòng)加載成功以后就會(huì)在/sys/bus/platform/drivers/目錄下存在一個(gè)名為“imx6u-led”的文件。 第 183 行設(shè)置 of_match_table 為上面的 led_of_match。

3 應(yīng)用測(cè)試程序

應(yīng)用測(cè)試程序直接使用上一章44.3.2的led_test.c即可。


本文地址:http://m.qingdxww.cn/thread-752673-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 利用SAM E54 Xplained Pro評(píng)估工具包演示CAN轉(zhuǎn)USB橋接器以及基于CAN的主機(jī)和自舉程序應(yīng)用程序
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級(jí)模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品网站在线观看不卡无广告 | 欧美性色欧美a在线播放 | 免费jjzz在在线播放国产成人 | 国产成人福利在线视频下载 | 天天摸天天操免费播放小视频 | 国产天堂视频 | 国产大陆亚洲精品国产 | 成年人黄色片 | 国产美女久久精品香蕉69 | 在线亚洲综合 | 午夜欧美性视频在线播放 | 国产日韩欧美亚洲综合 | 在线看片 在线播放 | 在线精品欧美 | 欧美黄色大片免费观看 | 国产精品免费播放 | 在线精品亚洲欧洲第一页 | 四色6677最新永久网站 | 国内久久精品视频 | 国产在线干 | 国产日韩欧美精品一区二区三区 | 99热97| 热久久综合网 | 五月花综合网 | 成人黄色片网站 | 欧美日韩在线播放一区二区三区 | 亚洲手机中文字幕 | 日本成人免费在线观看 | 91av在| 欧美一页| 动漫免费看的网站 | 日本韩国免费 | 在线观看精品国产 | 欧美人在线一区二区三区 | 国产欧美日韩综合精品一区二区 | 一色屋精品视频在线观看 | 欧美视频第一页 | 91午夜精品午夜剧场 | 亚洲人与日本人jjzz | 999成人国产精品 | 日韩一区二区三区免费 |