嵌入式:用和迅为4412开发板附带的不一样的系统和交叉编译器等编写hello驱动模块
1,介绍源于对debian的爱,虚拟机我使用最新的debian9.8,而且内核也不是原装的4.9,而是比较新的4.19,详细安装方式请参阅我的博文(debian9.6更换内核(最简单的命令方式)),主机系统我用的是win10企业版的64位系统,虚拟机平台是最新的vmware player15。交叉编译器是我用命令安装的,详细内容请参阅我的博文(debian9.6命令安装交叉编译器)。由...
1,介绍
源于对debian的爱,虚拟机我使用最新的debian9.8,而且内核也不是原装的4.9,而是比较新的4.19,详细安装方式请参阅我的博文(debian9.6更换内核(最简单的命令方式)),主机系统我用的是win10企业版的64位系统,虚拟机平台是最新的vmware player15。
交叉编译器是我用命令安装的,详细内容请参阅我的博文(debian9.6命令安装交叉编译器)。
由于换了内核的原因,我还换了4.19的linux-header,详细内容请参阅我的博文(嵌入式:内核驱动模块hello程序)。
系统版本信息:
gyz@debian:~$ uname -a
Linux debian 4.19.0-0.bpo.2-amd64 #1 SMP Debian 4.19.16-1~bpo9+1 (2019-02-07) x86_64 GNU/Linux
gyz@debian:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 9.8 (stretch)
Release: 9.8
Codename: stretch
交叉编译器信息内容:
gyz@debian:~$ dpkg -l gcc-arm-linux-gnueabi
ii gcc-arm-linux-gnue 4:6.3.0-4 amd64 GNU C compiler for the armel architecture
2,准备工作
就是将光盘上提供的内核源码共享到debian系统上,共享文件的方法请参阅我的博文(嵌入式:windows10主机,vmware player15,debian9.8虚拟机,建立共享文件夹)。
共享的内容是: H:\iTOP-4412精英版光盘资料\06_源码_uboot和kernel\iTop4412_Kernel_3.0_20180508.tar
拷贝到debian系统上,然后解压就行(解压命令tar -zxvf iTop4412_Kernel_3.0_20180508.tar.gz),之后如下(uboot的内容不用管):
gyz@debian:~/tf$ ls
iTop4412_Kernel_3.0 iTop4412_uboot
iTop4412_Kernel_3.0_20180508.tar.gz iTop4412_uboot_20180320.tar.gz
3,hello源码如下:
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("Dual BSD/GPL");
static int initialization_function(void)
{
printk(KERN_ALERT "hello world!\n");
return 0;
}
static void cleanup_function(void)
{
printk(KERN_ALERT "bye world!\n");
}
module_init(initialization_function);
module_exit(cleanup_function);
makefile(在目录下放的时候,一定要m大写)内容如下:
CC = arm-linux-gnueabi-gcc
obj-m += hello.o
KERNEL_DIR += /home/gyz/tf/iTop4412_Kernel_3.0/
PWD += $(shell pwd)
all:
make -C $(KERNEL_DIR) M=$(PWD) modules
clean:
rm *.o *.ko *.mod.c
.PHONY:clean
4,编译前,需做的操作
a,修改源码的makefile内容,修改后如下:
gyz@debian:~/tf/iTop4412_Kernel_3.0$ vim Makefile
....
....
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi-
....
....
b,编译时,可能会让做如下操作:
gyz@debian:~/tf/iTop4412_Kernel_3.0$ make oldconfig && make prepare
原因是,之前的.config不能用。
c,关于编译过程中“/bin/sh: scripts/mod/modpost: No such file or directory”的问题解决:
gyz@debian:~/tf/iTop4412_Kernel_3.0$ make scripts
d,关于编译过程中“fatal error: linux/compiler-gcc6.h: 没有那个文件或目录”的问题解决:
gyz@debian:~/tf/iTop4412_Kernel_3.0$ cp include/linux/compiler-gcc4.h include/linux/compiler-gcc6.h
就是拷贝一个gcc4.h当gcc6.h。
5,编译
gyz@debian:~/der$ make
这里不再演示
gyz@debian:~/der$ ls
built-in.o hello.ko hello.mod.o m2 modules.order
hello.c hello.mod.c hello.o Makefile Module.symvers
6,将hello.ko文件拷贝到tf卡上,我放到tf卡的第2分区了
命令这里就不写了,cp -r拷贝就是了。
7,挂载tf卡到烧写好qte系统的开发板
为什么要挂载呢?原因是qte系统没有主动挂载tf的机制,不像wins系统,自己就识别了。挂载命令:
[root@iTOP-4412]# mount /dev/mmcblk1p2 /mnt/
[ 38.778131] EXT2-fs (mmcblk1p2): warning: mounting ext3 filesystem as ext2
[ 38.784084] EXT2-fs (mmcblk1p2): warning: checktime reached, running e2fsck is recommended
注意,这里的tf卡就采用迅为提供的ext3fortmat那几个命令格式化就是了,不要弄成ext4,否则挂载不了。
解释:mmcblk1是tf卡名,mmcblk1p2就是它的第2分区,刚刚说了,我将hello.ko放到它的第2分区了。p1234就是它的四个分区。这些内容,可以在板子已经上电的情况下插入,会在超级终端上显示的。
8,拷贝到/下,安装模块
[root@iTOP-4412]# exit
~ # su -
[root@iTOP-4412]# ls
a.txt dev home mnt root system topeet version
b.txt etc lib opt sbin tf usr
bin hello.ko linuxrc proc sys tmp var
[root@iTOP-4412]# pwd
/
[root@iTOP-4412]# insmod hello.ko
[ 6316.764505] hello world!
[root@iTOP-4412]# lsmod hello.ko
hello 707 0 - Live 0xbf010000
[root@iTOP-4412]# rm hello.ko
[root@iTOP-4412]# lsmod hello.ko
hello 707 0 - Live 0xbf010000
[root@iTOP-4412]# rmmod hello
[ 6357.510961] bye world!
可以看到,安装模块的时候,用的hello.ko,卸载的时候,却是hello,这是因为较新版本的busybox 1.13.1+ 要卸载模块必须要 “完全匹配模块名”才行,原来在老版本的使用模块文件名就能卸载,现在不可以了。
关于“rmmod: can't change directory to '3.0.15': No such file or directory”的问题解决方法:
[root@iTOP-4412]# rmmod hello.ko
rmmod: can't change directory to '3.0.15': No such file or directory
解决方法:
[root@iTOP-4412]# uname -r
3.0.15
[root@iTOP-4412]# mkdir /lib/modules/3.0.15
说明,这个问题,其实不是经典的,经典的是rmmod: can't change directory to '/lib/modules/': No such file or directory的问题,解决办法也是一样的,mkdir新建文件夹就是了。
参考1:https://www.eefocus.com/spencer/blog/13-12/300967_833aa.html
参考2:https://www.cnblogs.com/mouou/p/6738343.html
更多推荐
所有评论(0)