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

Posted 咕唧咕唧shuboLK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了u-boot for tiny210 version2.0(by liukun321咕唧咕唧)相关的知识,希望对你有一定的参考价值。

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

也可以参照 version1 从头构建tiny210的uboot 。   源码下载: u-boot for tiny210 version2.0   下面链接提供了较新版本和较老版本的下载链接:

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:      

以上是关于u-boot for tiny210 version2.0(by liukun321咕唧咕唧)的主要内容,如果未能解决你的问题,请参考以下文章

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

tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——移植u-boot.bin(打印串口控制台)

U-Boot番外篇 | fdt介绍

U-Boot番外篇 | relocation介绍

U-Boot番外篇 | global_data介绍

Tiny4412 u-boot分析u-boot配置流程分析