标签: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 ...

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

v4l2 driver framework code review

如上启动顺序

  • csi、cci、mipi 等外设初始化;
  • vfe控制 v4l2 启动;

    vfe在初始化 v4l2-device启动的时候已经同sub-device ov5640 通信,但是此时ov5640 启动还没有加载,这部分需要详细走读下代码;

  • sub-device camera sensor ov5640 加载;

  1. vfe模块加载,加载csi、mipi、isp、cci模块,同时从sys_config读出sensor的配置;
  2. 创建v4l2-device;
  3. ov5640 通过cci/i2c 向上注册sub-device(先前行为),此时vfe通过已经注册接口测试sensor是否激活。
  4. 创建video 设备节点 ;
  • libv4l2 源码可以通过sudo apt-get source libv4l2rds0 下载。

a64 sdk pack tool

编译打包相关脚本文件。

  • 拷贝tools/pack/chips/sun50iw1p1/bin/boot0_sdcard_sun50iw1p1.bin到out/boot0_sdcard.fex

  • 通过sys_config.bin 更新boot0,最终生成boot0_sdcard.fex。

  • brandy/build.sh 会编译uboot并且将其拷贝到tools/pack/chips/sun50iw1p1/bin/u-boot-sun50iw1p1.bin。
  • tools/pack/pack 将其拷贝为u-boot.fex;

  • 通过sys_config更新uboot 文件头的元数据;

  • 合并monitor.fex、scp.fex、sunxi.fex

sys_config 是全志 sunxi的配置脚本,区别linux kernel的dts,但是会作用于dts,以下梳理其完整链路。

  • 应用sys_config.fex,通过dts生成sunxi.dtb;

  • 通过生成sys_config.bin 拷贝config.fex,sys_config.bin 用以后面的其他文件更新,config.fex暂时未发现使用;

  • 使用sys_config.bin 更新boot0、uboot、fes1、toc0。

  • 应用sys_config.fex 通过dts生成sunxi.dtb

  • 拷贝生成 sunxi.fex 合并到uboot

boot-resourc...