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

都昌县建设局网站h5建设网站公司

都昌县建设局网站,h5建设网站公司,php网站开发教程,淘宝 wordpress作业#xff1a;通过platform总线驱动实现 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变#xff08;按键中断#xff09; 例如number0 按下按键number1 ,再次按下按键number0 d.在按下按键的时候需要同时…作业通过platform总线驱动实现 a.应用程序通过阻塞的io模型来读取number变量的值 b.number是内核驱动中的一个变量 c.number的值随着按键按下而改变按键中断 例如number0 按下按键number1 ,再次按下按键number0 d.在按下按键的时候需要同时将led1的状态取反 e.驱动中需要编写字符设备驱动 f.驱动中需要自动创建设备节点 g.这个驱动需要的所有设备信息放在设备树的同一个节点中 驱动程序my_platform.c #include linux/init.h #include linux/module.h #include linux/cdev.h #include linux/fs.h #include linux/device.h #include linux/uaccess.h #include linux/slab.h #include linux/platform_device.h #include linux/mod_devicetable.h #include linux/of_gpio.h #include linux/of.h #include linux/of_irq.h #include linux/interrupt.h #include linux/wait.hstruct cdev *cdev; unsigned int major 0; unsigned int minor 0; dev_t devno; module_param(major, uint, 0664); //方便命令行传递major的值 struct class *cls; struct device *dev; struct resource *res; unsigned int irqno; struct gpio_desc *gpiono; wait_queue_head_t wq_head; //定义一个等待队列头 unsigned int number 0; unsigned int condition 0;//定义中断处理函数 irqreturn_t key_handler(int irq, void *dev) {gpiod_set_value(gpiono, !gpiod_get_value(gpiono));if (number 0){number 1;condition 1;wake_up_interruptible(wq_head);}else{number 0;condition 1;wake_up_interruptible(wq_head);}return IRQ_HANDLED; }//封装操作方法 int mycdev_open(struct inode *inode, struct file *file) {printk(%s:%s:%d\n, __FILE__, __func__, __LINE__);return 0; }ssize_t mycdev_read(struct file *file, char *ubuf, size_t size, loff_t *lof) {int ret;//判断IO方式if (file-f_flags O_NONBLOCK) //非阻塞{}else{ //阻塞wait_event_interruptible(wq_head, condition); //先检查condition再将进程休眠}ret copy_to_user(ubuf, number, size);if (ret){printk(copy_to_user err\n);return -EIO;}condition 0; //下一次硬件数据没有就绪return 0; }ssize_t mycdev_write(struct file *file, const char *ubuf, size_t size, loff_t *lof) {return 0; }int mycdev_close(struct inode *inode, struct file *file) {printk(%s:%s:%d\n, __FILE__, __func__, __LINE__);return 0; }//定义一个操作方法结构体对象并初始化 struct file_operations fops {.open mycdev_open,.read mycdev_read,.write mycdev_write,.release mycdev_close, };//封装probe函数 int pdrv_probe(struct platform_device *pdev) {//初始化等待队列init_waitqueue_head(wq_head);int ret;//1.为字符设备驱动对象申请空间cdev cdev_alloc();if (cdev NULL){printk(申请字符设备驱动对象空间失败\n);ret -EFAULT;goto out1;}printk(申请字符设备驱动对象空间成功\n);//2.初始化字符设备驱动对象cdev_init(cdev, fops);printk(初始化字符设备驱动对象成功\n);//3.申请设备号if (major 0) //静态指定设备号{ret register_chrdev_region(MKDEV(major, minor), 3, myled);if (ret){printk(静态申请设备号失败\n);goto out2;}}else if (major 0){ //动态申请设备号ret alloc_chrdev_region(devno, minor, 3, myled);if (ret){printk(动态申请设备号失败\n);goto out2;}major MAJOR(devno); //获取主设备号minor MINOR(devno); //获取次设备号}printk(申请设备号成功\n);//4.注册字符设备驱动对象ret cdev_add(cdev, MKDEV(major, minor), 3);if (ret){printk(注册字符设备驱动对象失败\n);goto out3;}printk(注册字符设备驱动对象成功\n);//向上提交目录信息cls class_create(THIS_MODULE, myled);if (IS_ERR(cls)){printk(向上提交目录失败\n);ret -PTR_ERR(cls);goto out4;}printk(向上提交目录成功\n);//向上提交设备节点信息int i;for (i 0; i 3; i){dev device_create(cls, NULL, MKDEV(major, i), NULL, myled%d, i);if (IS_ERR(dev)){printk(向上提交设备节点信息失败\n);ret -PTR_ERR(dev);goto out5;}}printk(向上提交设备信息成功\n);//platform//获取MEM类型的资源res platform_get_resource(pdev, IORESOURCE_MEM, 0);if (res NULL){printk(获取MEM类型资源失败\n);return -ENXIO;}//获取中断类型的资源irqno platform_get_irq(pdev, 0);if (irqno 0){printk(获取中断类型资源失败\n);return -ENXIO;}//设备树匹配成功后设备树结点指针可以通过pdev-dev.of_node获取//基于设备树节点信息获取gpio_desc对象指针gpiono gpiod_get_from_of_node(pdev-dev.of_node, led1-gpio, 0, GPIOD_OUT_LOW, NULL);if (IS_ERR(gpiono)){printk(解析GPIO管脚信息失败\n);return -ENXIO;}printk(解析GPIO管脚信息成功\n);//注册按键中断ret request_irq(irqno, key_handler, IRQF_TRIGGER_FALLING, key_init, NULL);if (ret 0){printk(注册按键%d中断失败\n, i);return ret;}printk(注册按键中断成功\n);return 0;out5://释放前一次提交成功的设备信息for (--i; i 0; i--){device_destroy(cls, MKDEV(major, i));}class_destroy(cls); //释放目录 out4://注销字符设备驱动对象cdev_del(cdev); out3://释放设备号unregister_chrdev_region(MKDEV(major, minor), 3); out2://释放设备驱动对象空间kfree(cdev); out1:return ret; }//封装remove函数 int pdrv_remove(struct platform_device *pdev) {//注销中断free_irq(irqno, NULL);//释放GPIO信息gpiod_put(gpiono);int i;//释放设备节点信息for (i 0; i 3; i){device_destroy(cls, MKDEV(major, i));}//销毁目录class_destroy(cls);//注销字符设备驱动对象cdev_del(cdev);//释放设备号unregister_chrdev_region(MKDEV(major, minor), 3);//释放设备驱动对象空间kfree(cdev);return 0; }//构建设备树匹配表 struct of_device_id oftable[] {{.compatible hqyj,myplatform},{}, //防止数组越界 };//定义platform驱动信息对象并初始化 struct platform_driver pdrv {.probe pdrv_probe,.remove pdrv_remove,.driver {.name bbbbb,.of_match_table oftable, //用于设备树匹配}, };//一键注册platform宏 module_platform_driver(pdrv); MODULE_LICENSE(GPL); 应用程序test.c #include stdio.h #include sys/types.h #include sys/stat.h #include fcntl.h #include unistd.h #include stdlib.h #include string.h #include sys/ioctl.h int main(){unsigned int number;int fd open(/dev/myled0, O_RDWR);if(fd 0){printf(设备文件打开失败\n);exit(-1);}while(1){read(fd, number, sizeof(number));printf(number %d\n, number);}close(fd);return 0; }实验现象
http://www.w-s-a.com/news/333247/

