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虚拟机上挂载网络根文件系统,就能跑程序了。
相关推荐
GISer_Jing1 小时前
测绘与GIS考试高频考点选择题精选
学习·arcgis
Hical_W1 小时前
Hical 踩坑实录五部曲(二):MSVC / GCC / Clang 三平台 C++20 编译差异
linux·windows·经验分享·嵌入式硬件·macos·开源·c++20
OBiO20132 小时前
从单细胞多组学到体内验证:器官纤维化与代谢疾病的研究新范式
笔记·学习
活蹦乱跳酸菜鱼2 小时前
linux ATF BL2执行过程
linux
淡淡烟雨淡淡愁4 小时前
安装libreoffice
linux
蜀道山老天师4 小时前
云原生监控入门:监控基础概念 + SLI/SLO/SLA 详解 + Prometheus 从零安装配置
linux·运维·云原生·prometheus
AIDF20264 小时前
linux 服务器网络问题排查
linux·服务器·网络
楼兰公子4 小时前
br_opi5_plus_defconfig 附带uboot
linux·运维·服务器
云天AI实战派4 小时前
AI 智能体/API 调用故障排查指南:实时语音、Codex 权限与 Spec 驱动开发全流程修复手册
人工智能·驱动开发·chatgpt·api·codex