当前位置: 首页 > news >正文

在线网站建设建议火车头采集器wordpress发布模块

在线网站建设建议,火车头采集器wordpress发布模块,网站开发需要多长时间,wordpress 限时MISC 驱动也叫做杂项驱动#xff0c;也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动。 MISC 驱动其实就是最简单的字符设备驱动#xff0c;通常嵌套在 platform 总线驱动中#xff0c;实现复杂的驱动#xff0c;本章我们就来学习一下 MISC 驱动的编写…MISC 驱动也叫做杂项驱动也就是当我们板子上的某些外设无法进行分类的时候就可以使用 MISC 驱动。 MISC 驱动其实就是最简单的字符设备驱动通常嵌套在 platform 总线驱动中实现复杂的驱动本章我们就来学习一下 MISC 驱动的编写。 MISC 设备驱动简介 所有的 MISC 设备驱动的主设备号都为 10不同的设备使用不同的从设备号。随着 Linux字符设备驱动的不断增加设备号变得越来越紧张尤其是主设备号 MISC 设备驱动就用于解 决此问题。 MISC 设备会自动创建 cdev不需要像我们以前那样手动创建因此采用 MISC 设备驱动可以简化字符设备驱动的编写。我们需要向 Linux 注册一个 miscdevice 设备 miscdevice 是一个结构体定义在文件 include/linux/miscdevice.h 中内容如下 57 struct miscdevice { 58 int minor; /* 子设备号 */ 59 const char *name; /* 设备名字 */ 60 const struct file_operations *fops; /* 设备操作集 */ 61 struct list_head list; 62 struct device *parent; 63 struct device *this_device; 64 const struct attribute_group **groups; 65 const char *nodename; 66 umode_t mode; 67 }; 定义一个 MISC 设备(miscdevice 类型)以后我们需要设置 minor、 name 和 fops 这三个成员变量。 minor 表示子设备号 MISC 设备的主设备号为 10这个是固定的需要用户指定子设备 号 Linux 系统已经预定义了一些 MISC 设备的子设备号这些预定义的子设备号定义在include/linux/miscdevice.h 文件中如下所示 13 #define PSMOUSE_MINOR 1 14 #define MS_BUSMOUSE_MINOR 2 /* unused */ 15 #define ATIXL_BUSMOUSE_MINOR 3 /* unused */ 16 /*#define AMIGAMOUSE_MINOR 4 FIXME OBSOLETE */ 17 #define ATARIMOUSE_MINOR 5 /* unused */ 18 #define SUN_MOUSE_MINOR 6 /* unused */ ...... 52 #define MISC_DYNAMIC_MINOR 255 我们在使用的时候可以从这些预定义的子设备号中挑选一个当然也可以自己定义只要这个子设备号没有被其他设备使用接口。name 就是此 MISC 设备名字当此设备注册成功以后就会在/dev 目录下生成一个名为 name的设备文件。 fops 就是字符设备的操作集合 MISC 设备驱动最终是需要使用用户提供的 fops操作集合。当设置好 miscdevice 以后就需要使用 misc_register 函数向系统中注册一个 MISC 设备此函数原型如下 int misc_register(struct miscdevice * misc) 函数参数和返回值含义如下 misc要注册的 MISC 设备。 返回值 负数失败 0成功。 以前我们需要自己调用一堆的函数去创建设备比如在以前的字符设备驱动中我们会使用 如下几个函数完成设备创建过程 1 alloc_chrdev_region(); /* 申请设备号 */ 2 cdev_init(); /* 初始化 cdev */ 3 cdev_add(); /* 添加 cdev */ 4 class_create(); /* 创建类 */ 5 device_create(); /* 创建设备 */ 现在我们可以直接使用 misc_register 一个函数来完成示上述代码中的这些步骤。当我们卸载设备驱动模块的时候需要调用 misc_deregister 函数来注销掉 MISC 设备函数原型如下 int misc_deregister(struct miscdevice *misc) 函数参数和返回值含义如下 misc要注销的 MISC 设备。 返回值 负数失败 0成功。 以前注销设备驱动的时候我们需要调用一堆的函数去删除此前创建的 cdev、设备等等内容如下所示 1 cdev_del(); /* 删除 cdev */ 2 unregister_chrdev_region(); /* 注销设备号 */ 3 device_destroy(); /* 删除设备 */ 4 class_destroy(); /* 删除类 */ 现在我们只需要一个 misc_deregister 函数即可完成上述代码中的这些工作。关于MISC 设备驱动就讲解到这里接下来我们就使用 platform 加 MISC 驱动框架来编写 beep 蜂鸣器驱动。 实验 驱动代码 #include linux/types.h #include linux/kernel.h #include linux/delay.h #include linux/ide.h #include linux/init.h #include linux/module.h #include linux/errno.h #include linux/gpio.h #include linux/cdev.h #include linux/device.h #include linux/of.h #include linux/of_address.h #include linux/of_gpio.h #include linux/platform_device.h #include linux/miscdevice.h #include asm/mach/map.h #include asm/uaccess.h #include asm/io.h#define MISCBEEP_NAME miscbeep /* 名字 */ #define MISCBEEP_MINOR 144 /* 子设备号 */ #define BEEPOFF 0 /* 关蜂鸣器 */ #define BEEPON 1 /* 开蜂鸣器 *//* miscbeep设备结构体 */ struct miscbeep_dev{dev_t devid; /* 设备号 */struct cdev cdev; /* cdev */struct class *class; /* 类 */struct device *device; /* 设备 */struct device_node *nd; /* 设备节点 */int beep_gpio; /* beep所使用的GPIO编号 */ };struct miscbeep_dev miscbeep; /* beep设备 *//** description : 打开设备* param - inode : 传递给驱动的inode* param - filp : 设备文件file结构体有个叫做private_data的成员变量* 一般在open的时候将private_data指向设备结构体。* return : 0 成功;其他 失败*/ static int miscbeep_open(struct inode *inode, struct file *filp) {filp-private_data miscbeep; /* 设置私有数据 */return 0; }/** description : 向设备写数据 * param - filp : 设备文件表示打开的文件描述符* param - buf : 要写给设备写入的数据* param - cnt : 要写入的数据长度* param - offt : 相对于文件首地址的偏移* return : 写入的字节数如果为负值表示写入失败*/ static ssize_t miscbeep_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt) {int retvalue;unsigned char databuf[1];unsigned char beepstat;struct miscbeep_dev *dev filp-private_data;retvalue copy_from_user(databuf, buf, cnt);if(retvalue 0) {printk(kernel write failed!\r\n);return -EFAULT;}beepstat databuf[0]; /* 获取状态值 */if(beepstat BEEPON) { gpio_set_value(dev-beep_gpio, 0); /* 打开蜂鸣器 */} else if(beepstat BEEPOFF) {gpio_set_value(dev-beep_gpio, 1); /* 关闭蜂鸣器 */}return 0; }/* 设备操作函数 */ static struct file_operations miscbeep_fops {.owner THIS_MODULE,.open miscbeep_open,.write miscbeep_write, };/* MISC设备结构体 */ static struct miscdevice beep_miscdev {.minor MISCBEEP_MINOR,.name MISCBEEP_NAME,.fops miscbeep_fops, };/** description : flatform驱动的probe函数当驱动与* 设备匹配以后此函数就会执行* param - dev : platform设备* return : 0成功;其他负值,失败*/ static int miscbeep_probe(struct platform_device *dev) {int ret 0;printk(beep driver and device was matched!\r\n);/* 设置BEEP所使用的GPIO *//* 1、获取设备节点beep */miscbeep.nd of_find_node_by_path(/beep);if(miscbeep.nd NULL) {printk(beep node not find!\r\n);return -EINVAL;} /* 2、 获取设备树中的gpio属性得到BEEP所使用的BEEP编号 */miscbeep.beep_gpio of_get_named_gpio(miscbeep.nd, beep-gpio, 0);if(miscbeep.beep_gpio 0) {printk(cant get beep-gpio);return -EINVAL;}/* 3、设置GPIO5_IO01为输出并且输出高电平默认关闭BEEP */ret gpio_direction_output(miscbeep.beep_gpio, 1);if(ret 0) {printk(cant set gpio!\r\n);}/* 一般情况下会注册对应的字符设备但是这里我们使用MISC设备* 所以我们不需要自己注册字符设备驱动只需要注册misc设备驱动即可*/ret misc_register(beep_miscdev);if(ret 0){printk(misc device register failed!\r\n);return -EFAULT;}return 0; }/** description : platform驱动的remove函数移除platform驱动的时候此函数会执行* param - dev : platform设备* return : 0成功;其他负值,失败*/ static int miscbeep_remove(struct platform_device *dev) {/* 注销设备的时候关闭LED灯 */gpio_set_value(miscbeep.beep_gpio, 1);/* 注销misc设备 */misc_deregister(beep_miscdev);return 0; }/* 匹配列表 */static const struct of_device_id beep_of_match[] {{ .compatible atkalpha-beep },{ /* Sentinel */ }};/* platform驱动结构体 */ static struct platform_driver beep_driver {.driver {.name imx6ul-beep, /* 驱动名字用于和设备匹配 */.of_match_table beep_of_match, /* 设备树匹配表 */},.probe miscbeep_probe,.remove miscbeep_remove, };/** description : 驱动出口函数* param : 无* return : 无*/ static int __init miscbeep_init(void) {return platform_driver_register(beep_driver); }/** description : 驱动出口函数* param : 无* return : 无*/ static void __exit miscbeep_exit(void) {platform_driver_unregister(beep_driver); }module_init(miscbeep_init); module_exit(miscbeep_exit); MODULE_LICENSE(GPL);应用代码 #include stdio.h #include unistd.h #include sys/types.h #include sys/stat.h #include fcntl.h #include stdlib.h #include string.h#define BEEPOFF 0 #define BEEPON 1/** description : main主程序* param - argc : argv数组元素个数* param - argv : 具体参数* return : 0 成功;其他 失败*/ int main(int argc, char *argv[]) {int fd, retvalue;char *filename;unsigned char databuf[1];if(argc ! 3){printf(Error Usage!\r\n);return -1;}filename argv[1];fd open(filename, O_RDWR); /* 打开beep驱动 */if(fd 0){printf(file %s open failed!\r\n, argv[1]);return -1;}databuf[0] atoi(argv[2]); /* 要执行的操作打开或关闭 */retvalue write(fd, databuf, sizeof(databuf));if(retvalue 0){printf(BEEP Control Failed!\r\n);close(fd);return -1;}retvalue close(fd); /* 关闭文件 */if(retvalue 0){printf(file %s close failed!\r\n, argv[1]);return -1;}return 0; }测试 将上一小节编译出来 miscbeep.ko 和 miscbeepApp 这两个文件拷贝到rootfs/lib/modules/4.1.15 目录中重启开发板进入到目录 lib/modules/4.1.15 中输入如下命令加载 miscbeep.ko 这个驱动模块。 depmod //第一次加载驱动的时候需要运行此命令 modprobe miscbeep.ko //加载设备模块 当驱动模块加载成功以后我们可以在/sys/class/misc 这个目录下看到一个名为“miscbeep”的子目录如图所示 所有的 misc 设备都属于同一个类 /sys/class/misc 目录下就是 misc 这个类的所有设备每个设备对应一个子目录。驱动与设备匹配成功以后就会生成/dev/miscbeep 这个设备驱动文件输入如下命令查看这个文件的主次设备号 ls /dev/miscbeep -l 从图中可以看出 /dev/miscbeep 这个设备的主设备号为 10次设备号为 144和我们驱动程序里面设置的一致。输入如下命令打开 BEEP ./miscbeepApp /dev/miscbeep 1 //打开 BEEP 在输入如下命令关闭 beep ./miscbeepApp /dev/miscbeep 0 //关闭 BEEP 观察一下 BEEP 能否打开和关闭如果可以的话就说明驱动工作正常如果要卸载驱动的话输入如下命令即可 rmmod miscbeep.ko
http://www.zqtcl.cn/news/927371/

