全志A40i/T3核心板使用的是:AXP221s电源管理芯片。

因此上电起来需要做的工作之一就是初始化这个电源管理芯片。

而主控Arm与该芯片的通讯接口为I2C(这个视每个不同的PMU管理芯片情况而定)。

因此在初始化该芯片前,还需要先初始化Arm的I2C总线。

一. 初始化I2C总线

函数调用路径,从  init_fnc_t * init_sequence[] 开始:

-> init_fnc_t * init_sequence[]        // uboot的启动初始化函数数组

-> static int init_func_pmubus(void)        // 初始化i2c总线,为下一步初始化PMU模块做准备

I2C总线相关函数主要集中在“sunxi_i2c.c”文件内,主要是对I2C总线,时钟和寄存器进行初始化。

-> void i2c_init(int speed, int slaveaddr)

-> int sunxi_i2c_init(int bus_num,int speed, int slaveaddr)

-> void sunxi_i2c_bus_setting(int bus_num)        // 配置i2c总线

-> void i2c_set_clock(int bus_num,int speed)        // 配置i2c功能时钟

至此I2C总线初始化完毕。如果配置成功,则保存读写函数指针。

i2c_read_pt = sunxi_i2c_read;
        i2c_write_pt = sunxi_i2c_write;

二. 然后就是核心板的PMU模块初始化。

-> int power_source_init(void)

-> // 从sys_config.fex中读取相关配置参数
    nodeoffset =  fdt_path_offset(working_fdt,FDT_PATH_POWER_SPLY);
    if(nodeoffset >=0)
    {
        fdt_getprop_u32(working_fdt, nodeoffset, "dcdc2_vol", &dcdc_vol);
    }
    if(!dcdc_vol)
    {
        cpu_vol = 900;
    }
    else
    {
        cpu_vol = dcdc_vol%10000;
    }

-> // 初始化CPU电源管理模块(PMU),并配置相关电源参数

axp_exist =  axp_probe();
    if(axp_exist)
    {
        axp_probe_factory_mode();
        if(!axp_probe_power_supply_condition())
        {
            //PMU_SUPPLY_DCDC2 is for cpua
            if(!axp_set_supply_status(0, PMU_SUPPLY_DCDC2, cpu_vol, -1))
            {
                tick_printf("PMU: dcdc2 %d\n", cpu_vol);
                sunxi_clock_set_corepll(uboot_spare_head.boot_data.run_clock);
            }
            else
            {
                printf("axp_set_dcdc2 fail\n");
            }
        }
        else
        {
            printf("axp_probe_power_supply_condition error\n");
        }
    }
    else
    {
        printf("axp_probe error\n");
    }

-> // 参数获取验证

pll_cpux = sunxi_clock_get_corepll();
    tick_printf("PMU: cpux %d Mhz,AXI=%d Mhz\n", pll_cpux,sunxi_clock_get_axi());
    printf("PLL6=%d Mhz,AHB1=%d Mhz, APB1=%dMhz  MBus=%dMhz\n", sunxi_clock_get_pll6(),
        sunxi_clock_get_ahb(),
        sunxi_clock_get_apb(),
        sunxi_clock_get_mbus());

if(axp_exist)
    {
        axp_set_charge_vol_limit();
        axp_set_all_limit();
        axp_set_hardware_poweron_vol();
        axp_set_power_supply_output();
        //power_config_gpio_bias();
        power_limit_init();
    }

主要做的:读取sys_config.fex,初始化一些参数。包括: axp221设备地址(axp221是通过i2c连接到soc上的) 电池容量 电池充电电流 电池充电电压 预充电时间 持续充电时间等。

这个根据Arm主控要求和芯片特性来。

我也没有深入追踪,有兴趣的朋友可以找到这款PMU的芯片手册结合代码看看。

至此对PMU部分的初始化完成~!

