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

网站设计需要什么证烟台网站建设工作

网站设计需要什么证,烟台网站建设工作,wordpress仿导航大全,外贸网站建设深圳前言 #xff08;1#xff09;在学习完Linux驱动入门#xff08;6#xff09;LED驱动—设备树之后#xff0c;我们发现一个问题#xff0c;设备树明明的gpios信息明明有三个元素gpios gpio5 3 GPIO_ACTIVE_LOW; gpio5 3 用来确定控制那个引脚#xf…前言 1在学习完Linux驱动入门6LED驱动—设备树之后我们发现一个问题设备树明明的gpios信息明明有三个元素gpios gpio5 3 GPIO_ACTIVE_LOW; gpio5 3 用来确定控制那个引脚而GPIO_ACTIVE_LOW究竟有什么用呢 2通过前面的实验我们发现GPIO_ACTIVE_LOW似乎是没有使用上的。那么写上这个有什么用呢 3Linux设备树中既然设置了这个元素那么肯定是有意义的。接下来我将讲解Linux中逻辑电平和物理电平之间的关系。 逻辑电平的意义 为什么需要逻辑电平 1在前面的代码里面我们发现如果这个LED驱动硬件发生了改动比如GND和VCC位置调整一下代码就要进行比较多的改动。因为Linux的代码很多很容易漏掉某个地方导致硬件上的小改动明明写好的软件又要做很多工作调试检查。 2Linux要与硬件进行强隔离所以提出了逻辑电平的概念。 逻辑电平和物理电平的关系 1物理电平就是真实的电压值物理电平1是指真实的高电平。例如TTL标准中如果引脚接受到的是3.3V那么就是1。如果引脚接受到的是0V那么就是0。 2逻辑电平就是抽象出来的逻辑状态逻辑电平的1是指有效电平。例如上面左边的图按键被按下引脚为低电平因此低电平是有效电平对于这个按键的逻辑电平来说1就是低电平。而右边这张图相反。 引入逻辑电平的好处 1引入逻辑电平之后如果硬件只是有效电平发生了改变驱动程序上就不再需要改动了。我们只需要将设备树中的gpios gpio5 3 GPIO_ACTIVE_LOW;改成gpios gpio5 3 GPIO_ACTIVE_HIGH;即可。 2这样做能够实现软件和硬件上的强隔离作用让同一个驱动程序对于各种类似的硬件上有更高适配能力。 编程中与上文的区别 1在讲解Linux驱动入门4LED驱动的时候我提及了几个GPIO子系统函数进行了讲解介绍。而本文需要讲解的函数其本质上也不过是这个几个函数的微调底层调用的函数大差不差感兴趣的可以自行阅读源码。既然只是微调为什么不把老版本的删了这当然是为了兼容老版本代码所以没有删除他们。 of_get_gpio_flags()获取GPIO信息 函数介绍 1在上文中我们获取gpio引脚号是调用的of_get_gpio()这个函数而本文是使用的of_get_gpio_flags()函数。 2如果阅读源码会发现of_get_gpio()就是调用的of_get_gpio_flags()函数不过第三个参数是传入的一个空指针并没有获取有效电平信息。 /* 作用 从设备树中获取GPIO引脚的标志信息的函数* 传入参数 * np 设备节点* index 节点中的索引* flags 存储有效电平的信息* 返回值 GPIO的引脚号 */ int of_get_gpio_flags(struct device_node *np, int index, enum of_gpio_flags *flags) 原来获取GPIO信息 gpios[i].gpio of_get_gpio(np, i); //获得gpio信息现在获取GPIO信息 gpios[i].gpio of_get_gpio_flags(np, i, flag);devm_gpio_request_one()设置引脚初始化 函数介绍 1在上文中我们是调用gpio_request()函数申请到GPIO然后使用gpio_direction_output()函数将引脚设置成输出。 2现在这里只需要调用一个devm_gpio_request_one()函数即可。 3虽然这里调用的函数少了但是需要进行的操作也变多了。 /* 作用 从设备树中获取GPIO引脚的标志信息的函数* 传入参数 * dev 要申请GPIO的设备* gpio 引脚号* flags 有效电平引脚的输入输出方向默认输出电平物理电平信息* label 注册GPIO时候的名字* 返回值 如果返回值小于0表示申请失败 */ int devm_gpio_request_one(struct device *dev, unsigned gpio,unsigned long flags, const char *label)原来设置GPIO /*------------GPIO设置成默认低电平输出------------*/ //申请指定GPIO引脚申请的时候需要用到名字 err gpio_request(gpios[i].gpio, gpios[i].name); //如果返回值小于0表示申请失败 if (err 0) {//如果GPIO申请失败打印出是哪个LED申请出现问题printk(can not request gpio %s \n, gpios[i].name);return -ENODEV; } //如果GPIO申请成功设置输出低电平 gpio_direction_output(gpios[i].gpio, 0); /*------------GPIO设置成默认高电平输出------------*/ //申请指定GPIO引脚申请的时候需要用到名字 err gpio_request(gpios[i].gpio, gpios[i].name); //如果返回值小于0表示申请失败 if (err 0) {//如果GPIO申请失败打印出是哪个LED申请出现问题printk(can not request gpio %s \n, gpios[i].name);return -ENODEV; } //如果GPIO申请成功设置输出高电平 gpio_direction_output(gpios[i].gpio, 1); /*------------GPIO设置成输入------------*/ //申请指定GPIO引脚申请的时候需要用到名字 err gpio_request(gpios[i].gpio, gpios[i].name); //如果返回值小于0表示申请失败 if (err 0) {//如果GPIO申请失败打印出是哪个LED申请出现问题printk(can not request gpio %s \n, gpios[i].name);return -ENODEV; } //如果GPIO申请成功设置为输入引脚 gpio_direction_input(gpios[i].gpio);现在设置GPIO /*------------GPIO设置成默认低电平输出注意这里是物理电平------------*/ gpios[i].flag GPIOF_OUT_INIT_LOW; //将GPIO设置成默认低电平输出注意这里是物理电平 if (flag OF_GPIO_ACTIVE_LOW) //判断有效电平是否为低电平 {gpios[i].flag | GPIOF_ACTIVE_LOW; } printk(gpios[%d].flag is %d \r\n,i,gpios[i].flag); err devm_gpio_request_one(pdev-dev, gpios[i].gpio, gpios[i].flag, gpios[i].name); //如果返回值小于0表示申请失败 if (err 0) {//如果GPIO申请失败打印出是哪个LED申请出现问题printk(can not request gpio %s \n, gpios[i].name);return -ENODEV; } /*------------GPIO设置成默认高电平输出注意这里是物理电平------------*/ gpios[i].flag GPIOF_OUT_INIT_HIGH; //将GPIO设置成默认高电平输出注意这里是物理电平 if (flag OF_GPIO_ACTIVE_LOW) //判断有效电平是否为低电平 {gpios[i].flag | GPIOF_ACTIVE_LOW; } printk(gpios[%d].flag is %d \r\n,i,gpios[i].flag); err devm_gpio_request_one(pdev-dev, gpios[i].gpio, gpios[i].flag, gpios[i].name); //如果返回值小于0表示申请失败 if (err 0) {//如果GPIO申请失败打印出是哪个LED申请出现问题printk(can not request gpio %s \n, gpios[i].name);return -ENODEV; } /*------------GPIO设置成输入------------*/ gpios[i].flag GPIOF_IN; //将引脚设置成输入方向 if (flag OF_GPIO_ACTIVE_LOW) //判断有效电平是否为低电平 {gpios[i].flag | GPIOF_ACTIVE_LOW; } printk(gpios[%d].flag is %d \r\n,i,gpios[i].flag); err devm_gpio_request_one(pdev-dev, gpios[i].gpio, gpios[i].flag, gpios[i].name); //如果返回值小于0表示申请失败 if (err 0) {//如果GPIO申请失败打印出是哪个LED申请出现问题printk(can not request gpio %s \n, gpios[i].name);return -ENODEV; }gpiod_set_value()设置引脚输出电平逻辑电平 函数介绍 1上文我们调用gpio_set_value()函数是设置的物理电平而本文将会使用gpiod_set_value()函数设置逻辑电平。 2感兴趣的朋友可以看看gpio_set_value()函数和gpiod_set_value()函数的底层实现我们会发现他们都调用了gpiod_set_raw_value()函数。只不过gpio_set_value()是直接将自己的参数传递进去而gpiod_set_value()函数会判断有效电平信息然后根据有效电平信息翻转Value值。 3这里需要注意的一点是gpiod_set_value()函数第一参数传入的是gpio_desc结构体类型指针而gpio_set_value()传入的是引脚号。我们可以调用gpio_to_desc()函数利用引脚号获得gpio_desc结构体类型指针。 原来设置GPIO输出电平物理电平 /* gpios[(int)tmp_buf[0]].gpio是引脚号* tmp_buf[1]是要设置的物理电平信息 */ gpio_set_value(gpios[(int)tmp_buf[0]].gpio, tmp_buf[1]);现在设置GPIO输出电平逻辑电平 1因为gpiod_set_value()函数第一个参数需要传入的是一个gpio_desc结构体。所以我在probe函数中获取并且存入gpios结构体中。 2这里需要注意了我们现在设置的是逻辑电平了。如果你的LED需要低电平点亮你在设备树中设置了有效电平是低电平。那么现在gpiod_set_value()函数传入的第二个值如果是1输出的其实是低电平 /*---- 在probe函数中我们使用了gpio_to_desc函数获得gpio_desc结构体 */ gpios[i].gpiod gpio_to_desc(gpios[i].gpio); /*---- 下面这段是在驱动程序中write函数中修改 */ /* gpios[(int)tmp_buf[0]].gpio是引脚号* tmp_buf[1]是要设置的物理电平信息 */ gpiod_set_value(gpios[(int)tmp_buf[0]].gpiod, tmp_buf[1]);需要注意gpio_desc结构体无法被访问 1这里有一个注意的点gpio_desc结构体是Linux内核结构体。他与我们所编写的C文件编译环境是隔离的。所以我们没有访问gpio_desc结构体权限。这个问题卡了我很久望各位了解。 2如果有头铁的兄弟说哎我就是牛逼我就要访问怎么滴可以的我也给头铁的兄弟们提供思路。 // 在对于的内核文件中写入下面这个宏然后重新编译Linux内核。 EXPORT_SYMBOL(gpio_to_desc); gpiod_get_value()获得引脚电平逻辑电平 函数介绍 1同样的道理我们阅读gpiod_get_value()和gpio_get_value()函数源码会发现他们都会调用gpiod_get_raw_value()函数获取真实的物理电平。 2但是gpiod_get_value()会根据设备树中设置的有效电平翻转gpiod_get_raw_value()函数返回值。而gpio_get_value()函数则是直接将gpiod_get_raw_value()函数返回值输出。 3因此gpiod_get_value()返回的是逻辑电平gpio_get_value()返回的是物理电平。 原来获取GPIO电平物理电平 tmp_buf[1] gpio_get_value(gpios[(int)tmp_buf[0]].gpio);现在获取GPIO电平逻辑电平 1同输出电平一样如果设备树中LED驱动设置的有效电平是低电平。那么我们调用gpiod_get_value()函数发现LED的物理电平是高电平的时候他返回的却是0 tmp_buf[1] gpiod_get_value(gpios[(int)tmp_buf[0]].gpiod);总结 1将逻辑电平和物理电平隔离之后驱动文件不再需要修改。如果硬件产生了更换也只需要修改设备树。 2编写应用程序的程序员也不需要管LED点亮到底是高电平还是低电平在他眼里输入1就是点亮输入0就是熄灭。
http://www.hkea.cn/news/14296444/

