一个编写Linux驱动程序
1.创建Linux驱动程序框架
Linux内核在使用驱动程序时需要加载和卸载驱动程序
加载驱动程序:创建设备文件,分配内存地址空间等; module_init函数处理驱动程序初始化
卸载驱动程序:删除设备文件,释放内存地址空间等; module_exit函数处理退出
包含这两个函数的两个宏的C程序文件也可以视为Linux驱动程序的框架
2.注册和注销设备文件
任何Linux驱动程序都需要一个设备文件,否则该应用程序将无法与该驱动程序进行交互。
建立设备文件:这是在处理第一步编写的Linux初始化工作的函数中完成的。 misc_register函数
删除设备文件:这是在第一步中编写的处理Linux退出的函数中完成的。 misc_deregister函数
3.指定驱动程序相关信息
驱动程序是自描述的,驱动程序作者的姓名,使用的开源协议,别名,驱动程序描述和其他信息。这些信息需要在驱动程序源代码中指定。
MODULE_AUTHOR,MODULE_LICENSE,MODULE_ALLS,MODULE_DESCRIPION和其他宏可以指定与驱动程序相关的信息
4.指定回调函数
驱动程序不一定指定所有回调函数,回调函数将通过相关机制进行注册
5.编写业务逻辑
特定的业务逻辑与驱动程序的功能有关。业务逻辑可能由多个功能,多个文件甚至多个Linux驱动程序模块组成
6.写入Makefile文件
Linux内核源代码的编译规则由Makefile定义。因此,需要一个Makefile来编写新的Linux驱动程序
7.编译Linux驱动程序
它可以直接编译到内核中,也可以作为模块单独编译
8.安装和卸载Linux驱动程序
如果将Linux驱动程序编译到内核中,只要Linux使用内核,该驱动程序将自动重新打印
如果Linux驱动程序作为单独的模块存在,请使用insmod或modprode命令加载Linux驱动程序模块,并使用rmmod命令卸载Linux驱动程序模块
第二个,第一个Linux驱动程序,以word_count为例
([一)基本写作代码
#mkdir -p / root / drivers / ch06 / word_count创建用于存储Linux驱动程序的目录
#cd / root / drivers / ch06 / word_count
#echo''> word_count.c创建驱动程序源代码文件
#echo'obj-m:= word_count.o'> Makefile写入Makefile文件make命令会将Linux驱动程序源代码目录中的word_count.c或word_count.s文件编译为word_count.o文件
obj-m表示将Linux驱动程序编译为模块(.ko文件),将word_count.o链接到word_count.ko文件中,然后使用insmod或modprode命令加载word_count.ko
obj-y意味着将Linux驱动程序编译到Linux内核中,word_count.o将被链接到Built-in.o文件中,最后被链接到内核中
Linux系统将内存分为用户空间和内核空间。无法直接访问两个空间中的程序。 printk函数在内核空间中运行,而printf函数在用户空间中运行。因此,属于内核程序的Linux驱动程序无法直接访问printf。功能。
#make -C / usr / src / linux-headers- 3. 0.0-15-generic M = / root / driver / ch06 / word_count编译Linux驱动程序源代码
#insmod word_count.ko加载驱动程序
#lsmod | grep word_count检查word_count是否安装成功
#rmmod word_count卸载Linux驱动程序
#dmesg | grep word_count | tail -n 2查看Linux驱动程序输出的日志信息
([二)添加有关指定信息的代码
在模块上:MODULE_AUTHOR(“衬里”);
模块描述:MODULE_DESCRPTION(“字数统计。”);
模块别名:MODULE_ALIAS(“单词计数模块。”);
开放源代码协议:MODULE_LICENSE(“ GPL”);
#define DEVICE_NAME“ wordcount” //定义设备文件名
//描述与设备文件触发的事件相对应的回调函数指针
// owner:设备事件回调魔术适用于哪个驱动器模块,THIS_MODULE表示将其应用于当前驱动器模块
静态结构file_operations dev_fops = {。owner = THIS_MODULE};
//描述设备文件的信息
// minor:次设备号MISC_DYNAMIC_MINOR ,:动态生成的次设备号名称:设备文件名
// fops:file_operations结构变量指针
static struct miscdevice misc = {。minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops =&dev_fops};
//初始化Linux驱动程序
静态int word_count_init(void)
{int ret;
ret = misc_register(&misc);
printk(“ word_count_init_success \ n”);
返回ret;
}
//卸载Linux驱动程序
静态无效word_count_exit(void)
{misc_deregister(&misc);
printk(“ word_inti_exit_success \ n”);
}
由于内核空间中的程序无法直接访问用户空间中的数据,因此有必要在word_count_read(从设备文件中读取数据)和word_count_write(将数据写入设备文件)中使用copy_to_user和copy_from_user函数)函数从内核中删除数据。将空间复制到用户空间或从用户空间复制到内核空间
([三)加载和卸载驱动程序
检查word_count驱动程序是否正常工作
#dmesg |尾-n 1
#modinfo word_count.ko
检测Linux驱动程序模块的依赖性
#depmod /root/drivers/ch06/word_count/word_count.ko
调用命令以加载Linux驱动程序
#modprode word_count
注意:insmod和modprode命令都可以加载驱动程序,后者可以检查驱动程序模块的依赖性
三种测试Linux驱动程序的方法
([一)使用Ubuntu Linux测试Linux驱动程序
您需要编写一个专门用于测试的程序,例如test_word_count.c
#gcc test_word_count.c -o test_word_count
#test_word_count
#test_word_count“。”
输出结果:字符串:。
字字节显示:0,0,0,3
字数:3
([二)通过android模拟器上的本机C程序测试Linux驱动程序
#cd〜/内核/金鱼
#make menuconfig
如图所示进行设置,然后重新编译Linux内核。成功编译内核后,Android可以使用可用性生成的zImage内核文件动态加载Linux驱动程序模块。
满足两个条件,普通的Linux程序可以直接运行:android,开发板或手机需要root许可;可执行文件需要使用交叉编译器来编译test_word_count.c文件,建立Android.mk来设置编译参数,然后使用make命令进行编译
#mm编译相应目录中的.c文件
#adb push ./emulator/test_word_count / data / local上传到Android
执行以下命令以测试驱动器
#chmod 777 / data / local / test_word_count设置可执行权限
#/ data / local / test_word_count
#/ data / local / test_word_count'a bb ccc ddd eee'
输出结果:5,表示测试成功
([三)使用Android NDK测试
([四)使用开发板进行测试
([五)将驱动程序编译到Linux内核中进行测试
eclipse中Linux驱动程序的四大开发
第一步:创建一个C项目
步骤2:建立C源代码文件链接新建>源文件夹文件夹名称输入src,导入word_count.c文件
第3步:设置包含路径。单击菜单项属性,“ C / C ++常规”>“路径和符号”,选择“包含”的GNU C项,然后添加两个路径:/ root / kernel / goldfish / include和/ root / kernel / goldfish / arch / arm /包含
第4步:编译Linux驱动程序
测试Linux驱动程序
第一步:导入test_word_count.c文件
第2步:设置包含路径
第3步:创建目标创建目标>创建,在“目标名称”文本框中输入word_count_eclipse_test,然后单击“确定”
第4步:构建项目Make Target> Build,选择第三步中创建的文件,然后单击Build
第5步:运行测试程序“运行方式”>“本地C / C ++应用程序”
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-337189-1.html