U-BOOT for Mini6410 移植(这个不是我的东西,今天因为比较有空按照
http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94390里tekkamanninja
的东西写的一个文档,纯粹吃饱饭没事干,这个就是原来作者修改的,我贴出来希望大家对一些改动作些讨论可否?)
这是u-boot-2010.09 针对友善之臂MINI6410移植的最基础版本,只包含了就基本的系统引导,NAND读写,DM9000网卡等等。但是这个足够开发的方便使用。今后会陆续添加原先我为mini2440添加的所有功能。
但是此次移植并非我的功劳,首先基本的移植是由Alex Ling <kasimling at gmail.com>完成的,你可以在这里看到他提交的补丁,但是编译后无法使用,可能是因为host系统不同,对脚本的解析不同,使得spl部分的生成出现问题,只需修改一下nand_spl目录下目标板目录的中config.mk中的
PAD_TO := $(shell expr $$[$(TEXT_BASE) + 4096])
即可。
DM9000的驱动没有太大的问题(修改了一点可能出现问题的地方,感谢肖工指教),但是原本的u-boot并没有调整所有SROM控制器的配置(其中包括连接DM9000所使用的bank1的总线),我使用了友善带的u-boot的参数配置了一下就好了。
一:
http://www.icdev.com.cn/batch.viewlink.php?itemid=1694ftp://ftp.denx.de/pub/u-boot/去这2个网站随便下载都可以下载得到最新或者你想要的u-boot。现在我将下载u-boot-2010-09,这个也就是最新的版本啦。
下载后把它解压,然后得到u-boot-2010-09的文件夹,然后进去,并且做下面几件事情:
1:进入arch这个文件夹,把出arm外的前部文件夹删掉
2:进入board这个文件夹,把除samsung外前部文件夹删掉
3:进入include/configs,把除smdk6400.h外的所有文件删除。
4: 把顶层目录下有一个叫onenand_ipl的文件夹删除掉,因为没有用到。
5:进入nand_spl/board,把除samsung外全部文件删除掉。
6:再进入arch/arm/cpu文件夹,把除arm1176外其他文件夹删除掉。
7:再进入arch/arm/include/asm文件夹,把除arch-s3c64xx文件外带arch-XX的文件夹删除
8:再进入board/samsung文价夹下,把除smdk6400外其他文价夹删除掉。
至此已经把没用到或者不想见到它的文件夹跟文件删除掉了。爽吧。
二:
1:在顶层的目录下找到Makefile文件,并且打开,因为vi或者vim没用习惯而是改用gedit。
lwf@lwf-desktop:/home/u-boot-2010.12$ sudo gedit Makefile
在这个Makefile你会找到:
#########################################################################
## ARM1176 Systems
#########################################################################
smdk6400_noUSB_config \
smdk6400_config : unconfig
@mkdir -p $(obj)include $(obj)board/samsung/smdk6400
@mkdir -p $(obj)nand_spl/board/samsung/smdk6400
@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
@if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then \
echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
else \
echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
fi
@$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
然后我们可以这样为了适用我们的板子的仿照一下上面的写法于是就有这样:
#########################################################################
## ARM1176 Systems
#########################################################################
smdk6400_noUSB_config \
smdk6400_config : unconfig
@mkdir -p $(obj)include $(obj)board/samsung/smdk6400
@mkdir -p $(obj)nand_spl/board/samsung/smdk6400
@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
@if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then \
echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
else \
echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\
fi
@$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
mini6410_noUSB_config \
mini6410_config : unconfig
@mkdir -p $(obj)include $(obj)board/samsung/mini6410
@mkdir -p $(obj)nand_spl/board/samsung/mini6410
@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
@if [ -z "$(findstring mini6410_noUSB_config,$@)" ]; then \
echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/mini6410/config.tmp;\
else \
echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/mini6410/config.tmp;\
fi
@$(MKCONFIG) mini6410 arm arm1176 mini6410 samsung s3c64xx
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
上面红色部分则为添加的代码。
四:修改
arch\arm\cpu\arm1176\s3c64xx\cpu_init.S后面添加外设存储的操作
bne check_dmc1_ready
nop
#if defined(CONFIG_MINI6410)
/* ------------------------------------------------------------------------- */
#define SROM_BC1_REG_Tacs (0x0) // 0clk address set-up
#define SROM_BC1_REG_Tcos (0x4) // 4clk chip selection set-up
#define SROM_BC1_REG_Tacc (0xE) // 14clk access cycle
#define SROM_BC1_REG_Tcoh (0x1) // 1clk chip selection hold
#define SROM_BC1_REG_Tah (0x4) // 4clk address holding time
#define SROM_BC1_REG_Tacp (0x6) // 6clk page mode access cycle
#define SROM_BC1_REG_PMC (0x0) // normal(1data)page mode configuration
#define SROM_BW_REG_DATA ((1<<7) | (1<<6) | (1<<4))
#define SROM_BW_REG_BC1 (0xf << 4)
#define SROM_BC1_REG_DATA ((SROM_BC1_REG_Tacs << 28) | (SROM_BC1_REG_Tcos << 24) | \
(SROM_BC1_REG_Tacc << 16) | (SROM_BC1_REG_Tcoh << 12) | \
(SROM_BC1_REG_Tah << 8) | (SROM_BC1_REG_Tacp << 4) | \
(SROM_BC1_REG_PMC))
ldr r0, =ELFIN_SROM_BASE
ldr r1, [r0, #SROM_BW_REG_DATA]
mov r2, #(~SROM_BW_REG_BC1)
and r1, r1, r2
mov r2, #SROM_BW_REG_DATA
orr r1, r1, r2
str r1, [r0, #INDEX_SROM_BW_REG]
ldr r1, =SROM_BC1_REG_DATA
str r1, [r0, #INDEX_SROM_BC1_REG]
#endif
mov pc, lr
五:arch\arm\cpu\arm1176\s3c64xx\Makefile
修改:
include $(TOPDIR)/config.mk
LIB = $(obj)lib$(SOC).a
SOBJS = reset.o
COBJS-$(CONFIG_S3C6400) += cpu_init.o speed.o
COBJS-$(CONFIG_S3C6410) += cpu_init.o speed.o
COBJS-y += timer.o
六:arch\arm\include\asm\arch-s3c64xx\s3c64x0.h
#ifndef __S3C64XX_H__
#define __S3C64XX_H__
#if defined(CONFIG_SYNC_MODE) && (defined(CONFIG_S3C6400) || defined(CONFIG_S3C6410))
#error CONFIG_SYNC_MODE unavailable on S3C6400, please, fix your configuration!
#endif
#include <asm/types.h>
七:arch\arm\include\asm\arch-s3c64xx\s3c6400.h
define ELFIN_SROM_BASE 0x70000000
#define SROM_BW_REG __REG(ELFIN_SROM_BASE + 0x0)
#define SROM_BC0_REG __REG(ELFIN_SROM_BASE + 0x4)
#define SROM_BC1_REG __REG(ELFIN_SROM_BASE + 0x8)
#define SROM_BC2_REG __REG(ELFIN_SROM_BASE + 0xC)
#define SROM_BC3_REG __REG(ELFIN_SROM_BASE + 0x10)
#define SROM_BC4_REG __REG(ELFIN_SROM_BASE + 0x14)
#define SROM_BC5_REG __REG(ELFIN_SROM_BASE + 0x18)
#define INDEX_SROM_BW_REG 0x0
#define INDEX_SROM_BC0_REG 0x4
#define INDEX_SROM_BC1_REG 0x8
#define INDEX_SROM_BC2_REG 0xC
#define INDEX_SROM_BC3_REG 0x10
#define INDEX_SROM_BC4_REG 0x14
#define INDEX_SROM_BC5_REG 0x18
八:在board\samsung建立Mini6410的文件夹,并且把smdk6400文件里面的所有文件复制过去
board\samsung\mini6410\lowlevel_init.S
_TEXT_BASE:
.word TEXT_BASE
.globl lowlevel_init
lowlevel_init:
mov r12, lr
/* LED on only #8 */
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x55540000
str r1, [r0, #GPNCON_OFFSET]
ldr r1, =0x55555555
str r1, [r0, #GPNPUD_OFFSET]
ldr r1, =0xf000
str r1, [r0, #GPNDAT_OFFSET]
把这个上面的LED屏蔽掉
在这个添加
wakeup_reset:
/* Clear wakeup status register */
ldr r0, =(ELFIN_CLOCK_POWER_BASE + WAKEUP_STAT_OFFSET)
ldr r1, [r0]
str r1, [r0]
/* LED test */
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x3000
str r1, [r0, #GPNDAT_OFFSET]
把上面这个红色的屏蔽掉
#if !defined(CONFIG_S3C6400) && !defined(CONFIG_S3C6410)
ldr r1, [r0, #OTHERS_OFFSET]
bic r1, r1, #0xC0
orr r1, r1, #0x40
str r1, [r0, #OTHERS_OFFSET]
添加多一个标志定义!defined(CONFIG_S3C6410)
同样下面的也是添加
if defined(CONFIG_SYNC_MODE)
ldr r1, [r0, #OTHERS_OFFSET]
orr r1, r1, #0x20
str r1, [r0, #OTHERS_OFFSET]
#elif !defined(CONFIG_S3C6400) && !defined(CONFIG_S3C6410)
/* According to 661558um_S3C6400X_rev10.pdf 0x20 is reserved */
ldr r1, [r0, #OTHERS_OFFSET]
bic r1, r1, #0x20
str r1, [r0, #OTHERS_OFFSET]
#endif
mov pc, lr
board\samsung\mini6410\Makefile中
include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).a
COBJS-y := mini6410.o
SOBJS := lowlevel_init.o
board\samsung\mini6410\mini6410.c中把
头文件#include <netdev.h>屏蔽掉
并且屏蔽掉:
#define CS8900_Tacs 0x0 /* 0clk address set-up */
#define CS8900_Tcos 0x4 /* 4clk chip selection set-up */
#define CS8900_Tacc 0xE /* 14clk access cycle */
#define CS8900_Tcoh 0x1 /* 1clk chip selection hold */
#define CS8900_Tah 0x4 /* 4clk address holding time */
#define CS8900_Tacp 0x6 /* 6clk page mode access cycle */
#define CS8900_PMC 0x0 /* normal(1data)page mode configuration */
static void cs8900_pre_init(void)
{
SROM_BW_REG &= ~(0xf << 4);
SROM_BW_REG |= (1 << 7) | (1 << 6) | (1 << 4);
SROM_BC1_REG = ((CS8900_Tacs << 28) + (CS8900_Tcos << 24) +
(CS8900_Tacc << 16) + (CS8900_Tcoh << 12) +
(CS8900_Tah << 8) + (CS8900_Tacp << 4) + CS8900_PMC);
}
cs8900_pre_init();
/* NOR-flash in SROM0 */
/* Enable WAIT */
SROM_BW_REG |= 4 | 8 | 1;
int checkboard(void)
{
printf("Board: SMDK6400\n");
return 0;
}
把SMDK6400改成MINI6410
下面红色标记的也是要改成virt_to_phy_mini6410
#ifdef CONFIG_ENABLE_MMU
ulong virt_to_phy_smdk6400(ulong addr)
{
if ((0xc0000000 <= addr) && (addr < 0xc8000000))
return addr - 0xc0000000 + 0x50000000;
else
printf("do not support this address : %08lx\n", addr);
return addr;
}
#endif
屏蔽下面这段:
ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t *info)
{
if (banknum == 0) { /* non-CFI boot flash */
info->portwidth = FLASH_CFI_16BIT;
info->chipwidth = FLASH_CFI_BY16;
info->interface = FLASH_CFI_X16;
return 1;
} else
return 0;
}
把下面这个
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
return rc;
}
#endif
改成:
#ifdef CONFIG_CMD_NET
int board_eth_init(bd_t *bi)
{
int rc = 0;
#if defined(CONFIG_DRIVER_DM9000)
rc = dm9000_initialize(bi);
#endif
return rc;
}
#endif
九:drivers\net\dm9000x.c
DM9000_ior(DM9000_MRCMDX); /* Dummy read */
/* Get most updated data,
only look at bits 0:1, See application notes DM9000 */
rxbyte = DM9000_inb(DM9000_DATA) & 0x03;
//MR. xiao
#if 1
u8 temp;
temp=DM9000_ior(DM9000_MRRH);
temp=DM9000_ior(DM9000_MRRL);
#endif
//MR. xiao
增加红色的部分
十:drivers\usb\host\ohci-hcd.c 添加下面红色的部分
#if defined(CONFIG_ARM920T) || \
defined(CONFIG_S3C24X0) || \
defined(CONFIG_S3C6400) || \
defined(CONFIG_S3C6410) || \
defined(CONFIG_440EP) || \
defined(CONFIG_PCI_OHCI) || \
defined(CONFIG_MPC5200) || \
defined(CONFIG_SYS_OHCI_USE_NPS)
# define OHCI_USE_NPS /* force NoPowerSwitching mode */
#endif
十一:include\configs\mini6410.h
这个mini6410.h,自己建设一个,内容复制copy的就可以了。
然后打开mini6410.h修改如下:
//#define CONFIG_S3C6400 1 /* in a SAMSUNG S3C6400 SoC */
#define CONFIG_S3C6410 1 /* in a SAMSUNG S3C6410 SoC */
#define CONFIG_S3C64XX 1 /* in a SAMSUNG S3C64XX Family */
#define CONFIG_MINI6410 1 /* on a FriendlyARM MINI6410 Board */
*
* Architecture magic and machine type
*/
#define MACH_TYPE 2520
这个机械ID 我不知道为什么要改成2520 错了 内核是驱动不了的。
把CS89的网卡干掉 换成这样:
/*
* Hardware drivers
*/
#define CONFIG_NET_MULTI 1
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_NO_SROM 1
#define CONFIG_DM9000_USE_16BIT 1
#define CONFIG_DM9000_BASE 0x18000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+4)
#define CONFIG_ETHADDR 08:08:10:12:10:27
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.253
#define CONFIG_SERVERIP 192.168.1.159
#define CONFIG_GATEWAYIP 192.168.1.1
/*
* select serial console configuration
*/
添加下面的宏(红色部分)
#define CONFIG_CMD_PING
#define CONFIG_CMD_ELF
#define CONFIG_CMD_FAT
#define CONFIG_CMD_EXT2
#undef CONFIG_CMD_IMLS
#define CONFIG_BOOTDELAY 3
/*
* Miscellaneous configurable options
*/
#define CONFIG_SYS_LONGHELP /* undef to save memory */
#define CONFIG_SYS_PROMPT "MINI6410 # " /* Monitor Command Prompt */
改成你自己喜欢的提示字符 这里是"MINI6410 # "
**********************************
Support Clock Settings
**********************************
Setting SYNC ASYNC
----------------------------------
667_133_66 X O
533_133_66 O O
400_133_66 X O
400_100_50 O O
**********************************/
#define CONFIG_CLK_667_133_66
/*#define CONFIG_CLK_533_133_66*/
提高主频
把下面的全部删除掉
把#define CONFIG_SYS_FLASH_CFI 1 /* Use CFI parameters (needed?) */
换成#define CONFIG_SYS_NO_FLASH
*-----------------------------------------------------------------------
* FLASH and environment organization
*/
#define CONFIG_SYS_MAX_FLASH_BANKS 1 /* max number of memory banks */
/* AM29LV160B has 35 sectors, AM29LV800B - 19 */
#define CONFIG_SYS_MAX_FLASH_SECT 40
#define CONFIG_AMD_LV800
#define CONFIG_SYS_FLASH_CFI 1 /* Use CFI parameters (needed?) */
/* Use drivers/cfi_flash.c, even though the flash is not CFI-compliant */
#define CONFIG_FLASH_CFI_DRIVER 1
#define CONFIG_SYS_FLASH_CFI_WIDTH FLASH_CFI_16BIT
#define CONFIG_FLASH_CFI_LEGACY
#define CONFIG_SYS_FLASH_LEGACY_512Kx16
/* timeout values are in ticks */
#define CONFIG_SYS_FLASH_ERASE_TOUT (5 * CONFIG_SYS_HZ) /* Timeout for Flash Erase */
#define CONFIG_SYS_FLASH_WRITE_TOUT (5 * CONFIG_SYS_HZ) /* Timeout for Flash Write */
#define CONFIG_IDENT_STRING " for SMDK6400" 改成
#define CONFIG_IDENT_STRING " for MINI6410"
十二:include\common.h
添加如下:
#ifdef CONFIG_4xx
ulong get_OPB_freq (void);
ulong get_PCI_freq (void);
#endif
#if defined(CONFIG_S3C24X0) || \
defined(CONFIG_LH7A40X) || \
defined(CONFIG_S3C6400) || \
defined(CONFIG_S3C6410) || \
defined(CONFIG_EP93XX)
ulong get_FCLK (void);
ulong get_HCLK (void);
ulong get_PCLK (void);
ulong get_UCLK (void);
#endif
十三:顶层的MAKEALL
#########################################################################
## ARM11 Systems
#########################################################################
LIST_ARM11=" \
cp1136 \
omap2420h4 \
apollon \
imx31_litekit \
imx31_phycore \
imx31_phycore_eet \
mx31ads \
mx31pdk \
mx31pdk_nand \
qong \
smdk6400 \
tnetv107x_evm \
mini6410 \
"
十四:顶层的MAINTAINERS
Alex Züpke <
azu@sysgo.de>
lart SA1100
dnp1110 SA1110
Alex Ling <kasimling at gmail.com>
MINI6410 ARM1176JZF-S (S3C6410)
十五:
nand_spl\board\samsung\mini6410\config.mk
修改为:
# FriendlyARM MINI6410 development board, based on
# Samsung S3C64xx Reference Platform (smdk6400) board
# TEXT_BASE for SPL:
#
# On S3C64xx platforms the SPL is located in SRAM at 0.
#
# TEXT_BASE = 0
include $(TOPDIR)/board/$(BOARDDIR)/config.mk
# PAD_TO used to generate a 4kByte binary needed for the combined image
# -> PAD_TO = TEXT_BASE + 4096
PAD_TO := $(shell expr $(TEXT_BASE) + 4096)
ifeq ($(debug),1)
PLATFORM_CPPFLAGS += -DDEBUG
endif
在nand_spl\board\samsung\mini6410这个mini6410是仿照里面的SMDK6400做的内容一样复制然后如下面的修改就可以
nand_spl\board\samsung\mini6410\Makefile中:
# from board directory
$(obj)lowlevel_init.S:
@rm -f $@
@ln -s $(TOPDIR)/board/samsung/smdk6400/lowlevel_init.S $@
改为:
# from board directory
$(obj)lowlevel_init.S:
@rm -f $@
@ln -s $(TOPDIR)/board/samsung/mini6410/lowlevel_init.S $@