我是靠谱客的博主 无聊金鱼,最近开发中收集的这篇文章主要介绍linux 内核编译arm,如何编译ARM的linux驱动,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在电脑的linux上安装了ARM2440的linux交叉编译器. 现在我按照网上的资料写了个简单的hello驱动.

#include

#include

#include

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)

{

printk(KERN_ALERT "Hello, worldn");

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT "Goodbye, worldn");

}

module_init(hello_init);

module_exit(hello_exit);

Makefile文件如下:

//Makefile

ifneq ($(KERNELRELEASE),)

obj-m := hello.o

else

KDIR:=/lib/modules/$(shell uname -r)/build

PWD:=$(shell pwd)

all:

$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

endif

clean:

rm -f *.o *.ko *.mod.c .hello*

编译OK. insmod运行这个驱动也正常. 我想问如何让我的这个驱动也可以工作在2440上面并从传口打印Hello. world. 是否需要修改编译选项还是什么文件?

另外在2440提供的linux BSP中的i2c驱动头文件有#include 这些头文件和我上面的那个hello.c中的init.h是否是同一个文件?

|

1、

你要在arm板上加载模块,就要进行交叉编译

添加 CC=arm-linux-gcc在你的makefile里面

就使用了交叉工具

2、

你的KDIR也要修改,你系统要生成你arm内核的库文件,在内核原代码中使用make modules-install 就会在lib/modules下生你arm版的内核文件

在把KDIR指向那个文件就可以了

3、

你所指的两个文件应该差不多,自己可以比较一下用diff命令比较

也要看你系统内核的版本和你arm2440提供内核的版本是不是接近

|

部分已经在这里答过了

http://topic.csdn.net/u/20081117/15/7dab3735-b32a-4a16-8834-f4d931f189d0.html

多谢两位:

1. 我看了一下2440 arm9的linux bsp驱动的Makefile. 没有看见有arm-linux-gcc. 请且我到i2c驱动目录下make后提示:

make:***无目标. 停止.

【joyself】建议你看看Kernel的一般编译方法。

不一定是arm-linux-gcc的,要看你的交叉编译器到底是是什么前缀

2.是在ARM9提供的linux BSP中内核源码包中使用make modules-install吧. 我可以在源码包中make zImage. 但make modules-install后.提示:

make:***没有规则可以创建目标"modules-install".停止.

[joyself] 是 make modules_install 。 你可以make help看看有哪些选项。

3.如果使用动态加载驱动方式时候. 是否也需要以上步骤? 还是可以可以省去重新编译内核文件这一步.

[joyself] 就是模块加载啊,当然需要编译。

总体建议: 先了解kernel的编译流程。(这个跟是不是arm没有什么关系,通常来说对于arm来说

make时加个ARCH=arm CROSS_COMPILE=xxxxxxxx就ok了,kernel本身就支持多平台的)

|

还有一种可以动态加载驱动的方法。

最后

以上就是无聊金鱼为你收集整理的linux 内核编译arm,如何编译ARM的linux驱动的全部内容,希望文章能够帮你解决linux 内核编译arm,如何编译ARM的linux驱动所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部