IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> uboot启动时对PMU部分初始化 -> 正文阅读

[嵌入式]uboot启动时对PMU部分初始化

全志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部分的初始化完成~!

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:20:30  更:2021-09-18 10:22:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:22:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码