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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值