新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于数字电视系统的嵌入式linux操作系统实现

基于数字电视系统的嵌入式linux操作系统实现

作者: 时间:2013-04-06 来源:网络 收藏



图2 MCU和I2C总线之间的连接

4.系统移植

在这一部分中,我们将解释的移植顺序。包括修改内核初始化代码和编写设备驱动程序。

4.1重建内核初始化代码

为了将内核加载到嵌入式系统中,有必要修改与硬件相关的内核初始化代码。这个过程包括设置存储器映射以便加载内核映像,以及为支持内核的运行而修改设备驱动程序。

4.1.1设置存储器映射

Linux内核映像是一种压缩文件,存放在flash存储器中,执行时被拷贝到SDRAM中并解压。图3描述了内存映像的加载顺序。


系统复位时,CPU只能接受flash ROM空间的代码,同时执行位于flash ROM底层的bootloader,它负责从主机端下载代码并且将代码存储到flashROM中。

1)bootloader将主机的linux内核拷贝到数字处理模块上的SDRAM中。

2)SDRAM中被下载的linux内核映像被存储在flash ROM中位于bootloader顶层的空间中。

3)系统初始化,同时,bootloader调用linux映像内的一段执行代码(head.o),将全部flash ROM空间中的内容拷贝到SDRAM中。

4)CPU利用系统管理寄存器,将flash ROM中的初始地址空间与SDRAM的初始地址空间相交换。
当flash ROM中的映像被加载到SDRAM之后,无需改变程序计数器就可以执行代码(head.o)。图4中显示了最终的存储器映射。

拷贝到SDRAM中的linux映像可解压执行,为了完成释放功能,需要一些存储器空间,例如符号开始段、用户堆栈、分配的内存等。在这些空间中,一个压缩的linux内核映像被解压工具释放出来,被释放的代码位于被分配的内存空间的下一地址。

4.1.2 内核需要的设备

内核需要的基本设备包括中断控制器、定时器和控制台设备。这些设备被映像到MCU的内部寄存器中,通过修改内部寄存器而提供必要的功能。

4.2设备驱动的设计

包括视频处理设备和模拟输出设备以及内核所必须的设备,本文为I2C总线接口(PCF8584)设计一个设备驱动。PCF8584设备驱动包括接口模块、内核模块、算法模块、适配器模块,如图5所示。

接口模块提供设备驱动程序与应用程序之间的接口,定义设备文件操作(open, read, write, ioctl,release)以及初始化设备文件(/dev/i2c0);内核模块用来增加或移除适配器、定义I2C总线的功能以及初始化包含系统信息的文件系统(/proc);算法模块用来初始化PCF8584设备以及定义PCF8584的函数(i2c_start,i2c_stop(), wait_for_pin());适配器模块通过被映射到MCU的存储器地址将数据传送到MCU。

为了驱动PCF8584接口设备,需要对模块进行初始化。在通常的linux系统中,设备驱动在运行时载入和初始化,而在嵌入式linux系统中,设备驱动将在启动阶段被加载和初始化。4个模块的初始化程序被存储在“.init”段的“_init”处,由“do_initcalls()”函数在启动时调用执行。控制数据从接口模块开始,依次经内核模块、算法模块、适配器模块传送。接口模块接收应用程序的请求(open, write, read, ioctl),调用内核模块的接口程序(master_send(), master_receive(),transfer()),同时传递参数。内核模块将从地址、标记位、信息长度等数据传送到算法模块。算法模块检查I2C总线的状态和从地址,设置PCF8584的控制寄存器。最后,适配器模块从被映射到外部总线的地址空间中读写数据。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