module_init(dev_init); module_exit(dev_exit);
MODULE_LICENSE(\
MODULE_AUTHOR(\
(1)把Hello,Module 加入内核代码树,并编译
一般编译 2.6 版本的驱动模块需要把驱动代码加入内核代码树,并做相应的配置,如
下步骤(注意:实际上以下步骤均已经做好,你只需要打开检查一下直接编译就可以了):
Step1:编辑配置文件Kconfig,加入驱动选项,使之在make menuconfig 的时候出现
打开 linux-2.6.38/drivers/char/Kconfig 文件,添加如图所示:
#====================cgf add===================================== config MINI6410_LEDS
tristate \ depends on CPU_S3C6410 default y help
This option enables support for LEDs connected to GPIO lines on Mini6410 boards.
#==================================================================
保存退出,这时在 linux-2.6.38 目录位置运行一下make menuconfig 就可以在Device
Drivers ", Character devices 菜单中看到刚才所添加的选项了,按下空格键将会选择为
此意为要把该选项编译为模块方式;再按下空格会变为<*>,意为要把该选项编译到内核中,
在此我们选择
(2)Makefile文件
Step2:通过上一步,我们虽然可以在配置内核的时候进行选择,但实际上此时执行
编译内核还是不能把mini6410_leds.c编译进去的,还需要在Makefile 中把内核配置
选项和真正的源代码联系起来,打开linux-2.6.38-cgf/drivers/char/Makefile, obj-$(CONFIG_MINI6410_LEDS) += mini6410_leds.o 添加并保存退出
Step3:这时回到linux-2.6.38 源代码根目录位置,执行make modules,就可以生成我
们所需要的内核模块文件drivers/char/mini6410_leds.ko 了,注意:执行make modules 之前,必
须先执行make zImage,只需一次就可以了。 至此,我们已经完成了模块驱动的编译。
注意:在编译过程中会出现
drivers/char/mini6410_leds.c:31:30: fatal error: mach/gpio-bank-k.h: No such file or directory
compilation terminated.
则表明自己的内核里缺相关的头文件,只要把光盘里的头文件复制到相关的目录下则可以 一般头文件路径会在arch/arm/mach-s3c64xx/include
cp linux-2.6.38/arch/arm/mach-s3c64xx/include/mach/gpio-bank-k.h
/root/mywork/linux-2.6.38-cgf/arch/arm/mach-s3c64xx/include/mach/gpio-bank-k.h
(3)把Module 下载到开发板并安装使用
在此使用 ftp 命令把编译出的mini6410_hello_module.ko 下载到板子中,并把它移动
到/lib/modules/2.6.38-FriendlyARM 目录然后在板子中现在执行 insmod mini6410_leds.ko 出现如下结果: leds initialized
可以看到该模块已经被装载了(注意:使用modprobe 命令加载模块不需要加“ko”尾 缀)
再执行以下命令,可以看到该模块被卸载 #rmmod mini6410_hello_module
注意: 要能够正常卸载模块, 必须把模块放入开发板的 /lib/modules/2.6.38-FriendlyARM 目录
2、编写测试程序
光盘中的样例测试程序:
mini6410_leds.c
#include
#include
#include
int main(int argc, char **argv) {
int on; int led_no; int fd;
/* 检查led 控制的两个参数,如果没有参数输入则退出。*/
if (argc != 3 || sscanf(argv[1], \on < 0 || on > 1 || led_no < 0 || led_no > 3) { fprintf(stderr, \exit(1); }
/*打开/dev/leds 设备文件*/ fd = open(\if (fd < 0) {
fd = open(\
}
if (fd < 0) {
perror(\exit(1); }
/*通过系统调用ioctl 和输入的参数控制led*/ ioctl(fd, on, led_no);
/*关闭设备句柄*/
close(fd); return 0; }
3、将程序下载到开发板,推荐使用ftp下载
将开发板的IP地址修改,与主机在同一个网段,并修改PC机上Linux下/etc/exports网络配置文件的IP与开发板的一致。确保PC机上Linux已经安装了NFS服务器,。
4、测试
5.1加载驱动 # insmod mini6410_leds.ko 5.2测试 ./led 3 1 #chmod 777 led
5.4卸载驱动 #rmmod mini6410_leds.ko
从上面的结果我们可以看到,当用户调用相应的文件操作函数时,驱动程序中的相应的函数也会被调用。
大家可以修改相应程序,测试一下其他的情况,如有什么错误也可以一起探讨,今生为嵌入式事业奋斗终身,谢谢! 邮箱:1321024484@qq.com
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Tiny-S3C6410 - Linux下LED灯驱动移植过程(2)在线全文阅读。
相关推荐: