version2.0是根据我上一个版本的uboot修改而来的,可以下载源码u-boot for tiny210 version1 后参照下面的内容进行修改 。
下面链接提供了较新版本和较老版本的下载链接:
version2实现的基本功能:
1. SD boot,基于linaro u-boot的SPL功能实现
2. 从SD卡的FAT分区上加载文件到SDRAM
3. 将环境变量保存至SD卡(有Writing to MMC(0)... mmc_send_cmd: error during transfer: 0x00208001 mmc write failed), 但数据保存是成功的,后续会修改。
+4. 添加DM9000网卡驱动,开启网络功能(例如:tftp,nfs等)
+5. 添加TAB键命令自动补全功能
网络部分修改过程:
1. 在include/configs/tiny210.h 添加下述宏
#define DM9000_16BIT_DATA
#define CONFIG_CMD_NET
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_NET_MULTI 1
#define CONFIG_NET_RETRY_COUNT 1
#define CONFIG_DM9000_NO_SROM 1
#ifdef CONFIG_DRIVER_DM9000
#define CONFIG_DM9000_BASE (0x88001000)
#define DM9000_IO (CONFIG_DM9000_BASE)
#if defined(DM9000_16BIT_DATA)
#define DM9000_DATA (CONFIG_DM9000_BASE+0x300C)
#else
#define DM9000_DATA (CONFIG_DM9000_BASE+1)
#endif
#endif
#define CFG_PHY_UBOOT_BASE MEMORY_BASE_ADDRESS + 0x3e00000
#define CFG_PHY_KERNEL_BASE MEMORY_BASE_ADDRESS + 0x8000
#define CONFIG_ETHADDR 00:40:5c:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.186.13
#define CONFIG_SERVERIP 192.168.186.13
#define CONFIG_GATEWAYIP 192.168.0.1
#define CONFIG_CMD_DATE
#define CONFIG_ENV_OVERWRITE
#define CONFIG_OVERWRITE_ETHADDR_ONCE
123行:
#if 0
#undef CONFIG_CMD_NET
#undef CONFIG_CMD_NFS
#endif
红字部分与dm9000 相关的关键内容. 下面对关键部分作简要分析:
dm9000挂载的位置通过下图可以得到,并确定dm9000工作在16bit 模式,需定义
#define DM9000_16BIT_DATA
nCS1是SROMC_BANK1的片选线,可见dm9000是挂在SROMC_BANK1区域的,再根据datasheet可以推算出,dm9000挂载的位置,参见下图:
另外根据友善提供的linux-2.6.35 内核,参考其中dm9000的初始化配置,
#define S5PV210_PA_DM9000_A (0x88001000)
#define S5PV210_PA_DM9000_F (S5PV210_PA_DM9000_A + 0x300C)
static struct resource 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,
},
};
可以分别得到
#define CONFIG_DM9000_BASE (0x88001000)
#define DM9000_IO (CONFIG_DM9000_BASE)
#define DM9000_DATA (CONFIG_DM9000_BASE+0x300C)
2.修改common/cmd_date.c
+32
:#if !defined(CONFIG_S5PC100) && !defined(CONFIG_S5PC110) && !defined(CONFIG_S5P6442)
+229
:#endif
3.修改 board/samsung/tiny210/tiny210.c
(1)
添加#include <netdev.h>//有int board_eth_init(bd_t *bis)的函数声明
(2)屏蔽掉下面smc9115_pre_init(); 函数的调用
158:
int board_init(void)
{
/* Set Initial global variables */
s5pc110_gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
// smc9115_pre_init();
pwm_pre_init();
#ifdef CONFIG_DRIVER_DM9000
dm9000_pre_init();
#endif
gd->bd->bi_arch_number = CONFIG_MACH_TYPE;
gd->bd->bi_boot_params = (PHYS_SDRAM_1+0x100);
return 0;
}
(3)243:添加int board_eth_init(bd_t *bis)函数
int board_eth_init(bd_t *bis)
{
int rc = 0;
#ifdef CONFIG_DRIVER_DM9000
rc = dm9000_initialize(bis);
#endif
return rc;
}
(4)修改 115: static void dm9000_pre_init(void) 函数,参考linux内核及datasheet,
可作如下修改.
static void dm9000_pre_init(void)
{
unsigned int tmp;
#if defined(DM9000_16BIT_DATA)
//SROM_BW_REG &= ~(0xf << 20);
//SROM_BW_REG |= (0<<23) | (0<<22) | (0<<21) | (1<<20);
SROM_BW_REG &= ~(0xf << 4);
SROM_BW_REG |= (0x1 << 4);
#else
SROM_BW_REG &= ~(0xf << 20);
SROM_BW_REG |= (0<<19) | (0<<18) | (0<<16);
#endif
SROM_BC1_REG = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));
tmp = MP01CON_REG;
tmp &=~(0xf<<4);
tmp |=(2<<4);
MP01CON_REG = tmp;
}
3.修改driver/net/dm9000x.c
551:
static void dm9000_get_enetaddr(struct eth_device *dev)
{
#if !defined(CONFIG_DM9000_NO_SROM)
int i;
for (i = 0; i < 3; i++)
dm9000_read_srom_word(i, dev->enetaddr + (2 * i));
#else
if (!eth_getenv_enetaddr("ethaddr", mac_addr)) {
printf("Please set ethaddr!\n");
}
//memcpy(dev->enetaddr, "\x08\x90\x90\x90\x90\x90", 6);
#endif
}
4.修改/net/eth.h
308:
if (
!eth_write_hwaddr(dev, "eth", eth_number))
puts("Warning: failed to set MAC address\n");
TAB键命令补全修改过程:
在include/configs/tiny210.h 添加下述宏
/*auto complete command*/
#define CONFIG_CMDLINE_EDITING
#define CONFIG_AUTO_COMPLETE 实现
#define CONFIG_SYS_HUSH_PARSER
至此version2 修改完成.
编译u-boot
$make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- tiny210_config
$make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- all spl
由于我的系统下装有两套交叉工具链,所以没有把
/opt/FriendlyARM/toolschain/4.5.1/bin/ 添加到环境变量,在使用工具链时要指明路径。
将u-boot镜像写入SD卡
将SD卡通过读卡器接上电脑(或直接插入笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是/dev/sdb.
执行下面的命令
$sudo dd iflag=dsync oflag=dsync if=spl/tiny210-spl.bin of=/dev/sdb seek=1
$sudo dd iflag=dsync oflag=dsync if=u-boot.bin of=/dev/sdb seek=49
将SD卡插入开发板启动:
启动:
测试ping:
测试tftp: