1.3设备树的引进与体验——字符设备驱动的编译测试
Posted 我与梅郎隔两重
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.3设备树的引进与体验——字符设备驱动的编译测试相关的知识,希望对你有一定的参考价值。
上一节写的led驱动程序包含了很多头文件,这些头文件的支持依赖于内核,所以要测试这个驱动程序,首先要编译内核。
- kernel 版本:4.19.0-rc3
- kernel 编译工具:arm-linux-gnueabi-gcc 4.9.4
- uboot:1.1.6(菜单页支持下载设备树t)
- uboot 编译工具:arm-linux-gnueabi-gcc 4.9.4
- APP编译工具:arm-linux-gcc 4.3.2
在内核源码的driver目录下创建一个001_led_drv_traditional文件夹,编译C文件和测试程序,其中.c文件的Makefile如下:
然后使用nfs挂载。
首先设置一下板子的ip,我的虚拟机IP固定是192.168.0.103,在同一个网段里给板子分配一个没用过的IP即可,这里设置的是192.168.0.100。设置完成后ping一下虚拟机,可以看到成功连上了。
将虚拟机的 /work/nfs_root 文件夹挂载到开发板的 /mnt 目录下:
mount -t nfs -o nolock,vers=2 192.168.0.103:/work/nfs_root /mnt
然后将文件推到挂载目录下,insmod ko文件,可以看到出现led设备。
然后执行./ledtest on和off,可以发现小灯随着指令亮灭,同时每次执行完指令都会执行一遍release函数。
这是因为测试函数依次执行open和write函数,然后return 0结束运行。
即时没有close函数,当这个应用程序退出后,内核也会调用该应用程序release函数来释放资源。
int main(int argc, char **argv)
{
int fd;
unsigned char val = 1;
fd = open("/dev/led", O_RDWR);
if (fd < 0)
{
printf("can't open!\\n");
return 0;
}
if (argc != 2)
{
printf("Usage :\\n");
printf("%s <on|off>\\n", argv[0]);
return 0;
}
if (strcmp(argv[1], "on") == 0)
{
val = 1;
}
else
{
val = 0;
}
write(fd, &val, 1);
// close(fd);
return 0;
}
PS:搭环境编译测试搞了好久,确实不容易,后面进度可以快一点了吧。。QAQ
以上是关于1.3设备树的引进与体验——字符设备驱动的编译测试的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-34]:目标系统 - 系统软件 - Linux OS硬件电路的文本描述:设备树的构成属性解析使用
__Kernel专栏文章导航与优秀笔记整理(2021.08.14更新)