全志T507平台GPIO 控制(二)
五. 软件API控制
5.1 IO驱动解析
longan/device/config/chips/t507/configs/evb2/board.dts
//从左到右
1st: &gpio表示引用哪个gpio;
2nd: PE表示第E组gpio;
3rd:13表示gpio号.gpio_num = of_get_named_gpio_flags() //解析gpio number
4rd: 1表示gpio_function=0即输出、1即输入;
5th:上下拉0xf即reserved默认不拉
6th:驱动能力0xf即level3;
7th:输出电平(只有配置output才生效)1:拉高、0:拉低
longan/kernel/linux-4.9/drivers/unis_pinctrl/unis_gpio.c
gpio:0x4即gpio number;
mul_sel:0x0即输入、0x1即输出、0x7即IO disable(default)
pull:0x0即disable不拉(default)、0x01即pull up、0x2即pull down
drv_level:0x0即level0、 0x1即level1(default)、0x2即level2、0x2即leve2、0x3即level3
data:0即拉低、1即拉高
5.2 AHD GPIO控制
PE13:控制输出5V; PE16:控制输出12V;
实现打开相机时拉高PE13, PE16、退出相机时拉低PE13、PE16;
diff --git a/longan/device/config/chips/t507/configs/evb2/board.dts b/longan/device/config/chips/t507/configs/evb2/board.dts
index 0bbfec30ea..7747885175 100644
--- a/longan/device/config/chips/t507/configs/evb2/board.dts
+++ b/longan/device/config/chips/t507/configs/evb2/board.dts
@@ -103,11 +103,12 @@gpio_num = <&pio PE 10 1 0xffffffff 0xffffffff 1>;gpio_function = <0>; //0:output 1:input};
-
+ /* OUTPUT1 {gpio_num = <&pio PE 16 1 0xffffffff 0xffffffff 1>;gpio_function = <0>; //0:output 1:input};
+ */OUTPUT2 {gpio_num = <&pio PE 17 1 0xffffffff 0xffffffff 1>;
@@ -128,11 +129,12 @@gpio_num = <&pio PE 11 1 0xffffffff 0xffffffff 1>;gpio_function = <0>; //0:output 1:input};
-
+ /* AHD_EN {gpio_num = <&pio PE 13 1 0xffffffff 0xffffffff 1>;gpio_function = <0>; //0:output 1:input};
+ */VCC_det {gpio_num = <&pio PE 20 1 0xffffffff 0xffffffff 1>;
@@ -932,8 +934,8 @@ vinc(x)_sensor_list: use sensor listsensor0_avdd_vol = <1200000>;sensor0_dvdd-supply = <®_bldo5>;sensor0_dvdd_vol = <1200000>;
- //sensor0_power_en = <&pio PE 13 1 0 1 0>;
- sensor0_power_en = <>;
+ sensor0_power_en = <&pio PE 13 1 0 1 0>;
+ sensor0_vahd_en = <&pio PE 16 1 0 1 0>;sensor0_reset = <&pio PI 15 1 0 1 0>;sensor0_pwdn = <>;sensor0_sm_vs = <>;
diff --git a/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/modules/sensor/rn6854m_mipi.c b/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/modules/sensor/rn6854m_mipi.c
index d3af0eda31..cada28b846 100644
--- a/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/modules/sensor/rn6854m_mipi.c
+++ b/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/modules/sensor/rn6854m_mipi.c
@@ -443,13 +443,19 @@ static int sensor_power(struct v4l2_subdev *sd, int on)cci_lock(sd);vin_gpio_set_status(sd, RESET, 1);vin_gpio_set_status(sd, PWDN, 1);
+ vin_gpio_set_status(sd, POWER_EN, 1);
+ vin_gpio_set_status(sd, VAHD_EN, 1);vin_set_mclk_freq(sd, MCLK);vin_set_mclk(sd, ON);usleep_range(1000, 1200);
+ vin_gpio_write(sd, POWER_EN, CSI_GPIO_HIGH);
+ usleep_range(1000, 1200);
+ vin_gpio_write(sd, VAHD_EN, CSI_GPIO_HIGH);vin_set_pmu_channel(sd, CAMERAVDD, ON);vin_set_pmu_channel(sd, IOVDD, ON);vin_set_pmu_channel(sd, DVDD, ON);vin_set_pmu_channel(sd, AVDD, ON);
+ usleep_range(1000, 1200);vin_gpio_write(sd, RESET, CSI_GPIO_LOW);vin_gpio_write(sd, PWDN, CSI_GPIO_HIGH);
@@ -468,6 +474,8 @@ static int sensor_power(struct v4l2_subdev *sd, int on)vin_gpio_set_status(sd, RESET, 1);vin_gpio_write(sd, RESET, CSI_GPIO_HIGH);vin_gpio_write(sd, RESET, CSI_GPIO_LOW);
+ vin_gpio_write(sd, POWER_EN, CSI_GPIO_LOW);
+ vin_gpio_write(sd, VAHD_EN, CSI_GPIO_LOW);vin_set_pmu_channel(sd, IOVDD, OFF);vin_set_pmu_channel(sd, DVDD, OFF);vin_set_pmu_channel(sd, AVDD, OFF);
diff --git a/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/utility/config.c b/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/utility/config.c
index 9074767715..45fe8f1d6c 100644
--- a/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/utility/config.c
+++ b/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/utility/config.c
@@ -487,6 +487,13 @@ static int get_power_en(struct device_node *np, const char *name,{return get_gpio_info(np, name, &sc->gpio[POWER_EN]);}
+
+static int get_vahd_en(struct device_node *np, const char *name,
+ struct sensor_list *sc)
+{
+ return get_gpio_info(np, name, &sc->gpio[VAHD_EN]);
+}
+static int get_reset(struct device_node *np, const char *name,struct sensor_list *sc){
@@ -594,6 +601,7 @@ static struct FetchFunArr fetch_camera[] = {{"dvdd", 1, get_dvdd,},{"dvdd_vol", 1, get_dvdd_vol,},{"power_en", 1, get_power_en,},
+ {"vahd_en", 1, get_vahd_en,},{"reset", 1, get_reset,},{"pwdn", 1, get_pwdn,},{"sm_hs", 1, get_sm_hs,},
@@ -650,6 +658,7 @@ int parse_modules_from_device_tree(struct vin_md *vind)[RESET] = {GPIOE(14), 1, 0, 1, 0,},[PWDN] = {GPIOE(15), 1, 0, 1, 0,},[POWER_EN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},
+ [VAHD_EN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},[FLASH_EN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},[FLASH_MODE] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},[AF_PWDN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},
@@ -687,6 +696,7 @@ int parse_modules_from_device_tree(struct vin_md *vind)[RESET] = {GPIOE(14), 1, 0, 1, 0,},[PWDN] = {GPIOE(15), 1, 0, 1, 0,},[POWER_EN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},
+ [VAHD_EN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},[FLASH_EN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},[FLASH_MODE] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},[AF_PWDN] = {GPIO_INDEX_INVALID, 0, 0, 0, 0,},
diff --git a/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/utility/vin_supply.h b/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/utility/vin_supply.h
index a75f34c9ed..2e9b071910 100644
--- a/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/utility/vin_supply.h
+++ b/longan/kernel/linux-4.9/drivers/media/platform/sunxi-vin/utility/vin_supply.h
@@ -26,6 +26,7 @@ enum pmic_channel {enum gpio_type {POWER_EN = 0,
+ VAHD_EN,PWDN,RESET,SM_HS,