围城
分类: 嵌入式
2013-08-09 14:07:51
原文地址:Nios2 linux环境LED驱动开发 作者:FBI888XH
1.编写Linux设备驱动驱动程序,将该文件复制到(linux 源码目录)/drivers/(目标文件夹)中
LED驱动(nios2-linux/linux-2.6/drivers/myleds/myleds.c)
点击(此处)折叠或打开
2.在目标文件夹(myleds文件夹)中创建Makefile和Kconfig(菜单配置文件),内容分别如下:
#Makefile
obj-$(CONFIG_MYLEDS) += myleds.o
#Kconfig
menu USER_DEVICE_DRIVERS
config MYLEDS
tristate "myleds"
---help---
This is a sample driver programme.
endmenu
Kconfig中的MYLEDS与Makefile中CONFIG_MYLEDS中的MYLEDS对应。
注意,如果Kconfig文件中的"tristate"写成"bool",则该模块只能选为Y(编译进内核)或N(不选择),不能选为M(编译为模块,可动态加载)
3.修改上层目录( linux内核源码目录/drivers/)中的Makefile和Kconfig文件,Makefile中加入如下语句
#makefile
obj-y += myleds/
Kconfig中加入如下语句:
#Kconfig
source "drivers/myleds/Kconfig"
4.编译内核
make menuconfig
进入Kernel Setting-> Device Drivers->USER_DEVICE_DRIVERS->myleds。
找到我们自己的菜单名,然后按回车或空格进入,用M键使选项前的尖括号里显示M表示该模块要动态加载,也可以按y键选择直接编辑进内核,选择完后exit退出,选择yes或no的对话框通一选yes。
可以在nios2-linux/uClinux-dist/romfs/lib/modules/ 中的若干层子目录中看到myleds/myleds.ko
5.加载测试:将生成的zImage文件下载到开发板,开发板上的嵌入式Linux启动后到上面/lib/modules
中myleds目录中使用
insmod myleds.ko
或
modprobe myleds
加载驱动模块
则完成对驱动程序的加载。
查看/proc/devices中myleds对应的设备号,若为254。则使用mknod命令建立对应字符设备文件:
mknod myleds c 254 0
其中myleds为设备文件名,c表示设备为字符设备,254为主设备号,0为次设备号。
生成设备文件之后,就可以直接在shell中使用命令控制led:
echo –n ff00ff > myleds
将led都设为绿色。8组3种颜色的led,控制led的24bits数据,低8位控制8个led的蓝色,低电平有效。中8位控制绿色,高8位控制红色。
但可能会出现错误:
module myleds: relocation overflow
modprobe: failed to load module myleds: invalid module format
二、将驱动静态编译进uClinux内核
要将一个写好的驱动加入uClinux,需要对配置文件和Makefile作一些修改,由于我们的这个驱动程序是作为一个字符型驱动程序,我们把 mydevice.c拷到(uClinux目录)/(linux 内核目录)/drivers/char目录下。并对这个目录下的Config.in和Makefile以及mem.c作一些修改。
1、 修改Config.in:
在comment 'Character devices' 这行底下加上以下一行:
bool 'support for mydevice' CONFIG_MYDEVICE y
2、 修改Makefile
在
#
# uClinux drivers
#
下加上以下内容:
obj-$(CONFIG_MYDEVICE) += mydevice.o
3、 修改mem.c
mem.c主要是初始化一些以虚拟设备,这些设备通常是以内存作为基础“设备”的,我们把mydevice的初始化代码加入其中:
在mem.c文件的起始位置加上以下代码:
#ifdef CONFIG_MYDEVICE
extern int mydevice_init(void);
#endif
修改mem.c的chr_dev_init函数
if (devfs_register_chrdev(MEM_MAJOR,"mem",&memory_fops))
printk("unable to get major %d for memory devs\n", MEM_MAJOR);
memory_devfs_register();
rand_initialize();
#ifdef CONFIG_MYDEVICE
mydevice_init();
#endif
#ifdef CONFIG_I2C
i2c_init_all();
#endif
4、 编译mydevice驱动
所有要作的修改就是这么简单,接下来的问题就是怎样将我们的驱动编译进内核了
(1) 配置内核
运行make menuconfig
进入Kernel/Library/Defaults Selection菜单
选上Customize Kernel Settings
退出并保存设置
在新出现的菜单中进入Character devices子菜单
选上support for mydevice
退出并保存设置
用make dep和make命令生成内核镜像和内存文件系统镜像