嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十二)LED模板驱动程序的改造:设备树

简介: 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十二)LED模板驱动程序的改造:设备树

1.LED模板驱动程序的改造:设备树


1.1 总结3种写驱动程序的方法


1670919948358.jpg

核心永远是file_operations结构体。 上述三种方法,只是指定“硬件资源”的方式不一样。

从上图可以知道,platform_device/platform_driver只是编程的技巧,不涉及驱动的核心。


1.2 怎么使用设备树写驱动程序


1.2.1 设备树节点要与platform_driver能匹配


在我们的工作中,驱动要求设备树节点提供什么,我们就得按这要求去编写设备树。 但是,匹配过程所要求的东西是固定的:

①设备树要有compatible属性,它的值是一个字符串

②platform_driver中要有of_match_table,其中一项的.compatible成员设置为一个字符串

③上述2个字符串要一致。


示例如下:

1670919965076.jpg


1.2.2 设备树节点指定资源,platform_driver获得资源


如果在设备树节点里使用reg属性,那么内核生成对应的platform_device时会用reg属性来设置IORESOURCE_MEM类型的资源。

如果在设备树节点里使用interrupts属性,那么内核生成对应的platform_device时会用reg属性来设置IORESOURCE_IRQ类型的资源。对于interrupts属性,内核会检查它的有效性,所以不建议在设备树里使用该属性来表示其他资源。


在我们的工作中,驱动要求设备树节点提供什么,我们就得按这要求去编写设备树。驱动程序中根据pin属性来确定引脚,那么我们就在设备树节点中添加pin属性。

设备树节点中:

#define GROUP_PIN(g,p) ((g<<16) | (p))
100ask_led0 {
   compatible = “100ask,led”;
   pin = <GROUP_PIN(5, 3)>;
};


驱动程序中,可以从platform_device中得到device_node,再用of_property_read_u32得到属性的值:

struct  device_node* np = pdev->dev. of_node;
int led_pin;
int err = of_property_read_u32(np, “pin”, &led_pin);


1.3 开始编程


1.3.1 修改设备树添加led设备节点


在本实验中,需要添加的设备节点代码是一样的,你需要找到你的单板所用的设备树文件,在它的根节点下添加如下内容:

#define GROUP_PIN(g,p) ((g<<16) | (p))
100ask_led@0 {
  compatible = "100as,leddrv";
  pin = <GROUP_PIN(3, 1)>;
};
100ask_led@1 {
  compatible = "100as,leddrv";
  pin = <GROUP_PIN(5, 8)>;
};
//都会去调用probe函数。


1.3.1.1 对百问网imx6ull Pro板


设备树文件是:内核源码目录中arch/arm/boot/dts/100ask_imx6ull-14x14.dts

修改、编译后得到arch/arm/boot/dts/100ask_imx6ull-14x14.dtb文件。


对于这款板子,本教程中我们使用SD卡上的系统。

要更换板上的设备树文件,你可以使用SD卡启动开发板后,更换这个文件:/boot/100ask_imx6ull-14x14.dtb


1.3.1.2 对百问网imx6ull MINI


设备树文件是:内核源码目录中arch/arm/boot/dts/100ask_imx6ull_mini.dts

修改、编译后得到arch/arm/boot/dts/100ask_imx6ull_mini.dtb文件。


对于这款板子,本教程中我们使用SD卡上的系统。

要更换板上的设备树文件,你可以使用SD卡启动开发板后,更换这个文件:/boot/100ask_imx6ull_mini.dtb


1.3.1.3 对于百问网使用QEMU模拟的IMX6ULL板子


设备树文件是:内核源码目录中arch/arm/boot/dts/100ask_imx6ul_qemu.dts

修改、编译后得到arch/arm/boot/dts/100ask_imx6ul_qemu.dtb文件。


它是执行qemu时直接在命令行中指定设备树文件的,你可以打开脚本文件qemu-imx6ul-gui.sh找到dtb文件的位置,然后使用新编译出来的dtb去覆盖老文件。


1.3.2 修改platform_driver的源码


使用GIT下载所有源码后,本节源码位于如下目录:

01_all_series_quickstart\
05_嵌入式Linux驱动开发基础知识\source\
02_led_drv\05_led_drv_template_device_tree


关键代码在chip_demo_gpio.c,主要看里面的platform_driver,代码如下。

第166行指定了of_match_table,它是用来跟设备树节点匹配的,如果设备树节点中有compatile属性,并且其值等于第157行的“100as,leddrv”,就会导致第162行的probe函数被调用。

156 static const struct of_device_id ask100_leds[] = {//这边定义一个ask100_leds 并让他与设备树产生联系
157     { .compatible = "100as,leddrv" },
158     { },
159 };
160
161 static struct platform_driver chip_demo_gpio_driver = {
162     .probe      = chip_demo_gpio_probe,
163     .remove     = chip_demo_gpio_remove,
164     .driver     = {
165         .name   = "100ask_led",
166         .of_match_table = ask100_leds,//支持设备树,参考别人的代码看看怎么写的。
167     },
168 };
169
170 static int __init chip_demo_gpio_drv_init(void)
171 {
172     int err;
173
174     err = platform_driver_register(&chip_demo_gpio_driver);
175     register_led_operations(&board_demo_led_opr);
176
177     return 0;
178 }
179


1.4 上机实验


1.使用新的设备树dtb文件启动单板,查看/sys/firmware/devicetree/base下有无节点

2. 查看/sys/devices/platform目录下有无对应的platform_device

3. 加载驱动:

# insmod  leddrv.ko
# insmod  chip_demo_gpio.ko


测试驱动:

# ./ledtest   /dev/100ask_led0  on
# ./ledtest   /dev/100ask_led0  off


