编译环境 :Ubuntu 16.04
linux板子: Exynos4412
目录
Linux 驱动有两种运行方式,第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序。第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后使用“insmod”命令加载驱动模块。在调试驱动的时候一般都选择将其编译为模块,这样我们修改驱动以后只需要编译一下驱动代码即可,不需要编译整个 Linux 代码。
而且在调试的时候只需要加载或者卸载驱动模块即可,不需要重启整个系统。总之,将驱动编译为模块最大的好处就是方便开发,当驱动开发完成,确定没有问题以后就可以将驱动编译进Linux 内核中.
对于字符设备驱动而言,当驱动模块加载成功以后需要注册字符设备,同样,卸载驱动模块的时候也需要注销掉字符设备。
1. 编译生成模块文件.ko
1.1 板子运行最小系统
下载boot、内核kernel、文件系统system
1.2 编译模块
参考讯为电子的:
将编译生成的.ko文件拷入U盘
1.3 挂载U 盘
①确定在 目录 /mnt 下建立了 文件夹 /usb,如果未建立可键入一下命令:
mkdir /mnt/usb_disk
②载入 u 盘,需键入以下命令:
mount /dev/sda /mnt/usb_disk
成功后,即可使用 u 盘了, 文件就在目录 /mnt/usb_disk 下。
主要查看U盘插入是打印的信息:
所以我这里应该: mount /dev/sda1 /mnt/usb_disk
③查看U盘里面的内容
cd /mnt/usb_disk
ls
③卸载u盘:在使用完u盘后,在拔出前需要先键入卸载U盘命令
命令如下:umount /mnt/usb
2 模块操作
2.1 加载模块
insmod xxx.ko
insmod 命令不能解决模块的依赖关系,比如 drv.ko 依赖 first.ko 这个模块,就必须先使用insmod 命令加载 first.ko 这个模块,然后再加载 drv.ko 这个模块。但是 modprobe 就不会存在这个问题,modprobe 会分析模块的依赖关系,然后会将所有的依赖模块都加载到内核中,因此modprobe 命令相比 insmod 要智能一些。
modprobe 命令主要智能在提供了模块的依赖性分析、错误检查、错误报告等功能,推荐使用 modprobe 命令来加载驱动。
2.2 查看模块
lsmod
2.3 卸载模块
rmmod
出现问题:rmmod: can't change directory to '/lib/modules': No such file or directory
参考: https://blog.csdn.net/coolwriter/article/details/77982534?utm_source=blogxgwz5
主要就是:
mkdir -p /lib/modules
注意根据实际情况,这里的3.0.15替换为提示信息
我这里出现:
mkdir -p /lib/modules/3.0.15
之后成功卸载