五. 软件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 = <®_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,