分类:a64

a64 uboot 代码走读

已经完整梳理主要程序流,对于每个主程序流会按章节阻逐个细化分解。

  • uboot 入口main

    main完成一些状态初始化和标记,之后通过board_init_f和board_init_r 完成早期、中期初始化工作;

  • 对于如上初始化board_init_f主要通过预定义并且初始化的函数指针列表init_sequence_f[]依次执行完成;

    同样地,对于board_init_r 通过预先定义好的init_sequence_r 数组依次完成函数调用;

  • 之后程序进入main_loop 通过解析预定义环境变量bootcmd=x执行后续操作。

    bootcmd的函数实体通过预先定义好命令序列。

    完成boot image的查找查找android 引导分区,为kernel 跳转查找基地址;

    在这里完成boot到kernel 基地址跳转;

详细分析mmc初始化流程。

allwinner a64支持uboot阶段显示静态图片,这里梳理程序结构,确定gac-350未什么未生效,同时确定从boot->rootfs 整个过程显示蓝屏的根本原因。

从如上代码走的来看,lcd完整驱动区分如下层次关系;

此uboot中的disp模块同内核/linux-3.10/drivers/video/sunxi/disp2/disp中的一一对应。

不同的是,内核中的显示驱动通过内核模块的方式加载。也就是,在uboot通过的boardc_r.c ...

linux 看门狗

基于debian8 的linux设备会低概率的出现的系统完整死机,这里思考给linux添加完整的看门狗策略。

debian8已经采用systemd用以初始化系统和守护、管理系统进程。这里同时存在systemd 的watchdog和keepalive 单元文件,以及sysv init的watchdog keepavlie 初始化脚本,同时systemd也直接看门狗启动,那么该如何选择呢?

  • systemd直接支持看门狗启动;

  • debain8同时支持systemd和sysv init的看门狗以及保活机制。

  • Device Drivers-> Watchdog Timer Support

  • ./drivers/watchdog/Kconfig

    所以这里只需要使能CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y

如上使能了过后还是没有出现看门狗设备,参考sunxi 主核发布说明确定4.17之后a64才加入看门狗功能,这里涉及sunxi_wdt和dts和驱动移植。

  • error

  • 启动日志

/bin/systemd-tty-ask-password-agent --watch

a64 io 中断初始化失败

如下pc0,gpio64 设置中断触发边沿失败。

对比,pb0 gpio32,这里没有edge 属性。

对比3.21.2.1. PB Configure Register 0 (Default Value: 0x77777777) 和3.21.2.10. PC Configure Register 0 (Default Value: 0x77777777) 这里pc0 确实不支持中断。