10.1前提
请按上面第八章使用GIT下载源码、使用repo下载工具链,并配置了交叉编译工具链。
为何编译驱动程序之前要先编译内核?
①驱动程序要用到内核文件:例如驱动程序中这样包含头文件:#include,其中的asm是一个链接文件,指向asm-arm或asm-mips,这须要先配置、编译内核就会生成asm这个链接文件。
②编译驱动时用的内核、开发板上运行到内核,要一致:开发板上运行到内核是出厂时烧写的,你编译驱动时用到内核是你自己编译的,这两个内核不一致时会造成一些问题。所以我们编译驱动程序前ubuntu nfs挂载开发板,要把自己编译下来到内核放在板子起来,取代原先的内核。
③更换板子上的内核后,板子上的其他驱动也要更换:板子使用新编译下来的内核时,板子上原来的其他驱动也要更换为新编译下来的。
所以在编译我们自己的第1个驱动程序之前,要先编译内核、模块,但是放在板子起来。
10.2编译内核
10.2.1STM32MP157开发板
在ubuntu上设置交叉编译,并执行编译。
book@100ask:~$ export ARCH=arm
book@100ask:~$ export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
book@100ask:~$ export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
STM32MP157全功能版
kernel的编译过程如下(编译内核前须要先配置好工具链等一些环境变量):
book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ make 100ask_stm32mp157_pro_defconfig
book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ make uImage LOADADDR=0xC2000040
book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ make dtbs
编译步骤参考如下,编译完成uImage后才可编译设备树文件,假如你认为编译速率很慢可以加-j来使用并行任务编译,如右图加-j8参数使用8个并行任务来编译内核,编译速率视性能而言,i79700F显存3Ghz双核8G显存全速编译可能须要5分钟左右。
编译完成后生成的文件如右图所示
编译完成后,在arch/arm/boot目录下生成uImage内核文件,在arch/arm/boot/dts目录下生成设备树的二补码文件stm32mp157c-100ask-512d-lcd-v1.dtb。
把这2个文件复制到/home/book/nfs_rootfs目录下备用,如右图:
book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ cp arch/arm/boot/uImage ~/nfs_rootfs/
book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ cp arch/arm/boot/dts/stm32mp157c-100ask-512d-v1.dtb ~/nfs_rootfs/
10.2.2编译内核模块
无论是那个版本的STM32MP157开发板ubuntu nfs挂载开发板linux多线程,编译内核模块的是一样的。STM32MP157全功能版
步入内核源码目录后,就可以编译内核模块了:
book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- modules -j8
内核模块编译执行截图示例
10.2.3安装内核模块到Ubuntu某个目录下备用
可以先把内核模块安装到nfs根文件系统(/home/book/nfs_rootfs为安装目录)。注意:下边会执行tree命令,假如提示没有该命令,须要执行“sudoaptinstalltree”命令安装tree工具(前提是Ubuntu能上网)。
STM32MP157全功能版
执行以下命令:
book@100ask:~/100ask_stm32mp157_pro-sdk/Linux-5.4$ make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
如右图,把模块安装在nfs所在目录/home/book/nfs_rootfs/目录下:
安装后的的/home/book/nfs_rootfs/目录结构如右图所示:
因为模块编译安装完成后会手动生成两个链接到内核源码目录的链接文件,须要自动删掉这两个链接文件才可以继续执行拷贝内核模块到开发板步骤,否则会提示空间不足等问题,如下所示,执行rmbuildsource删掉两个红框所示的链接文件。
book@virtual-machine:~/nfs_rootfs/lib/modules/5.4.31-g04363cb64$ rm build source
以后可以继续执行拷贝模块到开发板操作。
10.3安装内核和模块到开发板上
假定:执行上述命令后,在Ubuntu的/home/book/nfs_rootfs目录下早已有了zImage或uImage、dtb文件,而且有lib/modules子目录(上面富含各类模块)。
下边,要把那些文件复制到开发板上。
假如你使用的是VMwareNAT形式,假定WindowsIP为192.168.1.100,在开发板启动步入Linux后,输入root登陆,之后执行以下命令(注意:必须指定port为2049、mountport为9999):
mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.1.100:/home/book/nfs_rootfs /mnt
cp /mnt/zImage /boot 或 cp /mnt/uImage /boot
cp /mnt/*.dtb /boot
cp /mnt/lib/modules /lib -rfd
sync
reboot
假如你使用的是VMware桥接方法,假定UbuntuIP为192.168.1.100,在开发板上执行以下命令:
mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book/nfs_rootfs /mnt
cp /mnt/zImage /boot 或 cp /mnt/uImage /boot
cp /mnt/*.dtb /boot
cp /mnt/lib/modules /lib -rfd
sync
reboot
最后重启开发板,它就使用新的zImage或uImage、dtb、模块了。
10.5体验第1个驱动程序
10.5.1更改Makefile指定内核目录
把第1个驱动程序01_hello_drv上传到Ubuntu后,使用vim更改它的Makefile,设置其中的KERN_DIR变量为内核的源码目录,以STM32MP157为例,如下:
KERN_DIR = 100ask_stm32mp157_pro-sdk/Linux-5.4/
10.5.2编译
设置好工具链、配置、编译过内核以后,在01_hello_drv目录下执行make命令即可编译驱动程序及测试程序,如下:
10.5.3在开发板上运行
开发板启动后通过nfs挂载Ubuntu目录的方法,将相应的文件拷贝到开发板上。假如你使用的是VMwareNAT形式,假定WindowsIP为192.168.1.100,在开发板上执行以下命令(注意:必须指定port为2049、mountport为9999):
[root@board:~]# mount -t nfs -o nolock,vers=3,port=2049,mountport=9999 192.168.1.100:/home/book/nfs_rootfs /mnt
假如你使用的是VMware桥接方法,假定UbuntuIP为192.168.1.100,在开发板上执行以下命令:
[root@board:~]# mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book/nfs_rootfs /mnt
挂载NFS成功后,把驱动和测试程序复制到开发板上:
[root@board:~]# cp /mnt/hello_drv.ko ./
[root@board:~]# cp /mnt/hello_drv_test ./
之后安装驱动程序并验证是否成功:
[root@board:~]# insmod hello_drv.ko
执行“lsmod”可以看见hello_drv驱动,如下:
执行“cat/proc/devices”:
执行“ls-l/dev/hello”,可以发觉有这个设备节点,但是它的主设备号跟上图一样:
最后执行测试程序:
./hello_drv_test -w www.100ask.net
./hello_drv_test -r
倘若不想见到驱动调试信息linux操作系统论文,可以先执行以下命令拿来关掉内核的复印信息:
echo "1 4 1 7" > /proc/sys/kernel/printk
10.6常见问题
安装驱动程序时,假若有以下提示信息,缘由就是板子上运行的内核太老了,解决方式就是先编译内核、替换板能上的内核,再重新编译、安装驱动程序:
disagrees about version of symbol device_create
[ 2098.200219] hello_drv: Unknown symbol device_create (err -22)
[ 2098.208445] hello_drv: disagrees about version of symbol device_destroy
[ 2098.215871] hello_drv: Unknown symbol device_destroy (err -22)
insmod: ERROR: could not insert module hello_drv.ko: Invalid parameters
全文下载:
本文原创地址://lrxjmw.cn/byqdcxqwhyxb.html编辑:刘遄,审核员:暂无