嵌入式Linux下彩色LCD驱动的设计与实现_第1页
嵌入式Linux下彩色LCD驱动的设计与实现_第2页
嵌入式Linux下彩色LCD驱动的设计与实现_第3页
嵌入式Linux下彩色LCD驱动的设计与实现_第4页
嵌入式Linux下彩色LCD驱动的设计与实现_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如何将新的应用程序添加到uCLinux下假设新应用程序名称为app,操作步骤如下: 在uClinux-coldfire/user/目录下增加一个新的目录,并且将新的应用程序源代码复制到这个目录下。该目录下Makefile文件的编写方式,可以参考其它已经有的用户程序,如tip下的Makefile,并作适当修改。 修改uClinux-coldfire/venders/config.in文件,在该文件合适的位置增加下面一句:bool app CONFIG_USER_APP这样,在Make config时,uCLinux就会提示你是否需要编译这个新的应用程序。 修改uClinux-coldfire/u

2、ser/Makefile文件,在该文件合适的位置增加下面一句:DIRS$(CONFIG_USER_APP) += app加上这句后,如果你在Make config时选择了这个新应用程序,则编译时就会编译这个新的应用程序。 修改uCLinux-coldfire/romfs.mk文件,在该文件合适的位置增加下面一句BIN$(CONFIG_USER_ APP) += $(USER)/app/app这里假设新添加的应用程序的可执行文件名称为app, 在user/app目录下。加上这一句后,在最后编译成的可执行二进制影象中,root文件系统的/bin/目录下就会增加一个新的应用程序app。如何设置目标系

3、统的IP地址目标系统的IP地址是在出厂时是固定的,为2,要想改变目标系统的IP地址,例如改为4,有两种方法一、在目标系统上输入下列命令:/ifconfig eth0 4 netmask up/route add -net eth0这样就改变了目标系统的IP地址。但是这种改变无法保存,复位或断电再重新加电后系统仍然是原来的IP地址。二、修改源文件,重新编译后将编译好的内核写入Flash中,加电后重新启动目标系统,这样就改变了目标系统的IP地址,而且这种改变是保存在Flash中的,不会因为断电而丢失。对于万禾SOM5307A硬件平台,需要修改的源文件有两个。一个是uCLinux-coldfire/

4、venders/generic/big/rc,修改以下两句:ifconfig eth0 2 netmask uproute add -net eth0其中,2要改为你需要的IP地址,也要相应地修改为新的网络地址。另外一个要修改的文件是uCLinux-coldfir/common.mk,修改其中一句:TARGET_IP = 2其中,2也要改为你需要的IP地址。修改完成后重新编译内核,最后用以下命令将新内核通过串口传送到目标系统上并且写入Flash:$cd /home/uCLinux-coldfire$make$make sloadf如何调试你的应用程序主机和目标系统之间一般通过以太网进行通信,也

5、可使用串口。要调试某一个应用程序,目标系统首先运行gdbserver,并且指定通信端口。例如,如果要调试目标系统上的/bin/ping这个程序。首先在目标系统上输入下列命令启动gdbserver:/gdbserver :3000 /bin/ping 参数 这里,3000是TCP端口号, 不要与其他应用程序使用的网络端口号重复就可以,/bin/ping是要调试的程序。目标系统上输入上述命令后,gdbserver处于就绪状态,等待与主机上调试器gdb进行通信。然后在主机上运行gdb。WH5307SDK提供编译好的GNU GDB 4.18版本,在uClinux-coldfire/tools/bin目

6、录下,名称为m68k-elf-gdb,在RedHat7.1下编译和测试通过。另外在WH5307SDK光盘上还有GNU GDB 4.18版本的源程序。在主机上输入下列命令:$/home/uCLinux-coldfire/tools/bin/m68k-elf-gdb ping.gdb出现gdb提示符后,输入target remote 2:3000就可对应用程序进行调试,其中2是目标系统的IP地址,3000是TCP端口号。如何在系统启动后自动运行用户程序在嵌入式应用中,一般需要在操作系统运行起来后立刻运行用户的特定用户程序,为此,需要修改root文件系统的/etc/rc文件,这是uClinux启动S

