目录
作业要求:
作业答案:
代码效果:
编辑
应用程序代码:
设备树配置:
作业要求:
通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试,发布到CSDN
作业答案:
代码效果:
Platform总线驱动代码:
#include #include #include #include #include #include //主设备号 int major; //用于上传目录和设备节点信息 struct class *cls; struct device *device; // led设备号 struct gpio_desc *gpiono1; struct gpio_desc *gpiono2; struct gpio_desc *gpiono3; // 创建功能码 #define LED_ON _IOW('l', 1, int) #define LED_OFF _IOW('l', 0, int) // ioctl函数,用于控制led设备 long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { switch (cmd) { case LED_ON: switch (arg) { case 1: gpiod_set_value(gpiono1, 1); break; case 2: gpiod_set_value(gpiono2, 1); break; case 3: gpiod_set_value(gpiono3, 1); break; } break; case LED_OFF: switch (arg) { case 1: gpiod_set_value(gpiono1, 0); break; case 2: gpiod_set_value(gpiono2, 0); break; case 3: gpiod_set_value(gpiono3, 0); break; } break; } return 0; } // 定义操作方法结构体变量并赋值 struct file_operations fops = { .unlocked_ioctl = mycdev_ioctl, }; // 封装probe函数,当设备和驱动匹配成功之后执行 int pdrv_probe(struct platform_device *dev) { printk("%s:%s:%d\n", __FILE__, __func__, __LINE__); // 字符设备驱动注册 major = register_chrdev(0, "mychrdev", &fops); if (major dev.of_node, "led1-gpio", 0, GPIOD_OUT_LOW, NULL); if (gpiono1 == NULL) { printk("解析led1对应gpio编号失败\n"); return -ENXIO; } printk("解析led1对应gpio编号成功\n"); // 解析LED1的gpio编号 gpiono2 = gpiod_get_from_of_node(dev->dev.of_node, "led2-gpio", 0, GPIOD_OUT_LOW, NULL); if (gpiono2 == NULL) { printk("解析led2对应gpio编号失败\n"); return -ENXIO; } printk("解析led2对应gpio编号成功\n"); // 解析LED1的gpio编号 gpiono3 = gpiod_get_from_of_node(dev->dev.of_node, "led3-gpio", 0, GPIOD_OUT_LOW, NULL); if (gpiono3 == NULL) { printk("解析led3对应gpio编号失败\n"); return -ENXIO; } printk("解析led3对应gpio编号成功\n"); return 0; } // 封装remove函数,用于驱动和设备卸载时执行 int pdrv_remove(struct platform_device *dev) { // 销毁设备节点信息 device_destroy(cls, MKDEV(major, 0)); // 销毁设备节点信息 int i; for (i = 0; i应用程序代码:
#include #include #include #include #include #include #include #include //创建功能码 #define LED_ON _IOW('l',1,int) #define LED_OFF _IOW('l',0,int) int main(int argc, char const *argv[]) { int a,b; int fd=open("/dev/myled0",O_RDWR); if(fd