现在的位置: 首页 > 综合 > 正文

u-boot for tiny210 version2.0(by liukun321咕唧咕唧)

2013年08月14日 ⁄ 综合 ⁄ 共 4698字 ⁄ 字号 评论关闭

 version2.0是根据我上一个版本的uboot修改而来的,可以下载源码u-boot for tiny210 version1 后参照下面的内容进行修改 。

也可以参照version1 从头构建tiny210的uboot 。
 
 
下面链接提供了较新版本和较老版本的下载链接:

ver2.1源码下载:u-boot for tiny210 ver2.1

ver1.0源码下载:u-boot for tiny210 ver1.0

 
 
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
可以参考我的另一篇blog
uboot命令自动补全
.
 
至此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:
 
 
 
PS: 本来u-boot for tiny210 会更新的快些,可是开学以后发现周围的同学都在玩命复习,我也不淡定了,这学期主要精力会用在复习考研,每周只拿出一下午的时间完善tiny210的u-boot,Android恐怕没时间弄了.
 
 
 

抱歉!评论已关闭.