ubuntu10.04
交叉编译环境下编写驱动和应用程序移植到嵌入式系统arm7
常用开发工具 VI GCC GDB
或者 vi gcc emace+gdb
先看看uclinux的目录结构吧
uClinux 的源代码组织成以下列结构:
根目录是uClinux-xxx( 例如: uClinux-Samsung).
其中,内核放在linux-2.4.* 下,(xxx 是版本号,2.0.x 或2.4.x).
一些应用程序放在user 目录下,根文件系统放在romfs 下,
预编译好的linux映像放在images 下,包括在RAM 和ROM中运行的映像.
系统的启动代码放在boot 目录下. 下面重点描述一下内核的组织结构:
arch/armnommu : 与架构和平台相关的代码都放在arch 目录下, 针对ARM的uClinux, 有一个子目录和它相对应—armnommu .如果你要把uClinux移植到另外一个ARM板子, 大部分的工作就是修改这个目录下的一些文件,例如kernel/head-arm-atmel.S ,kernel/setup.c
drivers: 这个目录下包含了所有的设备驱动程序. 驱动程序又被分成’block’, ’char’, ‘net’等几种类型,
fs: 这里有支持多种文件系统的源代码,几乎一个目录就是一个文件系统,如MSDOS,VFAT, proc,ext2等。虚拟文件系统(VFS)给所有各式各样的文件系统提供了一个统一的接口。文件系统是放在块设备上的,这些块设备由块设备驱动程序来提供支持。
include:相关的头文件。他们被分成通用和平台专用两部分。 目录‘asm-$(ARCH)’包含了平台相关的头文件,在它下面进一步分成‘arch-$(MACHINE)’,’arch-$(PROCESSOR)’等子目录。与板子相关的头文件放在arch-$(MACHINE)’下,与CPU相关的头文件放在’arch-$(PROCESSOR)’下。例如,对于ARM7TDMI ,‘proc-armv’ 子目录就会被用到。对于EV40,应为用的是Atmel40800,所以‘arch-atmel’用来存放硬件相关的定义。
init: 含一些启动kernel所需做的所有初始化动作,里面有一个main.c针对kernel 作初始化动作,设置一些参数等,对外围设备初始化。
ipc: 提供近程间通讯机制的源代码,如信号量,消息队列,管道等。
kernel: 包含进程调度算法的源代码,以及与内和相关的处理程序,例如系统调用。
mmnommu: 在标准linux中有一个mm目录,用来存放内存管理的源代码,包括MMU。 而这个目录是来替换mm的, 仅仅包含简单的内存分页管理的源代码。
net: 支持网络相关的协议源代码。
lib: 包含内核要用到的一些常用函数。例如,字符串操作,格式化输出等。
script: 这个目录中包含了在配置和编译内核时要用到的脚本文件
user:这个目录下放着用户的各种应用程序
所以我们的
驱动程序放在drivers:文件夹下面如果是字符驱动就放在char下新建个文件夹如sample然后放.c .h驱动
应用程序放在user文件夹下面可以新建个文件夹比如app然后放你的程序
驱动编写过程
1,写好接口函数open,release,read,write,ioctrl,mmap以及file_operations结构体
2,写好驱动注册和模块加载卸载程序
3,编写主函数进行控制
(以上都是在/linux-2.4.x/drivers/char/目录下完成的xxx.C xxx.H也可以新建目录)
4,编写makefile,
修改配置文件config.in修改makefile修改mem.c
5,应用程序编写(编写.C文件编写makefile /user目录下也可以新建目录)
4,编译内核
|
驱动程序编写
/linux-2.4.x/drivers/char/{led.h,led.c Makefile}
修改添加驱动配置文件和Makefile
uClinux-dist20050311/linux-2.4.x/drivers/char/{Makefile,config.in,mem.c}
Makefile
obj-$(CONFIG_C5471_WDT) += wdt_c5471.o
#add by panasonic 2009-12-12
obj-$(CONFIG_LED_TEST) += led.o
config.in
if [ "$CONFIG_CPU_S3C44B0X" = "y" ]; then
bool 'Samsung S3C44B0X serial ports support' CONFIG_SERIAL_S3C44B0X
bool 'test led drivers' CONFIG_LED_TEST
if [ "$CONFIG_SERIAL_S3C44B0X" = "y" ]; then
mem.c
int __init chr_dev_init(void)
{
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();
/*add by panasonic 2009-1-1*/
#ifdef CONFIG_LED_TEST
led_init();
#endif
#ifdef CONFIG_I2C
i2c_init_all();
#endif
vendors/Samsung/44B0/Makefile
DEVICES = \
tty,c,5,0 console,c,5,1 cua0,c,5,64 cua1,c,5,65 \
\
mem,c,1,1 kmem,c,1,2 null,c,1,3 \
zero,c,1,5 random,c,1,8 urandom,c,1,9 \
\
ram0,b,1,0 ram1,b,1,1 \
\
ptyp0,c,2,0 ptyp1,c,2,1 ptyp2,c,2,2 ptyp3,c,2,3 \
ptyp4,c,2,4 ptyp5,c,2,5 ptyp6,c,2,6 ptyp7,c,2,7 \
ptyp8,c,2,8 ptyp9,c,2,9 ptypa,c,2,10 ptypb,c,2,11 \
ptypc,c,2,12 ptypd,c,2,13 ptype,c,2,14 ptypf,c,2,15 \
\
rom0,b,31,0 rom1,b,31,1 rom2,b,31,2 rom3,b,31,3 \
rom4,b,31,4 rom5,b,31,5 rom6,b,31,6 rom7,b,31,7 \
rom8,b,31,8 rom9,b,31,9 \
\
tty0,c,4,0 tty1,c,4,1 tty2,c,4,2 tty3,c,4,3 \
ttyS0,c,4,64 ttyS1,c,4,65 \
\
ttyp0,c,3,0 ttyp1,c,3,1 ttyp2,c,3,2 ttyp3,c,3,3 \
ttyp4,c,3,4 ttyp5,c,3,5 ttyp6,c,3,6 ttyp7,c,3,7 \
ttyp8,c,3,8 ttyp9,c,3,9 ttypa,c,3,10 ttypb,c,3,11 \
ttypc,c,3,12 ttypd,c,3,13 ttype,c,3,14 ttypf,c,3,15 \
\
led,c,231,0
应用程序编写
/user/ledtest/{ledtest.c,Makefile}
修改添加应用程序的配置和Makefile
uClinux-dist20050311/user/Makefile
dir_$(CONFIG_USER_HELLO) += app
dir_$(CONFIG_USER_LEDTEST) += ledtest
编译
$make menuconfig
选中customize kernel settings/customize vendor/user settings
然后在kernel setting那里选中test led drivers
最后在vendor/user setting那里选中led drivers test下面的LEDtest应用程序