基於友善的superboot 移植linux內核到tiny210(s5pv210)上

 友善提供的開發板光盤裏已經提供了友善官方移植的內核,但是爲了自己的開發方便,並且防止受到友善的干擾,移植一個基於友善的super boot的內核。

   super-boot(友善官方提供)

   內核(3.4.2)

   根文件系統nfs(韋老師提供,網上很多)

 

1. super-boot 參數配置

友善的super-boot是不開源的,但是我們可以修改其提供的參數bootargs來修改啓動命令:

修改命令如下:

################### Linux ####################
Linux-BootLoader = Superboot210.bin
Linux-Kernel = Linux/zImage
#Linux-CommandLine = root=/dev/mtdblock4   rootfstype=yaffs2 console=ttySAC0,115200 init=/linuxrc skipcali=yes ctp=3
Linux-CommandLine = console=ttySAC0,115200   root=/dev/nfs nfsroot=192.168.1.5:/home/book/Codes/fs_mini_mdev_new ip=192.168.1.230:192.168.1.5:192.168.1.5:255.255.255.0:linux.arm9.net:eth0:off  skipcali=yes ctp=3
#Linux-RootFs-InstallImage = Linux/rootfs_qtopia_qt4-mlc2.img


其中# 是註釋符號 ,這裏的參數配置時一定要細心。

 

2.  移植新版本的內核。

從kernel org 中下載下來最新的內核:

2.1. 解壓下來後修改根目錄下的Makefile :

ARCH            ?= arm
CROSS_COMPILE   ?= arm-linux-


2.2.修改配置,使用和tiny210最相似的開發板配置.執行如下命令:

make    s5pv210_defconfig


2.3. 執行make 命令生成zImage

make

這裏用於生成對應superboot的鏡像,因此必須生成zImage

 

2.4. 修改內核串口配置

經過上面三步的命令後,就可以燒寫和啓動kernel了,但是此時終端上除了打印loading kernel之外就再無打印信息了,原因是kernel默認的串口是串口1,需要將

其改爲串口0,執行make menuconfig,修改串口配置:

system type
  (0) S3C UART to use for low-level messages 

編輯此項爲0 ,此時重新燒寫zImage ,就能看到終端輸出了。

 

2.5. 修改機器碼

經過上面的步驟之後,終端會有輸出,但是輸出的信息會提示你機器碼不正確。

superboot在啓動內核時一開始會比較superboot中的機器碼和內核提供的機器碼是否匹配。顯然這裏內核的機器碼和superboot中並不匹配

修改:內核支持的機器碼:

由於superboot不開源,所以只能修改內核中的機器碼:

打開include/generated/mach-types.h文件: 修改:

//#define MACH_TYPE_SMDKV210             2456
#define MACH_TYPE_SMDKV210             3466

重新編譯燒寫,此時就能kernel就能正常跑下去了。

 

2.6 移植dm9000網卡驅動程序。

網卡驅動程序的移植其實很簡單,由於其接口是內存型接口,一般只要修改其中斷引腳號和內存片地址就行。

參考友善提供的mach-mini210.c修改:

arch\arm\mach-s5pv210\Mach-smdkv210.c

#define S5PV210_PA_DM9000_A		(0x88001000)
#define S5PV210_PA_DM9000_F		(S5PV210_PA_DM9000_A + 0x300C)

static struct resource smdkv210_dm9000_resources[] = {
	[0] = {
		.start	= S5PV210_PA_DM9000_A,// 片選地址
		.end	= S5PV210_PA_DM9000_A + SZ_1K*4 - 1,
		.flags	= IORESOURCE_MEM,
	},
	[1] = {
		.start	= S5PV210_PA_DM9000_F,
		.end	= S5PV210_PA_DM9000_F + SZ_1K*4 - 1,
		.flags	= IORESOURCE_MEM,
	},
	[2] = {
		.start	= IRQ_EINT(7),  // 中斷號
		.end	= IRQ_EINT(7),
		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
	},
};

static struct dm9000_plat_data smdkv210_dm9000_platdata = {
	.flags		= DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
	.dev_addr	= { 0x08, 0x90, 0x00, 0xa0, 0x02, 0x10 },
};
static struct platform_device smdkv210_dm9000 = {
	.name		= "dm9000",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(smdkv210_dm9000_resources),
	.resource	= smdkv210_dm9000_resources,
	.dev		= {
		.platform_data	= &smdkv210_dm9000_platdata,
	},
};
static void __init smdkv210_dm9000_init(void)
{
	unsigned int tmp;

	gpio_request(S5PV210_MP01(1), "nCS1"); // 這裏需要修改
	s3c_gpio_cfgpin(S5PV210_MP01(1), S3C_GPIO_SFN(2)); 
	gpio_free(S5PV210_MP01(1));

	tmp = (5 << S5P_SROM_BCX__TACC__SHIFT);
	__raw_writel(tmp, S5P_SROM_BC1);

	tmp = __raw_readl(S5P_SROM_BW);
	tmp &= (S5P_SROM_BW__CS_MASK << S5P_SROM_BW__NCS5__SHIFT);
	tmp |= (1 << S5P_SROM_BW__NCS1__SHIFT);
	__raw_writel(tmp, S5P_SROM_BW);

}

這裏附上原理圖: 作爲參照:

移植好網卡驅動程序,並且創建好你的根文件系統就能正常啓動了。

 

 

3 移植網絡文件系統

這部分網上資料很多,我直接拿的韋東山老師移植好的文件系統或者您也可以使用友善提供的qt的文件系統都是可以的。

 

 


 

 

 


 

 


 

 

 

 

     

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章