7、hell后第一个运行的脚本文件。以SOM5307A硬件平台为例,/etc/rc文件是在编译的过程中由uClinux-coldfire/vendors/Generic/big/rc复制而来的,假如我们需要在操作系统运行起来后立刻运行/bin/app这个应用程序,只需要在文件uClinux-coldfire/vendors/Generic/big/rc最后加一行:/bin/app如果需要将该应用程序在后台运行,则增加的这句应该象这样:/bin/app &将应用程序移植到uCLinux下时需要注意的问题将应用程序移植到uCLinux下时,需要注意有以下限制: uclibc中不带有pthread库,要

8、进行多线程编程,只能选择select函数。 uclinux系统中由于内存管理的问题,没有fork()函数,用vfork()代替,即uclinux系统中没有真正的fork,多进程实际是使用vfork实现的,每次fork完一个进程必须执行exec,父进程等待子进程exec后才继续运行。 uCLinux所用的Libc库不是一个全功能的库,而是一个适合嵌入式应用的功能有限的库,对于一些不太常用的函数可能库里没有,需要用户自己编写。 堆栈(stack)有限制,现在堆栈大小限制在4K字节,你可以用如下方法增加堆栈的大小:在使用elf2flt工具软件时加上-s参数。 除了以上限制需要注意,在uCLinux编

9、程和移植应用程序与在标准Linux环境下的编程方法是一样的。关于不同内核版本间应用程序移植的问题应用程序的移植一般的和内核版本是没有任何关系的,当然有的应用程序是需要内核支持的,例如pppd等。在2.0.38内核和2.4内核之间互移应用程序,唯一要注意的就是Makefile的写法: 其实区别就一句话,就是2.4下面,它把elf2flt作为gcc的一个参数一步完成了,而2.0.38还要分为两步完成,体现在Makefile上就如下:对于2.0.38:$(LD) $(LDFLAGS) -o $.elf $(OBJS) $(LDLIBS)$(CONVERT)对于2.4.x:$(CC) $(LDFLAG

10、S) -o $ $(OBJS) $(LDLIBS)嵌入式Linux下彩色LCD驱动的设计与实现 嵌入式Linux下彩色LCD驱动的设计与实现 PMT 许庆丰 2002年12月 摘 要:本文介绍了如何在嵌入在开发彩色LCD显示驱动的方法,并对Linux中的显示驱动程序结构和框架作一介绍. 关键字:ARM,帧缓冲(Framebuffer),MC928MX1. 长期以来,在常见的掌上电脑(PDA)等小型手持式设备上,由于硬件条件等的限制,我们看到的显示器件通常是单色LCD,用户界面也非常简单,几乎看不到PC机上美观整齐的图形界面(GUI)支持.由于早期嵌入式处理器的速度有限,在处理图形和多媒体数据方

11、面也显得力不从心. 随着高性能嵌入式处理器的普及和硬件成本的不断降低,尤其是Arm系列处理器的推出,嵌入式系统的功能也越来越强.在多媒体应用的推动下,彩色LCD也越来越多地应用到了嵌入式系统中,如新一代掌上电脑(PDA)多采用TFT显示器件,支持彩色图形界面,图片显示和视频媒体播放.掌上电脑(PDA)的操作系统有微软Window CE,PalmOS等.而Linux做为开放源代码的操作系统也在市场中占据了一席之地.由于Linux成本低廉,任何人都可以得到其源代码并在其基础上进行开发,成为各家厂商极力发展的操作系统,加上其核心小,潜力可观. 在应用需求的推动下,Linux下也出现了许多图形界面软件

12、包,如MiniGUI,Trolletech公司的Embedded QT等,其图形界面及开发工具与Windows CE不相上下.在图形软件包的开发和移植工作中都牵扯到底层LCD的驱动问题.笔者参与了一个基于ARM9的PDA系统的开发,用的是摩托罗拉公司龙珠系列的MC928MX1.软件采用Linux 2.4.18平台,编译器为gcc的ARM交叉编译器. 一. 硬件平台 MC928MX1(以下简称MX1)是摩托罗拉公司基于ARM核心的第一款MCU,主要面向高端嵌入式应用.内部采用ARM920T内核,并集成了SDRAM/Flash,LCD,USB,蓝牙(bluetooth),多媒体闪存卡(MMC),C