1.5 调试技巧


/sys目录下有很多内核、驱动的信息:


1.5.1 设备树的信息


以下目录对应设备树的根节点,可以从此进去找到自己定义的节点。

cd /sys/firmware/devicetree/base/


节点是目录,属性是文件。 属性值是字符串时,用cat命令可以打印出来;属性值是数值时,用hexdump命令可以打印出来。


1.5.2 platform_device的信息


以下目录含有注册进内核的所有platform_device:

/sys/devices/platform


一个设备对应一个目录,进入某个目录后,如果它有“driver”子目录,就表示这个platform_device跟某个platform_driver配对了。

比如下面的结果中,平台设备“ff8a0000.i2s”已经跟平台驱动“rockchip-i2s”配对了:

/sys/devices/platform/ff8a0000.i2s]# ls driver -ld
lrwxrwxrwx    1 root     root             0 Jan 18 16:28 driver -> ../../../bus/platform/drivers/rockchip-i2s


1.5.3 platform_driver的信息


以下目录含有注册进内核的所有platform_driver:

/sys/bus/platform/drivers


一个driver对应一个目录,进入某个目录后,如果它有配对的设备,可以直接看到。

比如下面的结果中,平台驱动“rockchip-i2s”跟2个平台设备“平台设备“ff890000.i2s”、“ff8a0000.i2s”配对了:

1670920117196.jpg

注意:一个平台设备只能配对一个平台驱动,一个平台驱动可以配对多个平台设备。


1.6 课后作业


请仿照本节提供的程序(位于05_led_drv_template_device_tree目录),改造你所用的单板的LED驱动程序。

相关文章
|
2天前
|
Linux 程序员 芯片
【Linux驱动】普通字符设备驱动程序框架
【Linux驱动】普通字符设备驱动程序框架
|
4天前
|
编解码 Linux
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
XviD是开源的MPEG-4视频编解码器,曾与DivX一起用于早期MP4视频编码,但现在已被H.264取代。要集成XviD到Linux上的FFmpeg,首先下载源码,解压后配置并编译安装libxvid。接着,在FFmpeg源码目录中,重新配置FFmpeg以启用libxvid,然后编译并安装。成功后,通过`ffmpeg -version`检查是否启用libxvid。详细步骤包括下载、解压libxvid,使用`configure`和`make`命令安装,以及更新FFmpeg配置并安装。
18 2
FFmpeg开发笔记(二十八)Linux环境给FFmpeg集成libxvid
|
5天前
|
Linux Windows 虚拟化
【Linux环境搭建实战手册】:打造高效开发空间的秘籍
【Linux环境搭建实战手册】:打造高效开发空间的秘籍
|
10天前
|
Web App开发 安全 Linux
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
《FFmpeg开发实战》书中介绍轻量级流媒体服务器MediaMTX,但其功能有限,不适合生产环境。推荐使用国产开源的ZLMediaKit,它支持多种流媒体协议和音视频编码标准。以下是华为欧拉系统下编译安装ZLMediaKit和FFmpeg的步骤,包括更新依赖、下载源码、配置、编译、安装以及启动MediaServer服务。此外,还提供了通过FFmpeg进行RTSP和RTMP推流,并使用VLC播放器拉流的示例。
24 3
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
|
11天前
|
编解码 Linux
FFmpeg开发笔记(二十五)Linux环境给FFmpeg集成libwebp
《FFmpeg开发实战》书中指导如何在Linux环境下为FFmpeg集成libwebp以支持WebP图片编解码。首先,从GitHub下载libwebp源码,解压后通过`libtoolize`,`autogen.sh`,`configure`,`make -j4`和`make install`步骤安装。接着,在FFmpeg源码目录中重新配置并添加`--enable-libwebp`选项,然后进行`make clean`,`make -j4`和`make install`以编译安装FFmpeg。最后,验证FFmpeg版本信息确认libwebp已启用。
23 1
FFmpeg开发笔记(二十五)Linux环境给FFmpeg集成libwebp
|
12天前
|
Linux 芯片
Linux 驱动开发基础知识——查询方式的按键驱动程序_编写框架(十三)
Linux 驱动开发基础知识——查询方式的按键驱动程序_编写框架(十三)
9 2
|
17天前
|
Linux 编解码 Python
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
AV1是一种高效免费的视频编码标准,由AOM联盟制定,相比H.265压缩率提升约27%。各大流媒体平台倾向使用AV1。本文介绍了如何在Linux环境下为FFmpeg集成AV1编解码库libaom、libdav1d和libsvtav1。涉及下载源码、配置、编译和安装步骤,包括设置环境变量以启用这三个库。
39 3
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
|
22天前
|
JavaScript API
鸿蒙开发接口UI界面:【@ohos.mediaquery (媒体查询)】
鸿蒙开发接口UI界面:【@ohos.mediaquery (媒体查询)】
24 1
|
30天前
|
运维 网络协议 Linux
2024年最全CentOS8 Consul微服务架构安装(1)_agent(1),Linux运维开发面试
2024年最全CentOS8 Consul微服务架构安装(1)_agent(1),Linux运维开发面试
|
1月前
|
编解码 Linux 5G
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器
AVS3,中国制定的第三代音视频标准,是首个针对8K和5G的视频编码标准,相比AVS2和HEVC性能提升约30%。uavs3d是AVS3的解码器,支持8K/60P实时解码,且在各平台有优秀表现。要为FFmpeg集成AVS3解码器libuavs3d,需从GitHub下载最新源码,解压后配置、编译和安装。之后,重新配置FFmpeg,启用libuavs3d并编译安装,通过`ffmpeg -version`确认成功集成。
35 0
FFmpeg开发笔记(二十)Linux环境给FFmpeg集成AVS3解码器