开发平台:

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. staticint hello_init(void)
  5. {
  6. printk(KERN_ALERT "Hello, world\n");
  7. return 0;
  8. }
  9. staticvoid hello_exit(void)
  10. {
  11. printk(KERN_ALERT "Goodbye, cruel world\n");
  12. return 0;
  13. }
  14. module_init(hello_init);
  15. 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 模块!

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

加载TQ2440驱动-Hello World 模块相关推荐

  1. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块...

    Linux中mod相关的命令 内核模块化   mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...

  2. arm上加载insmod驱动时出现Unknown symbol in module

    问题 这几天在arm上做蓝牙耳机驱动的时候,编译好了驱动但是在板子上insmod时候. 怎么会出现这种情况,不对呀,仔细查我们会发现,其实编译驱动的时候,就出现了一些警告,只是当时没有在意而已,而恰恰 ...

  3. driver.class.php line: 109,thinkphp3.2.3 无法加载数据库驱动: Think\Db\Driver\

    这是我在Common conf config.php中的代码 return array( //'配置项'=>'配置值' $options = array( //数据库配置 'DB_TYPE' = ...

  4. windows无法确定此计算机是否包含,服务器用U盘虚拟光驱装系统,有做RAID5,加载RAID驱动成功后,安装到最后会报“windows无法确定此计算机是否包含有效系统卷”错误...

    http://zhidao.baidu.com/link?url=bC5dyBz_W05bgeQOu0hF7BN7As_GjloE-Z8SeJBj8UWXZNt4eHeisP2Eo59nUwud23p ...

  5. java 手动加载数据库驱动_JAVA加载数据库驱动(JDBC)

    JAVA加载数据库驱动(JDBC) 前言 之前,对Class.forName("com.mysql.jdbc.Driver");这条动态加载JDBC驱动感觉很疑惑,故有了这篇短文. ...

  6. java加载jdbc驱动,加载JDBC驱动

    我们平时在连接数据库时需要加载驱动,通常做法是将JDBC驱动程序放在类路径中的某个位置,然后用Class.forName()查找并加载驱动程序. 这也就意味着要么将驱动程序打包到jar中,要么将驱动程 ...

  7. win10驱动开发4——加载/卸载驱动

    注意加载卸载驱动必须是win32项目 #include <Windows.h> #include <stdio.h> int main() {//等同于创建驱动======== ...

  8. 使用DriverManager动态加载JDBC驱动时,报:java.sql.SQLException: No suitable driver found for xxxx 错误

    参考文章: yanbin.blog - 自定义类加载器动态加载 JDBC 驱动 项目场景: 使用DriverManager动态加载JDBC驱动时,报:java.sql.SQLException: No ...

  9. 一篇文章吃透:为什么加载数据库驱动要用Class.forName()

    1.Class.forName()和ClassLoader.loadClass()和new XX的区别 Class.forName():将类的.class文件加载到jvm中之外,还会对类进行解释,执行 ...

最新文章

  1. 安卓的两种界面编写方式对比
  2. 基于PYQT编写一个人脸识别软件(2)
  3. 形变块匹配跟踪(2):配准跟踪与几何约束_md
  4. mysqldump 常用备份选项,只备份数据或结构的方法
  5. 超链接禁用_如何在Microsoft Word中禁用超链接
  6. vba 判断是否为数字
  7. 路由器连接久点就慢下来了,怎么回事?
  8. 718. 最长重复子数组
  9. 工厂利用计算机实现温度调节属于,工厂利用计算机系统实现温度调节、阀门开关,该应用属于()。A.过程控制B.数据处理C.科学计算D.C...
  10. 嵌入式软件设计(freertos使用)
  11. 玩转codesys入门篇
  12. java 日历转化-阴历转阳历
  13. 计算机蓝牙传输,怎么使用电脑蓝牙 电脑蓝牙传输文件步骤【步骤教程】
  14. npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.
  15. Python实现圣诞树、打包exe过程和遇到的问题
  16. 因式分解理论基础(4)不可约多项式与唯一因式分解定理
  17. 定时器自动装载c语言,定时器初始化新写法
  18. android word分页,控制分页
  19. 计算机组装维修考点,计算机维修工(基础知识)—教材
  20. 如何在30分钟完成表格增删改查的前后端框架搭建

热门文章

  1. 一文读懂XPath基本语法_XPath语法详解_XPath教程
  2. 用Python制作掷硬币工具
  3. 小小知识点(五)——MATLAB对复数的操作
  4. 机器学习数据集汇总(附下载地址)
  5. YOLO系列论文精读
  6. 运筹系列65:TSP问题的精确求解法概述
  7. 单机百万连接调优和 Netty 应用级别调优
  8. 用计算机语言表达新年快乐,用计算机语言祝福大家新年快乐!
  9. HTML怎么CSS表格嵌套,CSS#/ HTML5 Chrome中的嵌套表格和子填充
  10. 已解决-Outlook 收件箱全部标记为已读,但还是有未读数字提示