13、MOS摄像头等控制器. LCD控制器的功能是产生显示驱动信号,驱动LCD显示器.用户只需要通过读写一系列的寄存器,完成配制和显示控制.MX1中的LCD控制器可支持单色/彩色LCD显示器.支持彩色TFT时,可提供4/8/12/16位颜色模式,其中16位颜色模式下可以显示65536种颜色.配置LCD控制器重要的一步是指定显示缓冲区,显示的内容就是从缓冲区中读出的,其大小由屏幕分辨率和显示颜色数决定.在本例中,笔者采用的是夏普LQ035Q2DD54 TFT 显示模块,在240 x320分辨率下可提供16位彩色显示. PMT版权所有 2002 Page 1嵌入式Linux下彩色LCD驱动的设计与实现

14、二. Linux下的设备驱动 Linux将设备分为最基本的两大类,字符设备和块设备.字符设备是以单个字节为单位进行顺序读写操作,通常不使用缓冲技术,如鼠标等,驱动程序实现比较简单;而块设备则是以固定大小的数据块进行存储和读写的,如硬盘,软盘等.为提高效率,系统对于块设备的读写提供了缓存机制,由于涉及缓冲区管理,调度,同步等问题,实现起来比字符设备复杂的多. Linux的设备管理是和文件系统解密结合的,各种设备名称都以文件的形式存放在/dev目录下,称为设备文件.应用程序可以打开,关闭,读写这些设备文件,完成对设备的操作,就象操作普通的数据文件一样.为了管理这些设备,系统为设备编了号,每个设备号

15、又分为主设备号和次设备号.主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备.对于常用设备,Linux有约定俗成的编号,如硬盘主设备号是3.在Linux的/dev/目录下使用ls -l命令可察看个设备文件的设备号.例如,/dev/hda为块设备,主设备号3,次设备号0,是系统的第一块硬盘./dev/hd1主设备号3,次设备号1,为系统的第二块硬盘.我们将要介绍的显示设备也是一个设备文件/dev/fb,主设备号29.在编写设备驱动程序的时候,也要指明所操作设备的主设备号和次设备号. Linux的特点之一,是为所有的文件,包括设备文件,提供了统一的操作函数接口,定义如下: str

