zoukankan      html  css  js  c++  java
  • 加载TQ2440驱动Hello World 模块

    开发平台:

    Ubuntu 10.04,内核版本2.6.32-33-generic,

    交叉编译器:天嵌公司提供的arm-linux-gcc 4.3.3,

    内核树:/opt/EmbedSky/linux-2.6.30.4/

    目标平台:

    天嵌公司的TQ2440开发板ARM9,内核版本2.6.30.4

    1.      首先解压天嵌公司提供的内核源码包linux-2.6.30.4_20100531.tar.bz2,

     

    tar xvfj linux-2.6.30.4_20100531.tar.bz2 –C /

    -C是指定解压目录,后面的/代表在根目录解压归档文件。

    之后内核树会被解压到/opt/EmbedSky/linux-2.6.30.4/

    编译内核:

    1. cd /opt/EmbedSky/linux-2.6.30.4  
    2. cp config_EmbedSky_W35 .config  
    3. make zImage 

    在此,config_EmbdeSky_W35为天嵌公司提供的内核配置文件,开始时可暂时拿来用。

    至此,内核树已经准备好了,这是编译内核驱动模块的前提工作,如果在自己的文件系统中没有准备好内核树,则无法构造可装载的模块。

    2.      安装交叉编译器4.3.3

    解压天嵌公司提供的EABI-4.3.3_EmbedSky_20100610.tar.bz2,

     tar xvfj EABI-4.3.3_EmbedSky_20100610.tar.bz2 –C /  

    之后交叉编译器会被解压到/opt/EmbedSky/4.3.3/,

    修改环境变量配置文件/etc/environment,

    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/EmbedSky/4.3.3/bin"

    LANGUAGE="zh_CN:zh:en_US:en"

    LANG="zh_CN.utf8"

    使用命令

     export PATH=$PATH:/opt/EmbedSky/4.3.3/bin 

    保存重启即生效,若不想重启可使用

     source /etc/environment  

    但是此命令只对该终端生效,所以若没其他问题,推荐重启

    3.编写hello world 驱动模块

    1. cd /home/shanks/modules  
    2. mkdir hello  
    3. cd hello  

    驱动模块不一定要放在内核树里,只要你的Makefile指定了内核树的路径就没问题,所以我这里在/home/shanks/里建立了一个modules目录专门用来开发驱动模块。

    hello.c 源码:

     
    1. #include <linux/init.h>   
    2. #include <linux/module.h>   
    3. MODULE_LICENSE("Dual BSD/GPL");  
    4.   
    5. static int hello_init(void)  
    6. {  
    7.    printk(KERN_ALERT "Hello, world\n");  
    8.    return 0;  
    9. }  
    10.    
    11. static void hello_exit(void)  
    12. {  
    13.    printk(KERN_ALERT "Goodbye, cruel world\n");  
    14.    return 0;  
    15. }  
    16.   
    17. module_init(hello_init);  
    18. module_exit(hello_exit);  

    Makefile:

     
    1. KERNELDIR=/opt/EmbedSky/linux-2.6.30.4     
    2. PWD:=$(shell pwd)     
    3. INSTALLDIR=$(PWD)      
    4. CC=arm-linux-gcc    
    5. obj-m := hello.o     
    6. modules:     
    7.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules     
    8. clean:     
    9.     rm -rf *.o *.ko *.mod.c *.markers *.order *.symvers     
    10. .PHONY:modules clean   

    然后,

     make  

    生成了几个文件,其中hello.ko就是我们需要的用来加载的模块文件。

    这里注意,make之前必须要先准备好内核树,否则make会出错。

    连上开发板,这里我把PC的根目录挂载到板子的/mnt下,

     
    1. cp /mnt/home/shanks/modules/hello/hello.ko/tmp  
    2. cd /tmp  

    好了,加载模块!

    [root@www.linuxidc.com /tmp]# insmod hello.ko

    Hello, world

    [root@www.linuxidc.com /tmp]# rmmod hello

    Goodbye, cruel world

    insmod时可能出现的错误:

    I.

    hello: version magic '2.6.30.4 mod_unload ARMv4 ' should be'2.6.30.4-EmbedSky mod_unload ARMv4 '

    insmod: cannot insert 'hello.ko': invalid module format

    出错原因:模块版本与内核版本不匹配!

    解决办法:导入预设配置信息,进入menuconfig 继续配置General config ->( )Local version -> 括号中加入如下内容:“-EmbedSky”退出保存为 .config ,重新编译内核、驱动模块,再来加载模块

    ii.

    hello: Unknown symbol__aeabi_unwind_cpp_pr0
    insmod: cannot insert 'hello.ko': unknown symbol in module, or unknown
    parameter

    出错原因:模块和内核镜像不匹配

    解决方法:尽量用和你同时用来编译驱动而生成的内核镜像zImage,zImage烧到板子上。Ldd3上有句话:尽管并不是必需的,但最好运行和模块对应的内核。

    刚开始学驱动,终于成功加载了hello world 模块!

    这是学习驱动的一小步,但是对我来说却是一大步!


  • 相关阅读:
    linux基础学习-14.3-第四关考试题
    linux基础学习-14.2-命令补充(4)
    linux基础学习-14.1-定时任务练习题
    引入jason依赖
    模糊查询sql语句
    多行删除操作
    分页助手依赖引入
    在web.xml文件中读取spring-security.xml配置文件
    spring-security框架引入依赖
    安全框架配置文件(spring-security.xml)
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218591.html
Copyright © 2011-2022 走看看