相关文章:

  • 自己做的网站被攻击了企业展厅方案设计公司
  • 可信赖的郑州网站建设公司网站怎样实名认证
  • 创建一个网站的步骤是中国机械加工网招聘信息
  • 做电影解析网站烟台网站建设外贸
  • 做网站 网上接单汽车网站开发流程
  • 2017网站开发发展前景主页网站建设
  • 苏州手机网站建设费用上海企业制作网站
  • 网站上怎样做轮播图网站后台乱码怎么办
  • 专业网站建设品牌策划商务网站建设与维护考试
  • 网站开发手机版WordPress如何清空评论
  • 公司怎么建立网站吗010网站建设
  • 网站制作找哪家公司好湖北专业网站建设大全
  • 广州建设网站是什么关系wordpress 插件位置
  • 网站建设工作室 怎么样做一个网站需要多少钱
  • 北京网站制作人才免费企业网站源码
  • 微信商城网站怎么做网站备案是先做网站还是做完了备案
  • 工商局网站查询入口wordpress 文章列表顺序
  • 可以做平面设计兼职的网站模板商城建站
  • 织梦网站如何做301跳转畅销营销型网站建设电话
  • 新网企业邮箱保定seo
  • 河南国控建设集团招标网站网上注册公司核名流程
  • 推推蛙网站建设云南网站开发费用
  • 网站没服务器行吗价格低廉怎么换个说法
  • 用wordpress编写网站完整网站开发视频教程
  • 电商型网站建设价格ppt制作网站
  • 东莞做个网站查询工商营业执照
  • 从网址怎么看网站的域名租用云服务器多少钱
  • 网站开发技术有个人网页首页设计图片
  • 一站式网站建设平台做电商网站需要做什么准备
  • 网站开发小程序快站模板