16、uct file_operations struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*read) (struct file *, char *, size_t, loff_t *); ssize_t (*write) (struct file *, const char *, size_t, loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *

17、, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (str

18、uct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (struct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *)

19、; ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); ; 结构体中的成员为一系列的接口函数,如用于读/写的read/ write函数,用于控制的ioctl等.打开一个文件就是调用这个文件file_operations中的open操作.不同类型的文件有不同的file_o

20、perations成员函数.如普通的磁盘数据文件,接口函数完成磁盘数据块读写操作;而对于各种设备文件,则最终调用各自驱动程序中的I/O函数进行具体设备的操PMT版权所有 2002 Page 2嵌入式Linux下彩色LCD驱动的设计与实现 作.这样,应用程序根本不用考虑操作的是设备还是普通文件,可一律当作文件处理,具有非常清晰统一的I/O接口.所以file_operations是文件层次的I/O接口. 但是,由于外设的种类繁多,操作方式也各不相同.如声音设备驱动要使用DMA通道,显示设备驱动要提供对显存的操作,硬盘驱动要处理复杂的缓冲区结构,网络设备驱动和socket联系紧密.如果file_op

21、erations中的函数都让驱动程序的开发人员来写,则就要处理大量的细节,几乎是不可能的.为了解决设备多样性的问题,Linux采用了特殊情况特殊处理的办法,为不同设备定义好了文件层次file_operations结构中的接口函数,其中处理了大多数设备相关的操作,如各种缓冲区的申请和释放等等,而具体操作底层硬件的一小部分则留给开发人员.所以Linux另外提供一个文件层到底层驱动程序的接口,通常为一个结构体,其中包含成员变量和函数指针.不同的设备驱动有不同的结构体.这样,一方面保证了文件层I/O接口file_operations的一致性,另一方面驱动程序的开发人员也不用了解太多细节,只专著于硬件相

22、关的I/O操作就可以了.例如,一个有代表性的特殊设备是声音设备,其文件层的file_operations定义如下: struct file_operations oss_sound_fops = owner: THIS_MODULE, llseek: sound_lseek, read: sound_read, write: sound_write, poll: sound_poll, ioctl: sound_ioctl, mmap: sound_mmap, open: sound_open, release: sound_release, ; 其中的sound_read,sound_wri

23、te等函数Linux都已提供,处理了与声音设备相关的许多细节,如DMA的申请,释放和操作等.而文件层到驱动程序的接口为audio_driver结构,其中包含底层操作函数.文件层的sound_read,sound_write会在需要时调用audio_driver中的函数.开发人员只要编写audio_driver中的函数就可以了,最大程度地减小了工作量.下面我们将看到,Linux为显示设备提供的帧缓冲驱动也是这种文件层-驱动层的接口方式. 三. Linux的帧缓冲设备 帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对

24、显示缓冲区进行读写操作.这种操作是抽象的,统一的.用户不必关心物理显存的位置,换页机制等等具体细节.这些都是由Framebuffer设备驱动来完成的.帧缓冲驱动的应用广泛,在linux的桌面系统中,Xwindow服务器就是利用帧缓冲进行窗口的绘制.尤其是通过帧缓冲可显示汉字点阵,成为Linux汉化的唯一可行方案. 帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0到/dev/fb31,而/dev/fb则为当前缺省的帧缓冲设备,通常指向/dev/fb0.当然在嵌入式系统中支持一个显示设备就够了.帧缓冲设备为

25、标准字符设备,主设备号为29,次设备号则从0到31.分别对应/dev/fb0-/dev/fb31. PMT版权所有 2002 Page 3/dev/fb0 则将图形文件tmp显示在屏幕上. 2. 映射(map)操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的.为此,Linux在文件操作 file_operations结构中提供了mmap函数,可将文件的内容映射到用户空间.对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了.实际

26、上,使用帧缓冲设备的应用程序都是通过映射操作来显示图形的.由于映射操作都是由内核来完成,下面我们将看到,帧缓冲驱动留给开发人员的工作并不多. 3. I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等.ioctl的操作是由底层的驱动程序来完成的. 在应用程序中,操作/dev/fb的一般步骤如下: 1. 打开/dev/fb设备文件. 2. 用ioctrl操作取得当前显示屏幕的参数,如屏幕分辨率,每个像素点的比特数.根据屏幕参数可计算屏幕缓冲区的大小. 3. 将屏幕缓冲区映射到用户空间. 4. 映射后就可以直接读写屏幕缓冲区,进

27、行绘图和图片显示了. 典型程序段如下: #include int main() int fbfd = 0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; long int screensize = 0; /*打开设备文件*/ fbfd = open(/dev/fb0, O_RDWR); /*取得屏幕相关参数*/ ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo); ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo); /*计算屏幕缓冲区大小*/ scre

28、ensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; /*映射屏幕缓冲区到用户地址空间*/ fbp=(char*)mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED, fbfd, 0); /*下面可通过fbp指针读写缓冲区*/ PMT版权所有 2002 Page 4 嵌入式Linux下彩色LCD驱动的设计与实现 四. 帧缓冲驱动的编写 帧缓冲设备属于字符设备,与声音设备一样,也采用文件层-驱动层的接口方式.在文件层次上,Linux为其定义了 static struct file_

29、operations fb_fops = owner: THIS_MODULE, read: fb_read, /* 读操作 */ write: fb_write, /* 写操作 */ ioctl: fb_ioctl, /* 控制操作 */ mmap: fb_mmap, /* 映射操作 */ open: fb_open, /* 打开操作 */ release: fb_release, /* 关闭操作 */ ; 其中的成员函数都在文件linux/driver/video/fbmem.c中定义. 由于显示设备的特殊性,在驱动层的接口中不但要包含底层函数,还要有一些纪录设备状态的数据.Linux为帧

