admin 发表于 2019-10-29 21:02:07

小梅哥SoC FPGA AC506核心板常用操作说明

本帖内容导航

5楼,使用USB Blaster检测不到FPGA器件的原因和解决方案



如题,本笔记主要记录如何在小梅哥最新的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块钱,所以该方案性价比很高。

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,然后设置下面的所有参数


setenv fpga-image soc_system.rbf
setenv dtb-image socfpga.dtb
setenv kernel-image zImage


setenv fpgadata 0x2000000
setenv fpgadatasize 0x700000
setenv dtbaddr 0x00000100
setenv kerneladdr 0x8000

setenv get-fpgadata 'tftp ${fpgadata} ${tftp-sockit-dir}/${fpga-image}'
setenv load-fpga 'fpga load 0 ${fpgadata} ${fpgadatasize}'
setenv get-dtb 'tftp ${dtbaddr} ${tftp-sockit-dir}/${dtb-image}'
setenv get-kernel 'tftp ${kerneladdr} ${tftp-kernel-dir}/${kernel-image}'
setenv bootnfs 'bootz ${kerneladdr} - ${dtbaddr}'



上面不包括设置Ip


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

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的所有步骤




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


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

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

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

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

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

烧写文件系统
tftp 0x1000000 ${tftp-sockit-dir}/yocto_rootfs.ext3
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 ... 9603&_u=tj8u3jd030a


转接板是买芯片时候老板送的,老板听说我要评估这个玩意儿,直接给我发了个顺丰,还是蛮给力的。回来之后,由于我们原本使用直接烧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为主导的低端片子,怕是很难再等得到了。



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

admin 发表于 2020-12-26 23:09:50

将一个文件按照400*1024*1024,也就是400M字节的容量进行切割。
split -b 400M AC540-SoC-Console.img AC540-SoC

Uboot下读取U盘的数据方法和MMC的一样。
第一步,先用usb start命令启动USB功能
第二步,使用usb info命令查看USB设备信息
第三步,从U盘的FAT分区中读取一个文件到内存方法
fatload usb 0 0x1000000ac540-socaa
第四步,从U盘中从指定块区域读取指定个块个数的数据到内存中
usb read 0x1000000 0 4096   注意,输入4096默认为16进制,其十进制值为16534,所以使用时候注意,读取文件大小时候,要用十六进制方案,



admin 发表于 2021-1-7 18:49:50

使用NFS启动的设置备忘录
setenv   ipaddr   192.168.20.250
setenvethaddr00:11:22:33:44:55
setenv   serverip   192.168.20.102
setenv   tftp-dir   ac540
setenv   nfsip   192.168.20.102
setenvnfs-rootfs-dir/home/fpgaer/tools/mk_sd_image/rootfs

admin 发表于 2021-1-9 09:59:00

查看脚本运行时间
mount -t ntfs /dev/sda1 /mnt
starttime=`date +'%Y-%m-%d %H:%M:%S'`
#执行程序
dd if=/mnt/AC540-SoC-Ubuntu1604.img of=/dev/mmcblk0
endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo "本次运行时间: "$((end_seconds-start_seconds))"s"

admin 发表于 2021-1-18 10:23:31

有用户提问,原文内容:
目前我们将FPGA核心版的JTAG部分有焊上了排针, 但是我们透过Downlaod cable想去updated FPGA image时, 目前遇到抓取不到FPGA晶片的问题, 请问可否与您讨论看看是否有什麽相关设定是需要调整的呢? 或是有其它的方式可以updated FPGA, 谢谢。




答:使用JTAG cable接线时候,请调换JTAG信号的TDO和TDI接线。这个就像UART串口的RXD对TXD、TXD对RXD的意思。对于JTAG Cable来说,TDO如果是输出信号,那么对于FPGA来说,这个就是输入信号。所以需要做交换。只要核心板正常工作,按照这样的方式交换之后一般就没有问题了,如果这样交换之后还是无法正常检测到,考虑JTAG接口是否有烧毁的可能,因为Altera的FPGA的JTAG接口非常的脆弱,容易烧毁,烧毁之后还有小概率的可能能够检测并修复,具体修复的方案参加下述帖子。
Altera FPGA JTAG信号修复
http://www.corecourse.cn/forum.php?mod=viewthread&tid=28403
(出处: 芯路恒电子技术论坛)


页: [1]
查看完整版本: 小梅哥SoC FPGA AC506核心板常用操作说明