目前,uClinux已被成功移植到S3C4510B及其他多款ARM芯片上,但由于嵌入式操作系统的运行是与嵌入式系统的硬件密切相关的,而硬件的设计则会因为使用场合的不同而千差万别,因此,在uClinux内核源代码中和硬件紧密相关的部分就应该针对特定的硬件作出适当的修改,由于uClinux内核源代码包含很大一部分的硬件驱动程序,不可能一一列举,在此,就基于S3C4510B的最小系统的设计与运行相关的部分作简单的介绍,希望对读者有所启发。
uClinux内核源代码中对S3C4510B片内特殊功能寄存器以及其他相关硬件信息的定义位于uClinux-Samsung\Linux-2.4.x\include\asm-armnommu\arch-samsung\hardware.h文件中,其中有几个地方值得注意:
/*
* define S3C4510b CPU master clock
*/
#define MHz 1000000
#define fMCLK_MHz (50 * MHz)
#define fMCLK (fMCLK_MHz / MHz)
#define MCLK2 (fMCLK_MHz / 2)
以上定义了系统工作的主时钟频率为50MHz,若用户系统的工作频率不同,应在此处修改,若串行口采用内部时钟信号用于波特率生成,该频率同时还与串行通信波特率有关。
/**********************************/
/* System Memory Control Register */
/**********************************/
#define DSR0 (2<<0) /* ROM Bank0 */
#define DSR1 (0<<2) /* 0: Disable, 1: Byte, 2: Half-Word, 3: Word */
#define DSR2 (0<<4)
#define DSR3 (0<<6)
#define DSR4 (0<<8)
#define DSR5 (0<<10)
#define DSD0 (2<<12) /* RAM Bank0 */
#define DSD1 (0<<14)
#define DSD2 (0<<16)
#define DSD3 (0<<18)
#define DSX0 (0<<20) /* EXTIO0 */
#define DSX1 (0<<22)
#define DSX2 (0<<24)
#define DSX3 (0<<26)
#define rEXTDBWTH (DSR0|DSR1|DSR2|DSR3|DSR4|DSR5 | DSD0|DSD1|DSD2|DSD3 | DSX0|DSX1|DSX2|DSX3)
以上定义了系统存储器控制寄存器,按照以上定义,ROM/SRAM/FLASH Bank0定义为16位数据宽度(事实上,ROM/SRAM/FLASH Bank0的数据宽度由B0SIZE[1:0]的状态决定),而ROM/SRAM/FLASH Bank1~ROM/SRAM/FLASH Bank5禁用;DRAM/SDRAM Bank0定义为16位数据宽度,DRAM/SDRAM Bank1~DRAM/SDRAM Bank3禁用;外部I/O组全部禁用;若用户系统的存储器系统配置不同,应在此处修改。
之后还做了其他一些改动,包括对ROM/SRAM/FLASH Bank0控制寄存器的设置,Flash容量的设置,DRAM/SDRAM Bank0控制寄存器的设置,SDRAM容量的设置等,这些设置均应该与用户系统对应。