30、缓冲设备定义的驱动层接口为struct fb_info结构,在include/linux/fb.h中定义.这个结构比较长,限于篇幅,文章中就不全部列出了.幸运的是,嵌入式系统要求的显示操作比较简单,只涉及到结构中少数几个成员,下面只对编写驱动中要用到的几个关键成员作一说明. fb_info中纪录了帧缓冲设备的全部信息,包括设备的设置参数,状态以及操作函数指针.每一个帧缓冲设备都必须对应一个fb_info结构.其中成员变量Modename为设备名称,fontname为显示字体,fbops为指向底层操作的函数的指针,这些函数是需要驱动程序开发人员编写的.成员fb_var_screeninfo和 f

31、b_fix_screeninfo也是结构体.其中fb_var_screeninfo记录用户可修改的显示控制器参数,包括屏幕分辨率和每个像素点的比特数.fb_var_screeninfo中的xres定义屏幕一行有多少个点, yres定义屏幕一列有多少个点, bits_per_pixel定义每个点用多少个字节表示.而fb_fix_screeninfo中记录用户不能修改的显示控制器的参数,如屏幕缓冲区的物理地址,长度.当对帧缓冲设备进行映射操作的时候,就是从fb_fix_screeninfo中取得缓冲区物理地址的.上面所说的数据成员都是需要在驱动程序中设置的. 在了解了上面所述的概念后,编写帧缓冲驱

32、动的实际工作并不复杂,需要做的工作是: 1. 编写初始化函数:初始化函数首先初始化LCD控制器,设置显示模式和显示颜色数,然后分配LCD显示缓冲区.在Linux可通过kmalloc函数分配一片连续的空间.笔者采用的LCD显示方式为240 x320,16位彩色.需要分配的显示缓冲区为240 x320 x2 = 150k字节,缓冲区通常分配在片外SDRAM中,起始地址保存在LCD控制器寄存器中. 最后是初始化一个fb_info结构,填充其中的成员变量,并调用register_framebuffer(&fb_info)将fb_info登记入内核. 2. 编写结构fb_info中函数指针fb_ops对

33、应的成员函数:对于嵌入式系统的简单实现,只需要下列三个函数就可以了: struct fb_ops PMT版权所有 2002 Page 5嵌入式Linux下彩色LCD驱动的设计与实现 . int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info); int (*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info); int (*fb_set_var)(struct fb_var_screeninfo *v

34、ar, int con,struct fb_info *info); . ; struct fb_ops在include/linux/fb.h中定义.这些函数都是用来设置/获取fb_info结构中的成员变量的.当应用程序对设备文件进行Ioctl操作时候会调用它们,读者可参考前文中的应用程序例子.例如,对于fb_get_fix(),应用程序传入的是fb_fix_screeninfo结构,在函数中对其成员变量赋值,主要是smem_start(缓冲区起始地址)和smem_len(缓冲区长度),最终返回给应用程序.而fb_set_var()函数的传入参数是fb_var_screeninfo,函数中需要

35、对xres,yres,和bits_per_pixel赋值. 驱动程序编写完成后,开发者可选择将其编译为动态加载模块,或静态地编译入内核中.由于篇幅所限,有关这方面的内容请读者参考相关驱动程序文档. 五. 结束语 由于篇幅所限,本文中仅对帧缓冲设备驱动的基本原理和框架做了简单介绍.幸运的是,在Linux的发布版本中,包含了大量的设备驱动程序源代码,其中drvers/video下提供了多种显示卡的帧缓冲设备驱动程序程序,用户自己的驱动程序可参考成熟的代码编写或直接修改得到. 参考资料 MC928MX1 User Manual Linux frame buffer driver howto 作者简介

