全志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 list
 				sensor0_avdd_vol = <1200000>;
 				sensor0_dvdd-supply = <&reg_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,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值