以 lb700 cameraA power为例,在系统上电时,在uboot将该power脚拉高


原理图得到cameraA power pin为gpio12_1
根据hisi3403 pin与gpio number关系:
GPIO12_1 对应的 GPIO 号可以通过公式计算:
GPIO 号 = (12 × 8) + 1 = 96 + 1 = 97
获取gpio12_1 对应寄存器基地址:
21AP10 超高清智能网络录像机 SoC 用户指南.pdf ->1117页->GPIO12基地址: 0x0_1109_C000
获取gpio12_1操作配置地址:
21AP10_PINOUT_CN.xlsx ->查得对应gpio12_1 对应的具体寄存器地址以及配置为gpio信息
得到如下定义
#define REG_BASE_GPIO12 0x1109C000
#define GPIO_DATA_OFST_BIT1 0x08
#define GPIO_DIR_OFST 0x400
#define GPIO12_1_DIR_REG (REG_BASE_GPIO12 + GPIO_DIR_OFST)
#define GPIO12_1_DATA_REG (REG_BASE_GPIO12 + GPIO_DATA_OFST_BIT1)
在u-boot-2020.01\board\vendor\ss928v100\ss928v100.c
添加初始函数:
int board_init(void)
{
...
boot_flag_init();
+ lb170_init();
return 0;
}
继而添加如下功能:
#define DEBUG 0
#if DEBUG
#define DEBUG_PRINT(fmt, args...) printf(fmt, ##args)
#else
#define DEBUG_PRINT(fmt, args...) // No operation
#endif
int hisi3403_pin_mux_config(unsigned int iocfg_reg,unsigned int gpio_mux_value){
unsigned int gpio_pin_mux;
//set pin mux gpio
gpio_pin_mux = readl(iocfg_reg);
DEBUG_PRINT("%d read 0x%02X pinmux=0x%02X\n",__LINE__,iocfg_reg,gpio_pin_mux);
writel(gpio_mux_value, iocfg_reg);
DEBUG_PRINT("%d write 0x%02X pinmux=0x%02X\n",__LINE__,iocfg_reg,gpio_mux_value);
gpio_pin_mux = readl(iocfg_reg);
DEBUG_PRINT("%d read 0x%02X pinmux=0x%02X\n",__LINE__,iocfg_reg,gpio_pin_mux);
DEBUG_PRINT("\n");
return 0;
}
int hisi3403_gpio_set_direction(unsigned int gpio_dir_reg ,unsigned int gpio_index_mask,unsigned int gpio_set_direction){
unsigned int gpio_dir;
//set gpio direction
gpio_dir = readl(gpio_dir_reg);
DEBUG_PRINT("%d read 0x%02X dir=0x%02X\n",__LINE__,gpio_dir_reg,gpio_dir);
if(gpio_set_direction)
gpio_dir |= gpio_index_mask; //set 1
else
gpio_dir &= ~gpio_index_mask; //set 0
DEBUG_PRINT("%d write 0x%02X dir=0x%02X\n",__LINE__,gpio_dir_reg,gpio_dir);
writel(gpio_dir, gpio_dir_reg);
gpio_dir = readl(gpio_dir_reg);
DEBUG_PRINT("%d read 0x%02X dir=0x%02X\n",__LINE__,gpio_dir_reg,gpio_dir);
DEBUG_PRINT("\n");
return 0;
}
int hisi3403_gpio_set_value(unsigned int gpio_data_reg,unsigned int gpio_index_mask,unsigned int gpio_set_data){
unsigned int gpio_data;
gpio_data = readl(gpio_data_reg);
DEBUG_PRINT("%d read 0x%02X data=0x%02X\n",__LINE__,gpio_data_reg,gpio_data);
if(gpio_set_data)
gpio_data |= gpio_index_mask; //set 1
else
gpio_data &= ~gpio_index_mask; //set 0
writel(gpio_data, gpio_data_reg);
DEBUG_PRINT("%d write 0x%02X data=0x%02X\n",__LINE__,gpio_data_reg,gpio_data);
gpio_data = readl(gpio_data_reg);
DEBUG_PRINT("%d read 0x%02X data=0x%02X\n",__LINE__,gpio_data_reg,gpio_data);
return 0;
}
int gpio_out(unsigned int iocfg_reg,unsigned int gpio_mux_value,unsigned int gpio_dir_reg ,unsigned int gpio_data_reg,unsigned int gpio_index_mask,unsigned int gpio_set_data)
{
unsigned int gpio_pin_mux,gpio_dir,gpio_data;
//set pin mux gpio
gpio_pin_mux = readl(iocfg_reg);
DEBUG_PRINT("%d read 0x%02X pinmux=0x%02X\n",__LINE__,iocfg_reg,gpio_pin_mux);
writel(gpio_mux_value, iocfg_reg);
DEBUG_PRINT("%d write 0x%02X pinmux=0x%02X\n",__LINE__,iocfg_reg,gpio_mux_value);
gpio_pin_mux = readl(iocfg_reg);
DEBUG_PRINT("%d read 0x%02X pinmux=0x%02X\n",__LINE__,iocfg_reg,gpio_pin_mux);
DEBUG_PRINT("\n");
//set gpio direction
gpio_dir = readl(gpio_dir_reg);
DEBUG_PRINT("%d read 0x%02X dir=0x%02X\n",__LINE__,gpio_dir_reg,gpio_dir);
gpio_dir |= gpio_index_mask;
DEBUG_PRINT("%d write 0x%02X dir=0x%02X\n",__LINE__,gpio_dir_reg,gpio_dir);
writel(gpio_dir, gpio_dir_reg);
gpio_dir = readl(gpio_dir_reg);
DEBUG_PRINT("%d read 0x%02X dir=0x%02X\n",__LINE__,gpio_dir_reg,gpio_dir);
DEBUG_PRINT("\n");
//set gpio value
gpio_data = readl(gpio_data_reg);
DEBUG_PRINT("%d read 0x%02X data=0x%02X\n",__LINE__,gpio_data_reg,gpio_data);
if(gpio_set_data)
gpio_data |= gpio_index_mask; //set 1
else
gpio_data &= ~gpio_index_mask; //set 0
writel(gpio_data, gpio_data_reg);
DEBUG_PRINT("%d write 0x%02X data=0x%02X\n",__LINE__,gpio_data_reg,gpio_data);
gpio_data = readl(gpio_data_reg);
DEBUG_PRINT("%d read 0x%02X data=0x%02X\n",__LINE__,gpio_data_reg,gpio_data);
return 0;
}
int lb170_init(void)
{
/*
* camera_init
* power:12_1
* rst:9_5
*
*/
hisi3403_pin_mux_config(IOCFG_REG106,IOCFG_REG106_GPIO);
hisi3403_gpio_set_direction(GPIO12_1_DIR_REG,MASK_BIT1,1);
hisi3403_pin_mux_config(IOCFG_REG82,IOCFG_REG82_GPIO);
hisi3403_gpio_set_direction(GPIO9_5_DIR_REG,MASK_BIT5,1);
hisi3403_gpio_set_value(GPIO12_1_DATA_REG,MASK_BIT1,1);
hisi3403_gpio_set_value(GPIO9_5_DATA_REG,MASK_BIT5,0);
mdelay(100);
hisi3403_gpio_set_value(GPIO9_5_DATA_REG,MASK_BIT5,1);
return 0;
}
初次调试将debug信息打开,以此确认设置是否生效,重新编译uboot下载确认是否生效。