36、 许庆丰 Libo小组发起人.现任职于摩托罗拉半导体部,主要研究方向是嵌入式操作系统和应用. Libo小组面向所有对嵌入式系统开发感兴趣的人士,旨在促进和推广嵌入式系统的应用,相关的开源技术及行业内的交流.Libo在线讨论组: /group/homepage.ecgi group_id=36725 PMT版权所有 2002 Page 6自己动手打造嵌入式Linux软硬件开发环境 Linux和uClinux 1991年8月,芬兰的一个学生在comp.os.minix新闻组贴上了以下这段话: 你好所有使用minix的人-我正在为386(486)AT做一个免费的操作系统(只是为了爱好,不会象gnu那

37、样很大很专业. 这名学生就是Linus Torvalds, 而他所说的爱好就变成我们今天知道的Linux。 由于Linux的源代码公布在互联网上,可以免费得到,因此从一开始就吸引了世界各地的UNIX 行家为Linux 编写了大量的驱动程序和应用软件,在短短几年时间里,Linux 就发展成为一个相当完善的操作系统,而且Linux支持的硬件平台是所有操作系统中最多的,目前Linux支持硬件平台:Intel的IA64、Compaq的Alpha、Sun的Sparc/Sparc64、SGI的Mips、IBM的S396、ARM、PowerPC等。Linux更大的影响在于它正逐渐地应用于嵌入式设备,uCli

38、nux正是在这种氛围下产生的。uClinux就是Micro-Control-Linux,它也是一个开放源码的项目,uClinux的源代码和开发工具可以免费从上下载得到。 uClinux是专为那些没有MMU(内存管理单元)的嵌入式处理器开发的,和主流的Linux相比,uClinux有以下的特点: 1简化了内核加载方式,uClinux的内核可以在Flash上直接运行:就是把uClinux的内核的可执行映象烧写到flash上,系统启动时从Flash的某个地址开始逐句执行;也可以加载到内存中运行:把内核的压缩文件存放在Flash上,系统启动时读取压缩文件在内存里解压,然后开始执行。 2采用了romfs

39、文件系统作为root文件系统:这种文件系统相对于一般的ext2文件系统要求更少的空间,首先内核支持romfs文件系统比支持ext2文件系统需要更少的代码,其次romfs文件系统相对简单,建立文件系统superblock需要更少的存储空间。Romfs文件系统不支持动态擦写,对于系统需要动态保存的数据采用RAM盘的方法处理,RAM盘采用ext2文件系统。 3使用了Flat可执行文件格式:elf格式有很大的文件头,flat文件对文件头和一些段信息做了简化。 4重写了应用程序库: uClibc对libc做了精简,uClinux对用户程序采用静态连接的形式。 uClinux的开发环境 为uClinux提

40、供了GNU的交叉编译器,包括以下组件:Gcc交叉编译器,即在宿主机上开发编译目标上可运行的二进制文件;Binutils辅助工具,包括objdump、as、ld等;Gdb调试器。以在ARM7上开发uClinux为例: 1获得uClinux-dist的源码包,上定期为新推出的Linux内核推出相应的源码包,最新的版本为Kernel-2.4.21,可以从/pub/uClinux/dist/ 上免费下载得到。这个源码包里包含了uCLinux-2.4.21、uClibc和已经移植到uClinux下的用户应用程序。下载完后,会得到一个uClinux-dist-20030522.tar.gz的文件,把它保存

41、到/home目录下,然后执行:tar zxvf uClinux-dist-20030522.tar.gz,当tar程序运行完毕后,在/home目录下会有一个/home/uClinux-dist的新目录,这 个目录就是uClinux的源码根目录,里面有进行uClinux开发的所有的源代码。 2获得ARM开发工具,提供uClinux源码的同时还提供相应的交叉编译工具。要在开发主机上为ARM7目标系统编译uClinux,还需要从/pub/uClinux/arm-elf-tools/ 上下载ARM交叉编译器:arm-elf-tools-20030314.sh。得到这个文件以后,执行以下命令:sh ar

42、m-elf-tools-20030314.sh,这个命令会在开发主机上自动建立一个uClinux-ARM的交叉编译环境。键入arm-elf-gcc, 如果能看到下面的输出信息: Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specsgcc version 2.95.3 20010315 (release) (ColdFire patches - 20010318 from /coldfire/)(uClinux XIP and shared lib patches from /) 表示uClinux-ARM的交叉编译环境已经

43、建立起来了。 现在开发主机里已经有了uClinux的源代码和编译这些源代码的工具,也可以用make menuconfig, make等命令来编译uClinux和用户程序,为ARM目标板编译了一个内核映像文件,接下来要做得是需要一块ARM7的开发板来运行这个映像文件(关于如何编译uClinux和用户程序请参考www.uC上得相关文档)。 构建ARM7-uClinux开发板 uClinux只需要极少的硬件资源就可运行起来,以ARM7TDMI为例,只需要以下硬件: 1CPU Samsung S3C4510B 2SDRAM 8M以上 3一个简易的串口 42M Flash 5一个以太网接口(可选) 目前

44、各嵌入式微处理器的厂商在推出每款处理器的同时都会提供一个Demo板,供用户来测试微处理器的性能。Samsung公司对S3C4510B处理器提供了一款SNDS100的Demo板。Demo板的原理图可以从Samsung公司的网站上免费下载,对这个原理图作一些修改,只保留上面列出的5个部分,去掉其他多余的部分。修改以后的原理图就是一个能够运行uClinux的ARM7目标板原理图,然后根据这个原理图去加工几张PCB板,焊上相应的元件,一块能运行uClinux的ARM7开发板就做成了(这款开发板相应得原理图、PCB图可以从上免费下载得到)。 慢着,虽然这块开发板已经焊接完成,但目前它只是一堆电子零件的简

45、单组合,要在它上面跑uClinux,还需要相应的软件来管理这些硬件。 前面提到uClinux可以从Flash中直接运行,就是说可以将uClinux的映像文件直接烧写到Flash中,然后上电,uClinux会从Flash中启动吗?是的,确实如此。现在要做的就是如何将uClinux的内核映像烧写到Flash中。用写入器将uClinux内核映像写入到Flash中,然后将Flash焊接到pcb板上或插到开发板的flash的插座上可以吗?当然可以,如果你有写入器的话。不过,很少有人手里能有这种写入器。我们需要的是一个廉价的Flash写入方案。用JTAG,S3C4510B上集成了一个JTAG,通过JTAG

46、我们可以控制S3C4510B上所有管脚,这样可以通过向JTAG接口输入相应的指令和数据,用软件的方法在S3C4510B的数据、地址和控制总线上产生出Flash器件的读写操作时序,将uClinux的内核映像文件烧写到Flash中(关于S3C4510B的JTAG接口电缆的制作和下载烧写uClinux映像文件到Flash中的程序可执行文件和源代码请参阅上相关内容)。 终于将uClinux的映像文件烧写到Flash中了,用一根串口电缆将ARM7开发板和开发主机的Com1口连接起来,从网上下载一个tip程序,执行这个命令: tip l /dev/ttyS0 s 19200 等屏幕上显示 connecte

47、d.以后,将ARM7开发板的电源接通。如果够幸运的话,你应该看到下面的信息: Linux version 2.4.20-uc0 (rootdailzh) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from /coldfire/) (uClinux XIP and shared lib patches from /) 一 5月19 23:44:11 CST 2003 Processor: Samsung S3C4510B revision 6 Architecture: SNDS100 On node 0

