迅为i.MX6ULL终结者设备树下的Platform驱动实验程序编写_第1页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、迅为i.mx6ull终结者设备树下的platform驱动实验程序编写1 修改设备树文件设备树文件可以挺直用法第三十五章中添加的gpioled子节点即可,不用重复添加。2 platform驱动程序本试验例程路径:i.mx6ul终结者光盘资料/06_驱动例程/15_gpioled_dts创建led_driver.c文件,详细内容如下: 1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 include 10 include 11 include 12 include 13 include

2、 14 include 15 include 16 include 17 include 18 include 19 include 20 include dev_cnt 1 /* 设备号长度 */ 25 define leddev_name "dtsplatled" /* 设备名字 */ 26 define ledoff 0 27 define ledon 1 28 29 /* leddev设备结构体 */ 30 struct leddev_dev 31 dev_t devid; /* 设备号 */ 32 struct cdev cdev; /* cdev */ 33 s

3、truct class *class; /* 类 */ 34 struct device *device; /* 设备 */ 35 int major; /* 主设备号 */ 36 struct device_node *node; /* led设备节点 */ 37 int led0; /* led灯gpio标号 */ 38 ; 39 40 struct leddev_dev leddev; /* led设备 */ 41 42 /* 43 * description : led打开/关闭 44 * param - sta : ledon(0) 打开led,ledoff(1) 关闭led 45

4、* return : 无 46 */ 47 void led0_switch(u8 sta) 48 49 if (sta = ledon ) 50 gpio_set_value(leddev.led0, 0); 51 else if (sta = ledoff) 52 gpio_set_value(leddev.led0, 1); 53 54 55 /* 56 * description : 打开设备 57 * param - inode : 传递给驱动的inode 58 * param - filp : 设备文件,file结构体有个叫做private_data的成员变量 59 * 普通在op

5、en的时候将private_data指向设备结构体。 60 * return : 0 胜利;其他 失败 61 */ 62 static int led_open(struct inode *inode, struct file *filp) 63 64 filp->private_data = /* 设置私有数据 */ 65 return 0; 66 67 68 /* 69 * description : 向设备写数据 70 * param - filp : 设备文件,表示打开的文件描述符 71 * param - buf : 要写给设备写入的数据 72 * param - cnt :

6、要写入的数据长度 73 * param - offt : 相对于文件首地址的偏移 74 * return : 写入的字节数,假如为负值,表示写入失败 75 */ 76 static ssize_t led_write(struct file *filp, const char _user *buf, size_t cnt, loff_t *offt) 77 78 int retvalue; 79 unsigned char databuf2; 80 unsigned char ledstat; 81 82 retvalue = copy_from_user(databuf, buf, cnt)

7、; 83 if(retvalue 84 85 printk("kernel write failed!rn"); 86 return -efault; 87 88 89 ledstat = databuf0; 90 if (ledstat = ledon) 91 led0_switch(ledon); 92 else if (ledstat = ledoff) 93 led0_switch(ledoff); 94 95 return 0; 96 97 98 /* 设备操作函数 */ 99 static struct file_operations led_fops = 10

8、0 .owner = this_module,101 .open = led_open,102 .write = led_write,103 ;104105 /*106 * description : flatform驱动的probe函数,当驱动与107 * 设备匹配以后此函数就会执行108 * param - dev : platform设备109 * return : 0,胜利;其他负值,失败110 */111 static int led_probe(struct platform_device *dev)112 113 printk("led driver and devic

9、e was matched!rn");114 /* 1、设置设备号 */115 if (leddev.major) 116 leddev.devid = mkdev(leddev.major, 0);117 register_chrdev_region(leddev.devid, leddev_cnt, leddev_name);118 else 119 alloc_chrdev_region(&leddev.devid, 0, leddev_cnt, leddev_name);120 leddev.major = major(leddev.devid);121 122123

10、 /* 2、注册设备 */124 cdev_init(&leddev.cdev, &led_fops);125 cdev_add(&leddev.cdev, leddev.devid, leddev_cnt);126127 /* 3、创建类 */128 leddev.class = class_create(this_module, leddev_name);129 if (is_err(leddev.class) 130 return ptr_err(leddev.class);131 132133 /* 4、创建设备 */134 leddev.device = de

11、vice_create(leddev.class, null, leddev.devid,null, leddev_name);135 if (is_err(leddev.device) 136 return ptr_err(leddev.device);137 138139 /* 5、初始化io */140 leddev.node = of_find_node_by_path("/gpioled");141 if (leddev.node = null)142 printk("gpioled node nost find!rn");143 return

12、 -einval;144 145146 leddev.led0 = of_get_named_gpio(leddev.node, "led-gpio", 0);147 if (leddev.led0 148 printk("can't get led-gpiorn");149 return -einval;150 151152 gpio_request(leddev.led0, "led0");153 gpio_direction_output(leddev.led0, 1); /* led0 io设置为输出,默认高电平 */

13、154 return 0;155 156157 /*158 * description : platform驱动的remove函数,移除platform驱动的时候此函数会执行159 * param - dev : platform设备160 * return : 0,胜利;其他负值,失败161 */162 static int led_remove(struct platform_device *dev)163 164 gpio_set_value(leddev.led0, 1); /* 卸载驱动的时候关闭led */165166 cdev_del(&leddev.cdev); /*

14、删除cdev */167 unregister_chrdev_region(leddev.devid, leddev_cnt); /* 注销设备号 */168 device_destroy(leddev.class, leddev.devid);169 class_destroy(leddev.class);170 return 0;171 172173 /* 匹配列表 */174 static const struct of_device_id led_of_match = 175 .compatible = "gpioled" ,176 /* sentinel */ 1

15、77 ;178179 /* platform驱动结构体 */180 static struct platform_driver led_driver = 181 .driver = 182 .name = "imx6ul-led", /* 驱动名字,用于和设备匹配 */183 .of_match_table = led_of_match, /* 设备树匹配表 */184 ,185 .probe = led_probe,186 .remove = led_remove,187 ;188189 /*190 * description : 驱动模块加载函数191 * param

16、: 无192 * return : 无193 */194 static int _init leddriver_init(void)195 196 return platform_driver_register(&led_driver);197 198199 /*200 * description : 驱动模块卸载函数201 * param : 无202 * return : 无203 */204 static void _exit leddriver_exit(void)205 206 platform_driver_unregister(&led_driver);207 208209 module_init(leddriver_init);210 module_exit(leddriver_exit);211 module_license("gpl");212 module_author("topeet");复制代码第 174177 行,匹配表,描述了此驱动都和什么样的设备匹配,第 175 行添加了一条值为"gpioled"的 compatible 属性值,当设备树中某个设备节点的 compa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论