我都几乎忘了我注册了“”。
最近一直忙,颠三倒四的……好了,进入正题,正如题目所说,为什么叫可能失败的一次对ARMv8的调试。
挺看好ARMv8这个架构的,它支持64位空间,支持虚拟化,大小核等等。在Cortex-A50系列中,A57属于“大核”,A53属于“小核”,分别替代现有的A15与A7,生产工艺将进化至14nm。ARM给出的Cortex-A57与A53的未来应用构想,它们将横跨智能手机、平板电脑与服务器领域,根据big.LITTLE理念,在一颗芯片中,A57与A53核心可以混搭。
我第一次接触ARMv8是买了FriendlyARM的Nano Pi M3这个卡片电脑,上面搭载的是三星S5P6818这个芯片,Cortex-A53 8核1.4GHz,芯片官网:http://www.nexell.co.kr/?page_id=300 资料也在这个网站上面下载,不过需要登录,所以我只能用FriendlyARM提供的芯片手册。
我这个人比较喜欢刨根问底,买到Nano Pi M3之后我就打算自己从头搞起,既然芯片是ARMv8架构的,我就以64位的方式编译U-Boot玩一玩,U-Boot能跑起,Linux想必也不在话下。
但是事情并不是这么简单,我尝试用C语言点亮板子上面的那个蓝色的LED并闪烁,用ARMv8指令集编译并且烧录到SD卡的第2个扇区,插到板子上就成功了,没有多大难度,但是编译启动UBoot的时候就不行了,把源码下进去压根没反应,串口没有输出,不知道是哪一步出了问题。板子上也没有开放JTAG接口,所以没有办法调试Uboot。
现在我只能有两条路了:1、找到一块将S5P6818的JTAG引出的开发板,使用JTAG直接片上调试UBoot;2、使用Qemu调试UBoot。
先尝试第一条路吧。我逛了好久淘宝,终于找到一款S5P6818开发板将JTAG接口引出来了。
现在的工作是如果通过JTAG调试它。市面上支持ARMv8调试的工具不多,就算支持的都收费,劳特巴赫,DS-5我一苦逼穷学生一个都负担不起,OpenOCD貌似支持,在源码里对AArch64的调试是选择编译到OpenOCD里的,不知道能不能用,兼不兼容。看了OpenOCD脚本,发现是使用JIM作为脚本解释器。JIM是小型TCL解释器,功能是TCL的子集,语法几乎是一样的,它的语法是那种命令行式的。比较烦,感觉不是很灵活……考虑到以后我调试Linux的时候可能要用JTAG通过脚本对内存或者外设直接操作,所以我需要脚本语法尽可能灵活……
所以找了一圈,发现没有合适的,就打算自己造一个,脚本支持灵活的语法,可以对ARMv8架构进行调试的工具,而且这个工具要对仿真器没有要求。只要仿真器提供JTAG功能,不管是Xilinx USB Blaster,还是OpenJTAG,还是CMSIS-DAP等等,都可以直接调试。这个工具我给它起名叫“SmartOCD”。
项目放在了GitHub:https://github.com/Virus-V/SmartOCD
仿真器我手头只有一个CMSIS-DAP,所以开发测试任务只能使用它,但是我在设计SmartOCD的时候抽象出来公共的JTAG层,将上层对芯片的操作转换成统一的JTAG时序表示,对下级仿真器驱动的要求是能够解析这些时序并输出相应的信号就够了。
而且SmartOCD集成了DAP的通用操作,可以通过DAP的Access Port对CoreSight的调试组件和内存空间进行访问,在用STM32F4的单片机测试的时候可以正常读取RAM和ROM。
基本功能齐全之后,我拿到S5P6818上面测试,发现DAP上挂着三个AP,两个MEM-AP和1个JTAG-AP。分别是:MEM-AP: AMBA-AXI3 or AXI4、MEM-AP:AMBA-APB2和JTAG-AP。其中CoreSight的调试组件挂在APB2这个调试专用总线上,要通过APB2这个AP去访问。
但是问题来了,读取ROM Table的时候出现了问题,可以列出所有ROM Table的Entry,但是识别Entry指向的组件的时候就会错误,Sticky Error标志置位,并且无法清除掉该错误标志,仿佛APB-AP整个的就死掉了。
看最后一行,Component CID:0x00000000,PID:0x00000000
这个时候已经出现错误了,第一个Component就读取失败,而且我Debug域已经上电了。
其实我也查了相关资料,感觉不应该出现这个问题啊,所以第一条路可能走不通吧。心累。
我也在尝试解决,如果找到解决办法我将会把它添加到这篇日志里。
4月30日:问了ARM的工程师,感觉是我的SoC的问题,他推荐我使用Linaro官方测试过的板子。现在板子还在路上,五一节放假不给运。