ubuntu 步步为营之字符驱动编写

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,编译内核



UcLinux添加自定义应用程序的详细过程

基本步骤

1 在user下建一个目录,在这个目录下编写.c文件和makefile(最好先gcc一把试试)

2 改写user下的makefile

3 改写config.in 改写config.help

4 编内核make menuconfig加上定义的程序

5 烧写

( 文中所用的路径为uclinux 安装的相对路径, 比如: /uClinux-Samsung)编译uclinux 并运行成功后, 下一步的工作就是写个最经典、最简单的程序“ hello, world” 。

在uclinux下, 当然要比在普通的OS下麻烦些。( 我用的是ANYWHERE-Ⅱ 开发板, 不同的开发板的过程应相似)我基本是按照 Documentation/Adding-User-Apps-HOWTO 的步骤进行, 有部分修改。

1、在user 目录下创建新目录 user/sample, 用来存放源代码。写“ hello.c” 文件。(“ hello.c” 文件如何写,不用我说了吧。)

2、编辑文件 user/Makefile,

增加下面这行 dir_$(CONFIG_USER_SAMPLE_HELLO) += sample

具体增加到哪里, 你打开文件就会发现相似的语句, 按照字母顺序, 放到合适的位置。

3、编辑文件 config/Configure.help,

增加下行

CONFIG_USER_SAMPLE_HELLO

A example C program. This Program print "hello, world" on screen.

注意: 第2行以2个空格开头, 总长度小于70 个字符。

4、编辑文件 config/config.in

在 ‘ Games’ 后添加新的部分

#########################

mainmenu_option next_comment

comment ‘ Sample’

bool ‘ hello’ CONFIG_USER_SAMPLE_HELLO

endmenu

( 注意这里的单引号字符不对, 不要直接COPY这里的字符, 最好自己手工输入, 或参考文件中已有的行修改。)

5、创建合适的 user/sample/Makefile 文件

HELLO = hello

HELLOOBJS = hello.o

all: $(HELLO) $(HELLO): $(HELLOOBJS)

$(CC) $(LDFLAGS) -o $@ $(HELLOOBJS) $(LDLIBS)

romfs:

["$(CONFIG_USER_SAMPLE_HELLO)" != y] || cp hello $(ROMFSDIR)/bin/. clean:

-rm -f $(HELLO) *.elf *.gdb *.o

6、重新编译生成image.rom。注意在运行make config 或make menuconfig时选择生成"hello" 。

是否Makefile 文件中修改如下:

romfs:

["$(CONFIG_USER_SAMPLE_HELLO)" == y] || cp hello $(ROMFSDIR)/bin/.

是否能默认选择“ hello” , 我还未试。

7、烧写image.rom, 运行 >hello 即可看到输出“ hello, world"

8、完毕。

注意:GCC前必须要用[Tab],否则会出现错误:missing separator. Stop.


驱动程序编写

/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应用程序




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值