Linux学习(二)- 驱动开发步骤

  • 代码目录下文件为

1、在同一个驱动c文件中编写该驱动代码

  • 1、定义xxx_open、xxx_write、xxx_read、xxx_release这4个函数
  • 2、再定义一个file_operations xxx_fops结构体,再给xxx_fops结构体的成员变量赋值,这些值就是前面的4个函数
  • 3、定义xxx_init、xxx_exit这两个函数注册和注销驱动设备,注册时提供设备号和名字xxx
  • 4、module_init传参xxx_init,module_exit传参xxx_exit。module_init供insmod命令加载模块时调用,module_exit供rmmod命令卸载模块时调用。
  • 5、驱动c文件中引用以下头文件,都是linux内核源码里的头文件

2、在驱动c文件同一个目录下编写makefile

3、直接在驱动c文件目录下,输入make指令编译

  • 编译报错,说找不到第一行的文件路径,还需要移植内核源码到指定目录,因为当前.c引用的头文件都在第一行的路径中。

4、移植Linux内核源码

  • 使用 NXP 官方提供的 Linux 源码,解压重命名为,放在Makefile第一行指定的路径。并修改顶层 Makefile 文件里面定义 ARCH 和 CROSS_COMPILE 这两个的变量值为 arm 和 arm-linux-gnueabihf-,输入以下命令编译内核源码。
powershell 复制代码
make clean 
make imx_v7_mfg_defconfig
make -j16

5、再回到驱动c文件目录下,编译生成下列文件

  • xxx.ko就是可以用命令insmod加载的驱动模块文件。
  • App为测试驱动的应用程序,用arm-linux-gnueabihf-gcc chrdevbaseApp.c -o chrdevbaseApp编译即可。

6、下载到板子测试

  • 这里还需要板子连网才能进行测试,不像传统的直接通过调试器下载,ubuntu虚拟机和板子的网络要处于同一个网关。Linux 系统选择通过 TFTP 从网络启动,并且使用 NFS 挂载网络根文件系统。
  • 联网方法是需要让板子上电后,先引导uboot起来,串口打印终端3秒内回车进入命令模式,用命令配置网络连接,再设置可以调试驱动的参数,才能加载驱动模块进行测试。

7、输入命令配置uboot,让板子和Ubuntu联网

  • 我们的驱动程序是在Ubuntu下编译的,insmod加载模块和测试模块也是在Ubuntu的终端下进行,而板子运行后先启动的是Uboot,Uboot其中一个作用就是引导程序运行,所以虚拟机上的驱动程序想在板子上运行,就得通过Uboot来加载,没有调试器接口,usb串口线也不能调试加载程序,所以就需要用网线将板子和ubuntu的电脑连接起来,接线后还不能直接用,需要设置ubuntu和板子处于同一个网关下,才能正常通信,不然可能会将数据传到别的网址去。
  • 使用NFS在ubuntu虚拟机上挂载网络根文件系统,就能跑程序了。
相关推荐
张小姐的猫9 分钟前
【AI大模型接入SDK】 —— Ollama本地接入Deepseek
java·linux·开发语言·网络·c++·人工智能
en.en..18 分钟前
深入解析 fork:一次调用,两次返回的核心原理
linux·运维·服务器
Terra.K23 分钟前
JAVA职业探索和学习----中间件开发目标
java·学习·中间件
动词ing29 分钟前
【学习笔记】数据结构(哈希表基础+哈希集合+哈希映射+计数+查找)
数据结构·学习·哈希算法
kaixin_啊啊30 分钟前
中国研究生数学建模竞赛(华为杯)学习笔记——数据预处理全流程
人工智能·笔记·学习·数学建模·ai·大模型·数据预处理
kuroomi5 小时前
Docker 与容器基础
linux·运维·docker
dadaobusi7 小时前
学习:RV lkvm SBI
java·学习·spring
传奇开心果编程9 小时前
【Xilem 0.4 基础语法学与练】第一课:从零到计数器
学习·rust·前端框架
David猪大卫9 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
z23456d10 小时前
第四十一天学习心得
学习