tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——NAND 启动

我们知道 s5pv210启动方式有很多种,sd卡和nand flash 启动就是其中的两种,前面我们实现的都是基于sd卡启动,这节我们开始实现从nand flash 启动:  

    从 NAND 启动 u-boot,需要 BL1 初始化 NAND 控制器,然后从 NAND 拷贝 BL2 到 DDR 内存。这里的BL1 即我们移植的 u-boot-spl.bin,BL2 即我们移植的 u-boot.bin。在 u-boot.bin 中的 NAND 驱动比较大,它包含了很多功能,而 u-boot-spl.bin 中只需要从 NAND 拷贝BL2 到 DDR 就行了,因此我们可以在 u-boot-spl.bin 进行简单的 NAND 控制器初始化,然后使用三星提供的带 8 位硬件 ECC 的 NAND 拷贝函数来拷贝 u-boot.bin 到 DDR 内存。我们修改 board/samsung/tiny210/tiny210.c 中的 copy_bl2_to_ram 函数,在这个函数中首先判断当前是从 SD 卡启动还是从 NAND 启动,如果是从 NAND 启动则进行 NAND 初始化,然后从 NAND 拷贝BL2 到 DDR 内存,如果是从 SD 卡启动,则从 SD 卡拷贝 BL2 到 DDR 内存。我们通过读取 OMR 寄存器来判断 S5PV210 当前是从哪个设备启动的。参考手册 Table  6-3,手册上并没有说 OM  寄存器的地址,我是参考的三星原厂的 u-boot 代码。代码中都有详细注释,具体请看代码:

[cpp]  view plain copy
  1. void copy_bl2_to_ram(void)  
  2. {  
  3. /* 
  4. ** ch:  通道 
  5. ** sb:  起始块 
  6. ** bs:  块大小 
  7. ** dst: 目的地 
  8. ** i:   是否初始化 
  9. */  
  10. #define CopySDMMCtoMem(ch, sb, bs, dst, i) \  
  11.     (((u8(*)(int, u32, unsigned short, u32*, u8))\  
  12.     (*((u32 *)0xD0037F98)))(ch, sb, bs, dst, i))  
  13.       
  14. #define MP0_1CON  (*(volatile u32 *)0xE02002E0)  
  15. #define MP0_3CON  (*(volatile u32 *)0xE0200320)  
  16. #define MP0_6CON  (*(volatile u32 *)0xE0200380)   
  17.   
  18. #define NF8_ReadPage_Adv(a,b,c) (((int(*)(u32, u32, u8*))(*((u32 *)0xD0037F90)))(a,b,c))  
  19.       
  20.     u32 bl2Size = 250 * 1024;   // 250K  
  21.       
  22.     u32 OM = *(volatile u32 *)(0xE0000004); // OM Register  
  23.     OM &= 0x1F;                 // 取低5位  
  24.       
  25.     if (OM == 0x2)              // NAND 2 KB, 5cycle 8-bit ECC  
  26.     {  
  27.         u32 cfg = 0;  
  28.         struct s5pv210_nand *nand_reg = (struct s5pv210_nand *)(struct s5pv210_nand *)samsung_get_base_nand();  
  29.           
  30.         /* initialize hardware */  
  31.         /* HCLK_PSYS=133MHz(7.5ns) */  
  32.         cfg =   (0x1 << 23) | /* Disable 1-bit and 4-bit ECC */  
  33.                 /* 下面3个时间参数稍微比计算出的值大些(我这里依次加1),否则读写不稳定 */  
  34.                 (0x3 << 12) | /* 7.5ns * 2 > 12ns tALS tCLS */  
  35.                 (0x2 << 8) |  /* (1+1) * 7.5ns > 12ns (tWP) */  
  36.                 (0x1 << 4) |  /* (0+1) * 7.5 > 5ns (tCLH/tALH) */  
  37.                 (0x0 << 3) |  /* SLC NAND Flash */  
  38.                 (0x0 << 2) |  /* 2KBytes/Page */  
  39.                 (0x1 << 1);       /* 5 address cycle */  
  40.       
  41.         writel(cfg, &nand_reg->nfconf);  
  42.           
  43.         writel((0x1 << 1) | (0x1 << 0), &nand_reg->nfcont);  
  44.         /* Disable chip select and Enable NAND Flash Controller */  
  45.       
  46.         /* Config GPIO */  
  47.         MP0_1CON &= ~(0xFFFF << 8);  
  48.         MP0_1CON |= (0x3333 << 8);  
  49.         MP0_3CON = 0x22222222;  
  50.         MP0_6CON = 0x22222222;        
  51.           
  52.         int i = 0;  
  53.         int pages = bl2Size / 2048;     // 多少页  
  54.         int offset = 0x4000 / 2048;         // u-boot.bin在NAND中的偏移地址(页地址)  
  55.         u8 *p = (u8 *)CONFIG_SYS_SDRAM_BASE;  
  56.         for (; i < pages; i++, p += 2048, offset += 1)  
  57.             NF8_ReadPage_Adv(offset / 64, offset % 64, p);  
  58.     }  
  59.     else if (OM == 0xC)     // SD/MMC  
  60.     {  
  61.         u32 V210_SDMMC_BASE = *(volatile u32 *)(0xD0037488);    // V210_SDMMC_BASE  
  62.         u8 ch = 0;  
  63.           
  64.         /* 参考S5PV210手册7.9.1 SD/MMC REGISTER MAP */  
  65.         if (V210_SDMMC_BASE == 0xEB000000)      // 通道0  
  66.             ch = 0;  
  67.         else if (V210_SDMMC_BASE == 0xEB200000) // 通道2  
  68.             ch = 2;  
  69.         CopySDMMCtoMem(ch, 32, bl2Size / 512, (u32 *)CONFIG_SYS_SDRAM_BASE, 0);  
  70.     }  
  71. }  

   重新编译,但编译之前要添加nand所用的头文件:#include <asm/arch/nand_reg.h>成功生成 spl/tiny210-spl.bin 和 u-boot.bin,将它们全部拷贝到 tftp 服务器目录下,然后就可以使用上一节移植的 u-boot 来烧写最新的 u-boot 到 NAND FLASH。