相关文章:

  • 企业只有建立自己的网站平台seo网络优化师就业前景
  • 国内做网站的龙头企业做外贸网站选择服务器
  • 网站开发合同注意事件有哪些页面设计文档
  • 源码网站有哪些2022年网络热点事件舆情案例
  • 沂南县建设局网站沙井商城网站建设
  • 鹿城做网站hicloudcom云服务首页
  • 肥西网站建设手机购物网站 建站
  • 光明做网站wordpress修改登录界面
  • 前端个人网站模板明星做代言的购物网站0
  • 做知识问答的网站哈尔滨网页设计推广
  • joomla 2.5:你的网站建设_使用与管理网站打开慢原因
  • 百度站长快速收录绵阳欣诚建设
  • wordpress如何评论苏州关键词优化排名推广
  • 衡水提供网站制作公司哪家专业网络公司名称大全
  • 新的购物网站怎么做流量分析大同市建设工程招标投标网站
  • 石家庄网站建设登录怎么在.Net中做团购网站
  • 小公司做网站赚钱吗帮人负责做网站叫什么工作
  • 北京网站搭建费用温州企业网站制作
  • 做网站时为什么导航时两行字wordpress站点标题和副标题
  • 厦门翔安建设局网站做网站的s标的软件
  • 网站开发在线培训郑州网站建设维护公司
  • 镇江seo网站优化宝塔wordpress 404配置
  • 网站建设的本质wordpress图片特效插件下载
  • 高端网站建设有哪些全国做网站的公
  • vs2015网站开发基础样式做英文企业网站
  • 平安车险官方保险网站做游戏代练去那个网站
  • 网站编辑建设朝阳网站制作设计
  • 公司网站可以自己做吗四川手机网站制作
  • 西安做网站哪家公司好餐饮网站建设怎么建设的
  • 专业的铁岭做网站公司研发app公司