邢台网站设计怎么做,WordPress 升级 php,自己做的视频网站视频加载慢,东莞网站建设 手袋厂系列文章目录
第一章 Linux 中内核与驱动程序 第二章 Linux 设备驱动编写 #xff08;misc#xff09; 第三章 Linux 设备驱动编写及设备节点自动生成 #xff08;cdev#xff09; 第四章 Linux 平台总线platform与设备树 第五章 Linux 设备树中pinctrl与gpio#xff08;…系列文章目录
第一章 Linux 中内核与驱动程序 第二章 Linux 设备驱动编写 misc 第三章 Linux 设备驱动编写及设备节点自动生成 cdev 第四章 Linux 平台总线platform与设备树 第五章 Linux 设备树中pinctrl与gpiolichee nano pi 第六章 Linux ioctl接口应用 第七章 Linux 中利用设备树点灯 第八章 Linux 中设备树学习Ⅳ ———————————————— 文章目录 系列文章目录前言一、设备树修改(device.c)1.设备树编写pinctrl和gpio子系统2.DTC编译器 二、驱动程序编写(driver.c)1、得到gpio口2、操纵gpio口3、测试程序 三、很重要 前言
在这里介绍一些基于pinctrl子系统和gpio子系统的设备树编写和驱动代码编写的例子。 有两部分一设备树编写即device代码二驱动文件编写即drive代码。 以“点亮四个LED灯”的程序为例进行讲解。 一、设备树修改(device.c)
设备树文件其实不需要我们完全编写我们需要的是在厂商工程师提供的代码上修改技术的发展不应该是越来越复杂它一定是越来越利于各位开发的。 例如采用imx6ull芯片的开发板
厂商bsp工程师提供基础自己改写imx6ull.dtsi开发板百问/野火等对应的硬件设备树
1.设备树编写pinctrl和gpio子系统
在自己的设备树中如果要利用pinctrl子系统时需要搞懂pinctrl的机制有两点1、怎样完成引脚配置服务端2、在那里激活配置应用端。上一节提到了这两部分其实要完成配置有两部分服务端应用端 继续以东山的qume开发板imx6ul芯片进行讲解。首先在板子对应的内核树文件中找到iomuxc或者iomuxc_snvs。其中的宏定义可在手册上查看我这里是根据设备树文件中其他的配置直接copy的其中配置了4个引脚的复用关系设置为GPIO电气属性为后面的数字串。请注意这时候还没有设备节点激活该属性。引脚为对应原理图中四个LED的IO口。 pinctrl服务端设置好了就该应用了这次在根节点下建立myled节点 (一个节点代表一个设备) 其中的红框代表了该节点激活了对应的pinctrl配置。黄框led-gpios代表着myled设备节点配置了4个引脚。这里注意在linux内核源码/Documentation/gpio/board.txt中提到xxx-gpios的后缀必须为gpios或者gpio这样在代码端就可以利用gpiod_get(dev, xxx, 0);得到信息 这里需要注意有的引脚可能被别的设备占用了需要暂时注释掉如下图GPIO1_3被adc1设备节点调用了因此我在这里把设备节点adc1的state设置为了disabled这样就不会抢占GPIO1_3引脚
2.DTC编译器
编写了xxx.dts之后文件要转变成xxx.dtb文件可以利用DTC编译器完成。利用DTC编译器可以完成编译和反编译。具体指令如下
dtc -I dts -O dtb -o 1test.dtb 1test.dts //输入dts输出dtb名字自己指定即可
dtc -I dtb -O dts -o 2test.dts 1test.dtb //输入dtb输出dts二、驱动程序编写(driver.c)
gpiod_get系列函数用法参考
https://www.cnblogs.com/bforever/p/10528395.html
https://www.cnblogs.com/schips/p/linux_subsystem_using_gpio_ss.htmlgpiod_get只能操纵一个gpio口下文中利用的是gpio_get_index函数操纵多个gpio口。
1、得到gpio口
平台总线模型,硬件device.c部分即设备树写完了驱动的完整程序在此码云链接: linklinklink
https://gitee.com/zhaojiqi/linux-device-driver-routines/blob/master/b2_led_gpio_and_pinctrl/leddrv.c很简单一个可以作为后续字符设备驱动程序开发的框架。其中有open、write、close功能。当驱动和设备树转换成的device文件匹配之后进入probe函数完成GPIO读取和file operations结构体注册。 这里重点观察下gpio_get_index()函数其中 第二个参数“led”就是前面myled结点中定义的属性中的led-gpios属性只能说设备树太抽象了…。 第三个参数代表第几个gpio。 第四个参数指的是有效电平有效电平指的是实际电路的电平。例如一个LED拉低点亮。那么在配置设备树的时候这个GPIO就应该设置为GPIO_ACTIVE_LOW。还有个GPIO_ACTIVE_HIGH 。这里只是没用宏定义直接填的0。
2、操纵gpio口
在设备文件中的write函数中根据应用程序传进来的参数来对gpio口进行操纵。 其中利用的函数为gpiod_set_value()函数直接输出高低电平。
3、测试程序
具体见码云链接: linklinklink
https://gitee.com/zhaojiqi/linux-device-driver-routines/blob/master/b2_led_gpio_and_pinctrl/leddrv.cmake之后在开发板加载驱动
insmod leddrv.ko查看驱动和设备节点
lsmod //查看驱动本文驱动名字leddrv
ls /dev //查看设备节点本次实验设备节点为myled利用测试程序开灯关灯
./ledtest myled on //测试程序参数1设备节点参数2开/关
./ledtest myled off测试图片
三、很重要
其实前面有一个地方设置出问题了pinctrl服务端设置了gpio14但是没有设置gpio53直接利用了gpio53但是程序没有报错gpio口的控制也可以正常跑通这是因为gpio53可能默认复用的就是gpio功能。好多开发板都如此。