imx6 调节PMIC MMPF0100的输出电压

MMPF0100是Freescale i.MX6Q SABRESD参考设计中使用的PMIC,集成了完善的系统级电源管理功能,简化了系统设计,减少设计复杂性并节省物料成本。其优化的性能架构为消费电子、工业和汽车等应用带来更高的效率和更先进的功能。MMPF0100适合所有i.MX6应用处理器,包括:i.MX6QuadPlus、i.MX6DualPlus、i.MX6SoloLite、i.MX6Solo、i.MX6DualLite、i.MX6Dual和i.MX6Quad。

MMPF0100-Block-Diagram

如果不是经过特别仔细的调研,硬件工程师一定会忽略一个问题,i.MX6Q SABRESD参考设计中使用的MMPF0100NPEP是已编程的,即输出电压及上电时序已经过调整。按照MMPF0100 Datasheet中所描述的,如下图,MMPF0100F0EP才适配i.MX6 SABRESD参考设计。如果硬件工程师忽略这一问题,就会选用未编程的MMPF0100NPEP,并导致PMIC无法输出正确的电压值。

MMPF0100-Part-Number

配合 笔者手上的板卡,F0与NP影响最大的是SW2的输出电压,F0情况下SW2输出电压为3.3V,NP情况下SW2输出电压为3.0V,这足以引起板上某些器件工作异常。以笔者手上的板卡为例,WiFi芯片Qualcomm Atheros AR9582就存在不稳定的情况。

MMPF0100-Compare

为了最大限度地改善这一情况,需要通过i.MX6调节MMPF0100输出电压值达到预期。通过一段时间的摸索,发现可以通过更改以下文件实现:

ltib/rpm/BUILD/u-boot-2009.08/board/freescale/mx6q_sabresd/mx6q_sabresd.c

其中setup_pmic_voltages()函数用于调整MMPF0100的输出电压,原代码中已经具备调节VGEN3与VGEN5的能力,那么照葫芦画瓢,我将setup_pmic_voltages()变更为如下形式:

static int setup_pmic_voltages(void)
{
        unsigned char value, rev_id = 0 ;
        i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
        if (!i2c_probe(0x8)) {
                if (i2c_read(0x8, 01, &value, 1)) {
                        printf("Read device ID error!n");
                        return –1;
                }
10                 if (i2c_read(0x8, 31, &rev_id, 1)) {
11                         printf("Read Rev ID error!n");
12                         return –1;
13                 }
14                 printf("Found PFUZE100! deviceid=%x,revid=%xn", value, rev_id);
15                 /*For camera streaks issue,swap VGEN5 and VGEN3 to power camera.
16                 *sperate VDDHIGH_IN and camera 2.8V power supply, after switch:
17                 *VGEN5 for VDDHIGH_IN and increase to 3V to align with datasheet
18                 *VGEN3 for camera 2.8V power supply
19                 */
20                 /*increase VGEN3 from 2.5 to 2.8V*/
21                 if (i2c_read(0x8, 0x6e, 1, &value, 1)) {
22                         printf("Read VGEN3 error!n");
23                         return –1;
24                 }
25                 value &= ~0xf;
26                 value |= 0xa;
27                 if (i2c_write(0x8, 0x6e, 1, &value, 1)) {
28                         printf("Set VGEN3 error!n");
29                         return –1;
30                 }
31                 /*increase VGEN5 from 2.8 to 3V*/
32                 if (i2c_read(0x8, 0x70, 1, &value, 1)) {
33                         printf("Read VGEN5 error!n");
34                         return –1;
35                 }
36                 value &= ~0xf;
37                 value |= 0xc;
38                 if (i2c_write(0x8, 0x70, 1, &value, 1)) {
39                         printf("Set VGEN5 error!n");
40                         return –1;
41                 }
42                 //Modified by 笔者
43                 if (i2c_read(0x8, 0x35, 1, &value, 1)) {
44                         printf("Read SW2 error!n");
45                         return –1;
46                 }
47  
48                 value &= ~0x3f;
49                 value |= 0x32;
50                 if (i2c_write(0x8, 0x35, 1, &value, 1)) {
51                         printf("Set SW2 error!n");
52                         return –1;
53                 }
54  

编译并下载u-boot至板卡中,发现SW2在u-boot启动一段时间后,便可以输出正确的3.3V,提高了系统稳定性。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值