×
单片机 > 单片机程序设计 > 详情

2416开发记录二:最简单的helloworld驱动

发布时间:2020-08-26 发布时间:
|

1. 编写helloworld驱动程序


驱动程序源码如下:


#include

#include


static int hello_init(void)

{

   printk(KERN_INFO "BBBlackHelloModule enter!\n");

   return 0;

}


static void hello_exit(void)

{

   printk(KERN_INFO "BBBlackHelloModule exit!\n");

}


module_init(hello_init);

module_exit(hello_exit);


MODULE_AUTHOR("Zhao Yidong

MODULE_LICENSE("Dual BSD/GPL");

MODULE_DESCRIPTION("A sample bbblack hello module");

MODULE_ALIAS("a sample module");

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21


2. 编写驱动的makefile


根据PC的hellomodule,修改makefile文件,编辑2416的makefile如下:


#Makefile for .c

ARCH=arm

CROSS_COMPILE=arm-linux-

ifneq ($(KERNELRELEASE),)

    obj-m := HelloModule2416.o

else

#bbblack kernel

KERNELDIR ?= /home/zyd/soft/s3c2416/20140409_HELPER2416/Helper2416/source/s3c-linux.jyx

PWD := $(shell pwd)

modules:

    make -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules

modules_install:

    make -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules_install

app: app.c

    $(CROSS_COMPILE)gcc -o app app.c

clean:

    $(MAKE) -C $(KDIR) M=$(PWD) clean

endif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18


3. 编译


执行make modules时出现错误 ERROR: Kernel configuration is invalid. 

原来是需要先编译内核 

好吧,到内核目录/home/zyd/soft/s3c2416/20140409_HELPER2416/Helper2416/source/s3c-linux.jyx执行命令 

make ARCH=arm CROSS_COMPILE=arm-linux- zImage 

注意一定要指定目标和编译器。否则编译出来就是x86的了。 

编译完内核之后再编译hellomodule就可以了。 

但是将编译号的hellomodule.ko驱动文件下载到开发板上运行又出错了,貌似是内核又不一致。我草!!!!!!!!


怎么解决呢? 


从原因入手,提示的是开发板的内核和驱动编译的内核不一致导致的, 


开发板的内核使用 uname -r 命令查看如下 


[root@jyxtec /root]# uname -r 

3.2.50+


在开发板启动时有一下信息打印 

Linux version 3.2.50+ (d02cj@LinuxServer0) (gcc version 4.4.6 (crosstool-NG 1.14 

CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177


查看驱动的信息如下 

modinfo HelloModule2416.kofilename: HelloModule2416.ko 

alias: a sample module 

description: A sample bbblack hello module 

license: Dual BSD/GPL 

author: Zhao Yidong zmurder@outlook.com 

depends: 

vermagic: 3.2.50 mod_unload ARMv5 p2v8


驱动的内核和开发板的内核是不一致。因为自己在编译驱动前编译了内核(为啥要先编译内核?不先编译内核不让编译驱动啊!!!)。编译出来的内核和开发板上的内核是不一致的!!!!(万恶的开发板商啊,提供的内核编译出来和实际使用的不一样!!) 


好吧,知道了原因就好解决了。 


使用FTP(前提是配置好FTP)将自己编译的内核zImage使用ftp下载到开发板中(参考君益兴开发板手册的3.3.4节,下载,擦出,烧写,指定加载。)


4. 安装卸载驱动


这时再使用insmod就可以了!!!哈哈哈哈!! 


但是问题又出来了,使用rmmod卸载驱动时提示(原因是busybox 不同于发行版 linux 安装,没有生成相应的目录) 

rmmod: chdir(3.2.50): No such file or directory 


好吧,解决方法如下: 

建立一个目录: mkdir -p /lib/modules/$(uname -r) 

将自己的驱动拷贝到这个目录下即可


至此,HelloModule已经完成了。。。。艰难啊!!





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会