CIM&SD_电源域切换说明文档
一 背景技术
1.1 应用场景
x2000、x2100、x2600可以支持CIM 和 SD的外接供电电压1.8v和3.3v切换。也就是说,这些主控芯片的外接sensor设备和SD设备的供电压可以是1.8v或3.3v。但是必须保证主控寄存器的CIM和SD电压设置与外设供电电压保持一致,不然会有损坏主控芯片的风险。
本文主要讲述x2000、x2100、x2600搭载rtos 和linux系统时,根据外设供电电压设置主控寄存器的CIM和SD电压的方法。有两种方法:
1, 利用ADC硬件单元来检测输入电压值,程序自动设置主控寄存器的CIM和SD电压。
2,客户根据硬件设计来判断当前CIM和SD的工作电压,从而手动设置主控寄存器的CIM和SD电压。
1.2 芯片寄存器设置
x2000、x2100、x2600的CIM 和 SD电压设置寄存器如下:

章节1.1中涉及的两种设置方法最终设置的都是此寄存器的BIT30~31,此寄存器的物理地址为:0x100000e0。
注意:此处的电压设置,须与硬件设计的CIM和SD供电电压一致,不然会有损坏主控芯片的风险。
二 rtos下切换电压
2.1 用ADC自动检测电压
以PD_X2600E_VAST_V2.0开发板为例,展示利用ADC12~13来检测输入电压值,程序自动设置主控寄存器的CIM、SD电压。硬件设计如下:

上图可知,当前硬件设置VDDIO_CIM接的是VCC_1V8.

上图可知,当前硬件设置VDDIO_SD接的是VCC_3V3.

上图为ADC12~13检测电压的硬件设计。
根据硬件设计,R162和R163作为等值的分压电阻,当前的ADC12如果检测到900mV左右就是正确的。软件上将ADC12获取到900mV左右的值作为设置EXCLK_DS对应BIT30 = 1的依据。
R164和R165作为等值的分压电阻,当前的ADC13如果检测到1.65V左右就是正确的。软件上将ADC13获取到1.65V左右的值作为设置EXCLK_DS对应BIT31 = 0的依据。
针对当前硬件设计,软件配置如下:

上图选择自动检测电压的配置。


上图展示根据硬件设计进一步设置ADC通道及对应的分压电阻R0和R1的阻值。

上图选中adc驱动。
保存上述配置并重新编译烧录之后,系统启动log信息如下:

2.2 硬件写死电压值
以PD_X2600E_VAST_V2.0开发板为例,展示手动设置主控寄存器的CIM、SD电压。硬件参考设计同2.1章节,不再赘述。软件配置如下:


保存上述配置并重新编译烧录之后,系统启动log信息如下:

2.3 确认当前电压设置

此处打印的0x100000e0寄存器的当前值0x40000006的BIT31~30与1.2章节的芯片寄存器设置相吻合,同时进一步佐证了,当前硬件设计CIM电压为1.8v, 而SD电压为3.3v。
三 linux 下强制匹配电压
目前最新的linux代码已经将代码逻辑设置为强制在编译时写死cim和sd的电压。编译规则package/soc/x2600_510/gpio/gpio.mk在第一次编译时生成module_driver/.soc_voltage_config.in文件。如果第一次编译生成module_driver/.soc_voltage_config.in时的设置有误,可以直接修改module_driver/.soc_voltage_config.in,或者在build目录下执行make clean_app_module_driver然后重新编译整个代码即可。
3.1 编译过程中设置匹配电压

上图展示在第一次编译过程中(不存在module_driver/.soc_voltage_config.in时)通过键盘交互设置sd和cim对应电源域的方法。此处设置的要与当前硬件设计电压匹配,一定要对照硬件原理图来进行设置。编译通过后最终生成module_driver/.soc_voltage_config.in:
xy@vb:~/job/linux/testcode/module_driver$ cat .soc_voltage_config.in
cim_vol=1 sd_vol=0
3.2 kernel中设置匹配电压
烧录后启动过程会主动检测当前kernel dts中对sd和cim电压设置与module_driver/.soc_voltage_config.in中的设置是否匹配。如果可以顺利启动和挂载文件系统成功,则说明当前dts中对sd和cim电压设置与module_driver/.soc_voltage_config.in相匹配,此时跳过本章节。
如果当前dts中对sd和cim电压设置与module_driver/.soc_voltage_config.in不匹配就挂载不上文件系统,运行报错现象如下:

此时只须根据硬件原理图将module_driver/.soc_voltage_config.in或者kernel dts中的电压设置为一致的即可正常烧录和启动。
下面将详述如何修改kernel dts中默认cim、sd电压,以整体配置文件x2600e_nand_5.10_defconfig为例。
//获取当前kernel路径及当前配置文件
xy@vb:~/job/linux/testcode/build$ cat configs/x2600e_nand_5.10_defconfig |grep kernel
APP_kernel_dir=../kernel/kernel
APP_kernel_config=x2600_evb_module_base_linux_sfc_nand_defconfig
//定位当当前kernel加载的dts文件
xy@vb:~/job/linux/testcode/kernel/kernel$ cat arch/mips/configs/x2600_evb_module_base_linux_sfc_nand_defconfig |grep dts
CONFIG_DT_X2600_MODULE_BASE_DTS_FILE="x2600_evb_module_base.dts"
xy@vb:~/job/linux/testcode/kernel/kernel$ find ./ -name x2600_evb_module_base.dts
./module_drivers/dts/x2600_evb_module_base.dts
./module_drivers/dts-stage/x2600/x2600_evb_module_base.dts
可知当前dts文件为kernel/kernel/module_drivers/dts/x2600_evb_module_base.dts (不是module_drivers/dts-stage/下的dts文件)。修改其中对cim和sd的设置(一定要与硬件设计保持一致):

其中ingenic,gpa_voltage对应cim的默认电压设置,ingenic,gpe_msc_voltage对应sd的默认电压设置。
正常启动时会有如下当前cim和sd电压的log,表示编译时对cim和sd电压设置和kernel中的dts电压设置相匹配:

再次确认当前设置的cim和sd电压是否和硬件设计原理图匹配!务必保证匹配,不然会有烧坏主控芯片的风险。
3.3 确认当前电压设置

此处打印的0x100000e0寄存器的当前值0x40000006的BIT31~30与1.2章节的芯片寄存器设置相吻合,同时进一步佐证了,当前硬件设计CIM电压为1.8v, 而SD电压为3.3v。