A40i/T3 uboot启动时对PMU部分初始化相关推荐

  1. 解决ArcMap启动时只停留在初始化界面的方法

    解决ArcMap启动时只停留在初始化界面的方法 参考文章: (1)解决ArcMap启动时只停留在初始化界面的方法 (2)https://www.cnblogs.com/luwl/p/6899342.h ...

  2. SpringBoot——项目启动时读取配置及初始化资源

    关注微信公众号:CodingTechWork,一起学习进步. 介绍   在开发过程中,我们有时候会遇到非接口调用而出发程序执行任务的一些场景,比如我们使用quartz定时框架通过配置文件来启动定时任务 ...

  3. uboot启动时向kernel传参之 logo显示(2)

    一.uboot下的logo显示功能中的flash的读取: mmc read dev_num,  addr,  flash_addr_start, flash_read_size mmc read 0  ...

  4. uboot启动时flash擦除大小问题

    之前遇到问题,网上有人说flash最小擦除单位是块大小,有人说最小擦除单位是扇区大小- 某flash块大小64k,扇区大小4k,但是你的分区有的才8k,如果擦除flash必须是块大小的整数倍,那别想对 ...

  5. 设定按键将uboot启动时停止autouboot

    以下是通过按空格键停止autoboot: #define CONFIG_AUTOBOOT_KEYED 1 #define CONFIG_AUTOBOOT_PROMPT  \         " ...

  6. UBOOT启动内核过程

    1.摘要 (1).启动4步骤 第一步:将内核搬移到DDR中 第二步:校验内核格式.CRC等 第三步:准备传参 第四步:跳转执行内核 (2).涉及到的主要函数是:do_bootm和do_bootm_li ...

  7. S5PV210 Uboot开发与移植03:Uboot启动流程详解

    目录 1. start.S解析 1.1 uboot入口分析 1.2 头文件包含 1.2.1 config.h 1.2.2 version.h 1.2.3 asm/proc/domain.h 1.2.4 ...

  8. U-Boot启动阶段修改启动参数方法及分析

    作者:围补 本来启动方式这节不是什么复杂的事儿,不过想简单的说清楚明白,还真是不知道怎么组织.毕竟文字跟有声语言表达有别.但愿简单的东西别让我讲的太复杂! Arm板系统文件一般有三个--bootloa ...

  9. imx6 u-boot 启动 Can't find PMIC:PFUZE100

    最近在将imx官方源码imx-4.1-krogoth里面的u-boot移植到一个淘宝开发板的过程中,遇到了u-boot启动时提示错误:Can't find PMIC:PFUZE100 原因如下: 淘宝 ...

最新文章

  1. AI手语主播通过朱广权魔鬼面试,残影级手速无惧贯口,今已正式上岗助力冰雪盛会...
  2. 做程序猿的老婆应该注意的一些事情
  3. 在.net开发中使用Log4Net组件
  4. python自带的集成开发环境是什么-常用的几款Python集成开发环境或者编辑器详解...
  5. Nginx-06:Nginx配置实例之负载均衡
  6. C语言程序流程设计之跳转【程序流程设计】(14)
  7. xenserver 虚拟机扩容lvm磁盘分区的方法_从零开始学Linux运维|35.LVM(逻辑卷管理)的创建...
  8. java属性监听_Java event事件监听属性值变化 demo
  9. python能写什么脚本_你用 Python 写过哪些有趣的脚本?
  10. 2运行内存多大_智能设备中的内存与容量为何傻傻分不清?它们的区别是什么?...
  11. Cognos开发自定义排序规则的报表和自定义排名报表
  12. 六个问题让你更懂 React Fiber
  13. congestion report解读
  14. Java框架之Hibernate(二)
  15. linux mongo 搭建+集群
  16. protues仿真arduino串口通讯
  17. 【公司内部资料】顺丰新员工入职考试35道考试题目答案
  18. 音频算法工程师面试内容
  19. 教你如何做一个三角形
  20. 关于Python爬虫常见的面试题

热门文章

  1. 零极限:创造健康、平静与财富的四句话
  2. 蚁群算法(Ant Colony Optimization)
  3. 用Origin将Fluent中的数据导出并绘制云图
  4. java中decrement,Java LongAdder decrement()用法及代码示例
  5. c语言单价英文,英文词汇大全:常见价格及费用词语
  6. 0004-1-模型好坏评判标准
  7. 【LaTeX PPT模板集】Beamer主题与配色使用教程
  8. 迅雷 极速版 1.0.35.366
  9. 【canvas画图】画一个彩虹
  10. 逍遥模拟器使用指南(一、ADB 模拟器链接方式)