当前位置: 技术问答>linux和unix
如何编译ARM的linux驱动
来源: 互联网 发布时间:2016-04-26
本文导语: 在电脑的linux上安装了ARM2440的linux交叉编译器. 现在我按照网上的资料写了个简单的hello驱动. #include #include #include MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, worldn"...
在电脑的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是否是同一个文件?
#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提供内核的版本是不是接近
你要在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本身就支持多平台的)
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本身就支持多平台的)
|
还有一种可以动态加载驱动的方法。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。