分类:debian

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 gtk 编程

需要在非root用户 DISPLAY=:0 ./example-0 运行。

同时,x server 限制连接用户。所以如果要通过root调试,会麻烦一些。

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

supervisor 开机不能正常启动

supervisor启动失败,通过/var/log/syslog 直接报错。

该报错通过systemd控制的sysv init启动脚本报出。从直接报错的代码位置来看是start-stop-daemon启动supervisord 失败。

为什么这里会启动进程失败呢?通过man start-stop-daemon 找到了可能的报错原因。

通过如上分析可以知道这里可能存在了--pidfile 指定的进程id,尝试更改/var/log/supervisord.pid 文件进程id为1(systemd进程名)。此时发现supervisd再也启动不了了,同时也直接如上报错。

那么这里为什么会出现相同进程id的进程名呢?

通过分析这里设备可能存在异常断电导致设备未正常销毁pid文件,再次启动的时候又检测到相同pid的进程名,所以直接导致了进程的启动失败。

pidfile单例模式启动进程这么通用的机制为什么会出现该缺陷?其他守护进程也会出现?还是只是概率问题。

其实不然,以下分析。

systemd#systemd vs sysv init 详细介绍了sysv init 和systemd控制的进程启动。这里的3.0.0 版本supervisor 通过sysv init启动。sysv init通过start-stop-daemon 和--pidfile 单例模式启动supervisor,升级到高版本的由syste...

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 确实不支持中断。