48、 totalpages: 4096 zone(0): 0 pages. zone(1): 4096 pages. zone(2): 0 pages. Kernel command line: root=/dev/rom0 Calibrating delay loop. 49.76 BogoMIPS Command: cat /etc/motd Welcome to uC For further information check: / uClinux在ARM7目标板上已经运行起来了,键入熟悉的ls命令,看有什么输出。 通过JTAG接口烧写uClinux映像文件到Flash中速度太慢,调试uCl

49、inux内核非常不方便,有没有其他的方法?有,uClinux除了可以从Flash中直接运行外,还可以加载到内存中运行。我们来为ARM7开发板写一个Bootloader,Bootloader的作用是初始化ARM7开发板,然后通过以太网接口将uClinux映像下载到内存中,然后从内存中运行uClinux。这种方法下载uClinux内核映像只需要10几秒,适合于开发阶段经常修改uClinux内核时使用(Bootloader for ARM7的源代码可以从 上下载得到)。调试完uClinux的内核以后,可以再通过JTAG接口烧写uClinux映像文件到Flash中,这样又可以直接从Flash中运行调试好的uClinux了。 uClinux下用户程序的开发和调试 现在ARM7开发板可以运行uClinux了,如何开发uClinux下的应用程序呢?和在普通计算机上开发

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论