首先从 SD 卡启动开发板 ,擦除整个 NAND FLASH:


使用 tftpboot 下载 tiny210-spl.bin 到 DDR 的起始地址 0x20000000


烧写 tiny210-spl.bin 到 NAND 的 0 地址:


使用 tftpboot 下载 u-boot.bin 到 DDR 的起始地址 0x20000000


烧写 u-boot.bin 到 NAND FLASH 的 0x4000 地址(0x0~0x3FFF 预留给 tiny210-spl.bin)


拨动拨码开关,从 NAND 启动开发板,可以观察到u-boot正常启动了,现在我们的u-boot功能基本都实现了,我把代码放在这里 ,有兴趣的朋友可以看看:tiny210_u-boot_201404_v2.0,之后就行我们都代码和功能的完善。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
yolo是一种流行的目标检测算法,而yolov3-tiny是yolo系列的一种轻量级版本。yolov3-tiny.conv.15是yolov3-tiny的预训练模型。 预训练模型是在大规模数据集上进行训练得到的模型权重。yolov3-tiny.conv.15是在COCO数据集上进行训练的,该数据集中包含多类别的目标图像,用于目标检测任务的训练。通过使用预训练模型,可以获得一个初始化良好的模型,从而加快目标检测算法的训练过程。 yolov3-tiny.conv.15是一个15层的神经网络模型。与其他版本的yolo相比,yolov3-tiny.conv.15具有更小的网络结构和参数量,使其在计算资源有限的设备上有更高的实时性能和效率。 使用yolov3-tiny.conv.15预训练模型进行目标检测任务时,可以将其加载到目标检测算法中,并对输入图像进行前向传播操作。通过该操作,可以识别图像中的不同类别的目标,并给出对应的边界框和置信度得分。 然而,需要注意的是,yolov3-tiny.conv.15是一个通用的预训练模型,它在COCO数据集上进行训练得到的权重,并不能直接应用于其他特定领域的目标检测任务。对于特定任务,可能需要使用自己的数据集进行微调,以使模型更好地适应任务需求。 总的来说,yolov3-tiny.conv.15是yolov3-tiny的预训练模型,可提供快速、准确的目标检测能力。通过加载该模型,可以为目标检测任务提供一个良好的起点,并根据具体需求进行进一步的训练和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值