芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 活动
查看: 129|回复: 0

小梅哥SoC FPGA 给SoC FPGA的EMMC烧录操作系统

[复制链接]
  • TA的每日心情
    可爱
    2019-5-10 10:58
  • 209

    主题

    374

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    10864
    发表于 2019-10-29 21:02:07 | 显示全部楼层 |阅读模式
    如题,本笔记主要记录如何在小梅哥最新的SoC FPGA核心板上烧录Linux系统,。

    流水账式笔记

    要给Intel Cyclone V SoC FPGA核心板上的EMMC烧写系统

    面临的几个严峻问题

    1、该芯片只有一个SDIO接口,接EMMC 的时候不能接SD卡,接SD卡的时候不能接EMMC,或者,换一种说法,SD卡和EMMC不能同时工作。
    2、该芯片仅支持从SDIO、QSPI、FPGA启动,不支持从USB启动。无法像IMX6一样直接用USB烧写系统

    但是幸好
    1、对于第一个问题,SD卡和EMMC虽然不能同时工作,但是可以通过巧妙设计,让他们分时工作,比如先从SD卡启动Uboot,然后在Uboot下拔出SD卡,把EMMC挂上。所以可以使用SD卡加载UBoot。
    2、对于第二个问题,支持QSPI启动,而quartus可以支持烧写Uboot到QSPI,所以另一种思路是先使用quartus将Uboot烧写到QSPI,然后QSPI启动Uboot。3、Quartus可以支持使用USB Blaster烧写Uboot到RAM。


    分析优劣
    1、第一种方法只需要在SDIO接口上同时接上SD卡槽和EMMC即可,但是要设计互斥电路,让SD卡插入时候,EMMC能立即停止工作(比如断电),SD卡拔出时候,EMMC能够开始正常工作。所以使用下述电路图来实现该功能,该电路可以实现SD卡插入时自动切断EMMC供电的功能。SD卡可以在PC上使用专门的烧录工具烧录,非常方便。而且SD卡槽成本很低,不到1块钱,所以该方案性价比很高。
    EMMC供电.png
    2、第二种方案,需要使用一片QSPI Flash来作为UBoot存储固件,QSPI可以使用Quartus实现Uboot镜像的烧写。而且QSPI的成本也不是很高,128Mbit的QSPI FLASH大概12元左右。而且一次烧好,以后每次都可以用,但是缺点是每次从QSPI切换回EMMC启动需要修改启动设置管脚(如果是设计为了排针或者拨码开关倒也不复杂,但是如果是用板载电阻就比较麻烦了),虽然该方法将是我下一步就会尝试的内容。
    3、Quartus可以支持使用USB Blaster烧写Uboot到RAM。但是这样的方法Uboot是无法固化的,每次重启都需要重新用quartus烧写一遍,非常麻烦,一般不考虑。


    最终的解决途径:
    为了最小化成本,决定采用SD卡启动Uboot,待Uboot启动之后,卸载SD卡,让EMMC挂载上,然后再通过NFS挂载Linux系统,然后就能在Linux系统下对EMMC进行分区、格式化等各种操作了,但是需要注意的是,NFS下不支持挂载EMMC分区到文件系统,所以要想往EMMC中烧写文件,还是只能在UBoot下用Uboot中的mmc write和fatwrite mmc命令来实现EMMC的烧写。

    反正作为萌新的的我,搞定这个过程,花了4天时间,比如不会创建NFS系统,不会创建TFTP、Altera厂家给的文件系统中不带mkfs.ext3和mkfs.fat命令,需要自己编译库。然后还要学着使用Uboot中的各种命令,反正对我感觉来说,好多内容啊,但是很充实。嘿嘿。现在弄完了来看,也就那么回事。

    这里要特别感谢武汉芯路遥科技有限公司的汪总给我提供了大量的指导(各种命令,各种思路)。




    好了,废话说的有点多了。接下来一步一步的来操作了。

    第一步,没啥好说的,就是制作SD启动卡。
    第二步,是在电脑上装TFTP

    第三步,是在电脑上装NFS

    第四步,是在电脑上把SOC FPGA需要用到的所有文件都放入NFS目录

    第五步,使用SD卡启动板子并停在Uboot,然后设置下面的所有参数


    1. setenv fpga-image soc_system.rbf
    2. setenv dtb-image socfpga.dtb
    3. setenv kernel-image zImage


    4. setenv fpgadata 0x2000000
    5. setenv fpgadatasize 0x700000
    6. setenv dtbaddr 0x00000100
    7. setenv kerneladdr 0x8000

    8. setenv get-fpgadata 'tftp ${fpgadata} ${tftp-sockit-dir}/${fpga-image}'
    9. setenv load-fpga 'fpga load 0 ${fpgadata} ${fpgadatasize}'
    10. setenv get-dtb 'tftp ${dtbaddr} ${tftp-sockit-dir}/${dtb-image}'
    11. setenv get-kernel 'tftp ${kerneladdr} ${tftp-kernel-dir}/${kernel-image}'
    12. setenv bootnfs 'bootz ${kerneladdr} - ${dtbaddr}'


    复制代码

    上面不包括设置Ip


    第六步、设置完成后,使下面的命令启动NFS运行

    1. run get-fpgadata load-fpga get-dtb get-kernel bridge_enable_handoff bootnfs
    复制代码




    第七步、当板子的Linux启动之后,开始对emmc分区和格式化


    第七步中,还需要编译e2fsprogs-1.45.4和dosfstools-4.1两个库并安装到NFS的文件系统中才能对EMMC进行格式化


    第八步、在Uboot中设置环境变量并烧写EMMC的所有步骤




    1. 烧写preloader
    2. 从NFS中把preloader.img文件拷贝过来
    3. tftp 0x1000000 ${tftp-sockit-dir}/preloader.img
    4. 把preloader.img文件写入到0x800(2048)扇区,写入长度为0x200(512)个扇区(每个扇区512字节,所以共写入了256KB的数据)
    5. mmc write 0x1000000 0x800 0x200
    6. 把preloader.img文件从0x800(2048)扇区读出来,放到0x1000000地址
    7. mmc read 0x2000000 0x800 0x200
    8. 比对读出的数据是否和写入的一样,来确认烧写是否正确
    9. cmp.b 0x1000000 0x2000000 0x40000


    10. 烧写uboot
    11. u-boot.img文件拷贝过来
    12. tftp 0x1000000 ${tftp-sockit-dir}/u-boot.img
    13. u-boot.img文件写入到0xa00(4096)扇区,写入长度为0x600(1536)个扇区(每个扇区512字节,所以共写入了768KB的数据,实际就是把数据写入preloader之后的空间)
    14. mmc write 0x1000000 0xa00 0x600

    15. 烧写socfpga.dtb
    16. tftp 0x1000000 ${tftp-sockit-dir}/socfpga.dtb
    17. fatwrite mmc 0:1 0x1000000 socfpga.dtb dtb_size(注意该值要从上一步传输结果中查看,实际执行的是如下类似的命令)
    18. fatwrite mmc 0:1 0x1000000 socfpga.dtb 0x5745

    19. 烧写zImage
    20. tftp 0x1000000 ${tftp-sockit-dir}/zImage
    21. fatwrite mmc 0:1 0x1000000 zImage zImage_size(注意该值要从上一步传输结果中查看,实际执行的是如下类似的命令)
    22. fatwrite mmc 0:1 0x1000000 zImage 0x3ea650

    23. 烧写rbf
    24. tftp 0x1000000 ${tftp-sockit-dir}/soc_system.rbf
    25. fatwrite mmc 0:1 0x1000000 soc_system.rbf rbf_size(注意该值要从上一步传输结果中查看,实际执行的是如下类似的命令)
    26. fatwrite mmc 0:1 0x1000000 soc_system.rbf 0x6aebe4

    27. 烧写u-boot.scr
    28. tftp 0x1000000 ${tftp-sockit-dir}/u-boot.scr
    29. fatwrite mmc 0:1 0x1000000 u-boot.scr 0xd4

    30. 烧写文件系统
    31. tftp 0x1000000 ${tftp-sockit-dir}/yocto_rootfs.ext3
    32. mmc write 0x1000000 0x1000 0x48bb4  (其中0x1000为Linux分区的起始扇区,0x48bb4为文件占用的扇区个数)
    复制代码


    接下来,就可以使用了。

    其实另一种思路就是,把EMMC当成SD卡先在PC上烧写好之后再焊接到板子上,但是这种方法需要EMMC烧录座。这种方法还有一个问题就是,由于EMMC引脚多,而且引脚很小,只能机器贴片,无法手工焊接,因此只能先将EMMC烧写好之后再和板子一起送到焊接厂焊接,这种情况除非大批量应用,否则不划算(最起码对我这种供应商来说,500套以内这么折腾不划算,除非客户不差这点钱,哈哈),再次实名羡慕IMX6官方自带USB一键烧录软件。

    在网上看到了另一种芯片,叫做SD Nand,是介于SD卡和nand flash之间的一种存储器,256MB的零售价15RMB以内吧。是把SD卡控制器和Nand Flash做到了一起,功能上和EMMC或者说SD卡一模一样,但是他最方便的地方就是只有8个角,兼容SPI FLASH的封装,所以非常好焊接,烧录器也比EMMC的便宜好多好多,估计几十块钱就能搞定,EMMC的要几百上千了。自己也能做烧录器,毕竟脚大,还少。小批量的完全可以自己用PC烧录好了再焊接到板子上去,焊接的话以我的手速估计也就30秒一个。而且成功率100%。我买了5片回来,用了下,感觉不错。但是这个东西有个问题:新东西,而且貌似是国产的,所以稳定性和可靠性暂时没有经过大量的验证,客户能不能接受也是个问题,所以暂时不敢直接用这个存储器。但我会持续测试。
    以下贴上我买的SD Nand存储器的链接,和我做好的照片。https://item.taobao.com/item.htm ... &_u=tj8u3jd030a

    SD Nand.JPG
    转接板是买芯片时候老板送的,老板听说我要评估这个玩意儿,直接给我发了个顺丰,还是蛮给力的。回来之后,由于我们原本使用直接烧img软件的烧写方法,img原始文件为1.8G,比我买的256MB(实际只有240MB)的容量大很多,我也暂时不会改这个文件,也不会自己做这个img文件(论坛有这个帖子,教如何制作镜像的,是网友分享的,我目前还没操作过)所以就拜托芯路遥的汪总帮我在Ubuntu下把这个东西分区并将所有的文件都放进去了。然后我拿出来当成SD卡插进板子,板子也就启动起来了。很方便的。

    如果这个东西足够稳定,足够可靠,那对于Intel的SoC FPGa来说,真的是再适合不过了。
    写到这里,忍不住吐槽一下,xilinx的zynq带2个SDIO接口,可以一个接SD卡一个接EMMC,烧录EMMC简单的很,Intel这个只带一个SDIO接口,真的是很不友好,难怪官方板子和友晶的板子都只用SD卡座启动,如果也用EMMC,学生们早就吐槽并放弃了。毕竟据我的了解,目前高校用DE1-SoC、DE10、DE0板子的学生,能够达到UBOOT操作级别的,本科生不到1%,研究生也不到10%吧,只是我认识的人的一个大概统计,也许我不认识的,全都是高手,能人,哈哈。



    Altera的这个片子是个好片子,Cyclone V Soc是指望不上了,真希望能够出一个各方面优化了的新系列,低成本,更易用。只是现在altera被英特尔收购,这种以ARM为主导的低端片子,怕是很难再等得到了。



    阿弥陀佛,老衲法号 梵通。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|手机版|Archiver|芯路恒电子技术论坛  

    GMT+8, 2019-11-13 14:52 , Processed in 0.101478 second(s), 13 queries , File On.

    Powered by Discuz! X3.3

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表