S3c44B0在uClinux中需要修改的文件一.内核基本文件的修改 1.uClinux-Samsung\vendors\Samsung\S3C44B0
“config.linux-2.4.x”这个是linux内核编译配置选项文件。
# System Type
#
# CONFIG_ARCH_DSC21 is not set
# CONFIG_ARCH_CNXT is not set
# CONFIG_ARCH_SWARM is not set
#CONFIG_ARCH_SAMSUNG=y
CONFIG_ARCH_MBA44B0=y
# CONFIG_ARCH_ATMEL is not set
CONFIG_NO_PGT_CACHE=y
CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
CONFIG_CPU_ARM710=y
CONFIG_CPU_WITH_CACHE=y
# CONFIG_CPU_WITH_MCR_INSTRUCTION is not set
CONFIG_SERIAL_44B0=y
#CONFIG_SET_MEM_SAMSUNG=y
DRAM_BASE=0x0c000000 #SDRAM起始是地址
DRAM_SIZE=0x01000000 #SDRAM大小16M
FLASH_MEM_BASE=0x00000000 #FLASH起始地址
FLASH_SIZE=0x00200000 #FLASH大小2M
#
# General setup
以后的make都以CONFIG_ARCH_S3C44B0=y这选项来解决是编译和S3C44B0相关的其他选项。
2.arch/armnommu/Makefie:
ifeq ($(CONFIG_ARCH_S3C44B0),y)
TEXTADDR = 0x0c008000
MACHINE = s3c44b0
endif
TEXTADDR = 0x0c008000表明未压缩的内核的位置
3.arch/armnommu/boot/Makefie:
ifeq ($(CONFIG_ARCH_S3C44B0),y)
ZRELADDR = 0x0c008000
ZTEXTADDR = 0x0c300000
endif
ZRELADDR = 0x0c008000表明未压缩的内核的位置
ZTEXTADDR = 0x0c300000表明压缩内核的位置
4.include/asm-armnommu//proc-armv/system.h
#ifdef CONFIG_ARCH_S3C44B0
#undef vectors_base()
#define vectors_base() (0x0c000008)
#endif
5.arch/armnommu/mach-s3c44b0/arch.c
MACHINE_START(MBA44B0, "S3C44B0")
MAINTAINER("Mac Wang")
BOOT_MEM(0x0c000000, 0x01c00000, 0x01c00000)
BOOT_PARAMS(0x0c000100)
INITIRQ(genarch_init_irq)
MACHINE_END
其中MACHINE_START(MBA44B0, "S3C44B0")的“MBA44B0”是在asm/mach-types.h 里定义的平台类型BOOT_MEM(0x0c000000, 0x01c00000, 0x01c00000)指定了启动的RAM 地址0x0c000000,特殊功能寄存器地址0x01c00000,BOOT_PARAMS(0x0c000100) 表示内核参数的传递地址。
6.arch/armnommu/tools/Match-types
s3c44b0 ARCH_S3C44B0 S3C44B0 178
178是arch_number
在跳转到内核时,r0=0,r1=arch_number,
7./driver/net/ne.c
dev->base_addr = base_addr = NE2000_ADDR;
dev->irq = NE2000_IRQ_VECTOR;
NE2000_ADDR和NE2000_IRQ_VECTOR分别是RTL8019AS的I/O起始地址和中断向量号,根据硬件连接改成相应的值。
ne_probe1中wordlength=2代表数据宽度为16位,改为wordlength=1代表数据宽度为8位。
二.内核和romfs联系的两种方式
1 使用inird技术,在加载内核前传递参数
static void setup_initrd_tag(void)
{
/* an ATAG_INITRD node tells the kernel where the compressed
* ramdisk can be found. ATAG_RDIMG is a better name, actually.
*/
params->hdr.tag = A TAG_INITRD;
params->hdr.size = tag_size(tag_initrd);
params->u.initrd.start = RAMDISK_RAM_BASE;
params->u.initrd.size = RAMDISK_FLASH_LEN;//k byte
params = tag_next(params);
}
此时initrd的第一个初始化文件为linuxrc,这种方式下romfs根目录下需包含linuxrc。
2 用block memory技术
(make menuconfig时选定romfs 和rom disk support)
driver/block/Blkmem.c
arena[] = {
#ifdef CONFIG_ARCH_S3C44B0
{0, 0x0CC00000, -1},
#endif这样只要将romfs加载到相应的地址0x0CC00000,内核就可以找到。
3 整合kernel和romfs
在调试好内核和ROMFS之后,可以将两个文件整合起来
char romfs_data[];
arena[] = {
#ifdef CONFIG_ARCH_ S3C44B0
{0, romfs_data, -1},
#endif
将romfs.img 转换成romfs.o文件与内核编译在一起,
arch/armnommu/Vmlinux-armv.lds.in
*(.got) /* Global offset table */
romfs_data = .;
romfs.o
romfs_data_end = .;
这样在压缩内核时,romfs和kernel都能被压缩。
以上只是一种实现方法,只要掌握了原理,可以根据自己的需要修改。
在相关的地方必须保持内核和BOOTLOADER一致才行。