相关文章:

  • 唐河企业网站制作怎么样抖音seo排名软件哪个好
  • 做棋牌网站团队wordpress无限加载
  • 思创医惠网站建设微网站是手机网站吗
  • 宁波海曙网站建设市场营销管理
  • 网站被降权了怎么办做网站网页维护手机App开发
  • 营销型网站建设熊掌号tomcat 网站开发
  • 东莞网站建设seo广州 flash 网站
  • js网站评论框租房网站那些地图区域统计怎么做的
  • 企业门户网站平台建设招标采购文件长沙做网站找哪家好
  • 关于实验室建设的英文网站图文分销系统开发
  • wordpress 媒体库管理自己的网站什么做优化
  • 网站建设基本流程价格厦门seo网站推广
  • 辽宁响应式网站建设价格企业所得税率
  • 网站编辑及seo招聘上海做网站公司做网站的公司
  • 杭州四喜做网站建设么ja.wordpress.org
  • 旅游网站策划书企业公司名字大全
  • 营销型网站的标准郑州新密网站建设
  • 建设网站的公司管理公司网站设计
  • 手机网站有什么区别是什么意思不让网站开发公司进入后台
  • 网站正在建设中_敬请期待做宠物店网站
  • 个体营业执照可以做网站服务吗宣传品牌网站建设
  • 做平台是做网站和微信小程序的好别邯郸捕风科技有限公司
  • 公司做哪个网站比较好巴顿品牌设计官网
  • 济宁北湖建设局网站我要推广
  • mc网站的建设大型网站开发
  • 给网站做推广一般花多少钱全国最大的外发加工网
  • linux 网站301江西seo推广方案
  • c2c电子商务网站定制开发wordpress html单页
  • 查询网站空间商自己做的网站如何放到微信
  • 现在网站开发哪个语言好月嫂公司网站建设构思