diff --git a/main/linux-postmarketos-allwinner/0001-dts-add-dontbeevil-pinephone-devkit.patch b/main/linux-postmarketos-allwinner/0001-dts-add-dontbeevil-pinephone-devkit.patch index 7983bcf24..c2e35eb02 100644 --- a/main/linux-postmarketos-allwinner/0001-dts-add-dontbeevil-pinephone-devkit.patch +++ b/main/linux-postmarketos-allwinner/0001-dts-add-dontbeevil-pinephone-devkit.patch @@ -1,4 +1,4 @@ -From 81945ed0ee2ac05aa130046a809de5c50243216d Mon Sep 17 00:00:00 2001 +From 57b473e72d59c4c5cb2cc45432d4d5d10aca5003 Mon Sep 17 00:00:00 2001 From: Martijn Braam Date: Sat, 20 Apr 2019 01:19:48 +0200 Subject: [PATCH] dts: add dontbeevil (pinephone devkit) diff --git a/main/linux-postmarketos-allwinner/0002-dts-add-pinetab-dev-old-display-panel.patch b/main/linux-postmarketos-allwinner/0002-dts-add-pinetab-dev-old-display-panel.patch index cc98ebab9..520d52d0e 100644 --- a/main/linux-postmarketos-allwinner/0002-dts-add-pinetab-dev-old-display-panel.patch +++ b/main/linux-postmarketos-allwinner/0002-dts-add-pinetab-dev-old-display-panel.patch @@ -1,4 +1,4 @@ -From 898eeec10d6a55629f42e7f72111c5159cef07f3 Mon Sep 17 00:00:00 2001 +From 33212e529708fd480eaf9cc76579f8e7044c0505 Mon Sep 17 00:00:00 2001 From: Martijn Braam Date: Tue, 20 Oct 2020 14:42:01 +0200 Subject: [PATCH] dts: add pinetab-dev (old display panel) diff --git a/main/linux-postmarketos-allwinner/0003-Disable-8723cs-power-saving.patch b/main/linux-postmarketos-allwinner/0003-Disable-8723cs-power-saving.patch index 2da46eb51..7e8ce7976 100644 --- a/main/linux-postmarketos-allwinner/0003-Disable-8723cs-power-saving.patch +++ b/main/linux-postmarketos-allwinner/0003-Disable-8723cs-power-saving.patch @@ -1,4 +1,4 @@ -From 1864d7b1990cc68c21bd43b5f96760a9e8f04e2c Mon Sep 17 00:00:00 2001 +From 1020a8a88853f2b9dbbd269079cccb07e9f6e5aa Mon Sep 17 00:00:00 2001 From: Dalton Date: Tue, 23 Jun 2020 20:54:12 -0500 Subject: [PATCH] Disable 8723cs power saving diff --git a/main/linux-postmarketos-allwinner/0004-media-gc2145-Added-BGGR-bayer-mode.patch b/main/linux-postmarketos-allwinner/0004-media-gc2145-Added-BGGR-bayer-mode.patch index 826aee5b0..5b0cbe252 100644 --- a/main/linux-postmarketos-allwinner/0004-media-gc2145-Added-BGGR-bayer-mode.patch +++ b/main/linux-postmarketos-allwinner/0004-media-gc2145-Added-BGGR-bayer-mode.patch @@ -1,4 +1,4 @@ -From e2cbeb9a99c159024504f69b764779a61598090e Mon Sep 17 00:00:00 2001 +From 9fe17649b6f8059c603068a710f1fd3fb52a45cf Mon Sep 17 00:00:00 2001 From: Martijn Braam Date: Fri, 4 Sep 2020 17:35:39 +0200 Subject: [PATCH] media: gc2145: Added BGGR bayer mode diff --git a/main/linux-postmarketos-allwinner/0005-dts-pinephone-Disable-flash-led-in-OV5640-node.patch b/main/linux-postmarketos-allwinner/0005-dts-pinephone-Disable-flash-led-in-OV5640-node.patch deleted file mode 100644 index 85fa977f6..000000000 --- a/main/linux-postmarketos-allwinner/0005-dts-pinephone-Disable-flash-led-in-OV5640-node.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 06812a9cf09e1990ed94f7bbe944cfb1978384da Mon Sep 17 00:00:00 2001 -From: Martijn Braam -Date: Mon, 19 Oct 2020 09:17:07 +0200 -Subject: [PATCH] dts: pinephone: Disable flash-led in OV5640 node - -v4l2 can't deal with it yet, so having it enabled results in broken -camera. ---- - arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi -index 3781eb8ead66..6bc0e9d6d847 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi -@@ -439,8 +439,6 @@ ov5640: rear-camera@4c { - reset-gpios = <&pio 3 3 (GPIO_ACTIVE_LOW | GPIO_OPEN_DRAIN)>; /* PD3 */ - powerdown-gpios = <&pio 2 0 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>; /* PC0 */ - -- flash-leds = <&sgm3140_flash>; -- - port { - ov5640_ep: endpoint { - remote-endpoint = <&csi_ov5640_ep>; --- -2.25.4 - diff --git a/main/linux-postmarketos-allwinner/0006-dts-pinetab-add-missing-bma223-ohci1.patch b/main/linux-postmarketos-allwinner/0005-dts-pinetab-add-missing-bma223-ohci1.patch similarity index 95% rename from main/linux-postmarketos-allwinner/0006-dts-pinetab-add-missing-bma223-ohci1.patch rename to main/linux-postmarketos-allwinner/0005-dts-pinetab-add-missing-bma223-ohci1.patch index 46da9b486..19973dad6 100644 --- a/main/linux-postmarketos-allwinner/0006-dts-pinetab-add-missing-bma223-ohci1.patch +++ b/main/linux-postmarketos-allwinner/0005-dts-pinetab-add-missing-bma223-ohci1.patch @@ -1,4 +1,4 @@ -From ed7bbaf72095ba2e464585690032bb67d02343ce Mon Sep 17 00:00:00 2001 +From c40b6c20e60a52ab3d507793676bbdcadd80ff27 Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Tue, 20 Oct 2020 11:11:48 +0200 Subject: [PATCH] dts: pinetab: add missing bma223, ohci1 diff --git a/main/linux-postmarketos-allwinner/0007-dts-pinetab-make-audio-routing-consistent-with-pinep.patch b/main/linux-postmarketos-allwinner/0006-dts-pinetab-make-audio-routing-consistent-with-pinep.patch similarity index 95% rename from main/linux-postmarketos-allwinner/0007-dts-pinetab-make-audio-routing-consistent-with-pinep.patch rename to main/linux-postmarketos-allwinner/0006-dts-pinetab-make-audio-routing-consistent-with-pinep.patch index 383604930..e6c2ceade 100644 --- a/main/linux-postmarketos-allwinner/0007-dts-pinetab-make-audio-routing-consistent-with-pinep.patch +++ b/main/linux-postmarketos-allwinner/0006-dts-pinetab-make-audio-routing-consistent-with-pinep.patch @@ -1,4 +1,4 @@ -From f73f996638d5f9575d92b6c9383b2475d5f58a32 Mon Sep 17 00:00:00 2001 +From c068dec3d226160c71931dbd1fdb2287631776c3 Mon Sep 17 00:00:00 2001 From: Martijn Braam Date: Tue, 20 Oct 2020 14:44:51 +0200 Subject: [PATCH] dts: pinetab: make audio routing consistent with pinephone diff --git a/main/linux-postmarketos-allwinner/0008-pinetab-bluetooth.patch b/main/linux-postmarketos-allwinner/0007-arm64-dts-allwinner-Add-bluetooth-node-to-the-PineTa.patch similarity index 79% rename from main/linux-postmarketos-allwinner/0008-pinetab-bluetooth.patch rename to main/linux-postmarketos-allwinner/0007-arm64-dts-allwinner-Add-bluetooth-node-to-the-PineTa.patch index ba6429045..2a5fc1d04 100644 --- a/main/linux-postmarketos-allwinner/0008-pinetab-bluetooth.patch +++ b/main/linux-postmarketos-allwinner/0007-arm64-dts-allwinner-Add-bluetooth-node-to-the-PineTa.patch @@ -1,17 +1,17 @@ -From 139018f0c47ab5edbb827ce8a594af3a1dbb33d7 Mon Sep 17 00:00:00 2001 +From 34023e3ddf56fc9fb8003e0ceded116b20285c4d Mon Sep 17 00:00:00 2001 From: Martijn Braam Date: Tue, 20 Oct 2020 16:12:08 +0200 Subject: [PATCH] arm64: dts: allwinner: Add bluetooth node to the PineTab --- - .../boot/dts/allwinner/sun50i-a64-pinetab.dts | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) + .../arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts | 13 +++++++++++++ + 1 file changed, 13 insertions(+) diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts -index 87daa4778c63..f0c19916a406 100644 +index cc4fe685b922..72ad4fb30803 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts +++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinetab.dts -@@ -476,6 +476,19 @@ &uart0 { +@@ -488,6 +488,19 @@ &uart0 { status = "okay"; }; @@ -32,5 +32,5 @@ index 87daa4778c63..f0c19916a406 100644 dr_mode = "otg"; status = "okay"; -- -2.28.0 +2.25.4 diff --git a/main/linux-postmarketos-allwinner/0009-dts-pinephone-remove-bt-firmware-suffix.patch b/main/linux-postmarketos-allwinner/0008-dts-pinephone-remove-bt-firmware-suffix.patch similarity index 83% rename from main/linux-postmarketos-allwinner/0009-dts-pinephone-remove-bt-firmware-suffix.patch rename to main/linux-postmarketos-allwinner/0008-dts-pinephone-remove-bt-firmware-suffix.patch index 1e3c15b60..0ff2c810c 100644 --- a/main/linux-postmarketos-allwinner/0009-dts-pinephone-remove-bt-firmware-suffix.patch +++ b/main/linux-postmarketos-allwinner/0008-dts-pinephone-remove-bt-firmware-suffix.patch @@ -1,4 +1,4 @@ -From 07895c25e70dc04e7db4c11febc0402b3b54fbb8 Mon Sep 17 00:00:00 2001 +From f04b2bf8d1bd81ac99dfc8c95fcadb9a7af64b8a Mon Sep 17 00:00:00 2001 From: Martijn Braam Date: Tue, 20 Oct 2020 17:58:00 +0200 Subject: [PATCH] dts: pinephone: remove bt firmware suffix @@ -8,10 +8,10 @@ Subject: [PATCH] dts: pinephone: remove bt firmware suffix 1 file changed, 1 deletion(-) diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi -index 3781eb8ead66..1f9a56e142da 100644 +index 6bc0e9d6d847..d897b6a28cc4 100644 --- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi +++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pinephone.dtsi -@@ -824,7 +824,6 @@ bluetooth { +@@ -822,7 +822,6 @@ bluetooth { reset-gpios = <&r_pio 0 4 GPIO_ACTIVE_LOW>; /* PL4 */ device-wake-gpios = <&pio 7 6 GPIO_ACTIVE_LOW>; /* PH6 */ host-wake-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */ @@ -20,5 +20,5 @@ index 3781eb8ead66..1f9a56e142da 100644 }; -- -2.28.0 +2.25.4 diff --git a/main/linux-postmarketos-allwinner/0010-dts-pinephone-allow-leds-in-suspend.patch b/main/linux-postmarketos-allwinner/0009-dts-pinephone-allow-leds-in-suspend.patch similarity index 95% rename from main/linux-postmarketos-allwinner/0010-dts-pinephone-allow-leds-in-suspend.patch rename to main/linux-postmarketos-allwinner/0009-dts-pinephone-allow-leds-in-suspend.patch index dcd712858..8b42fac9a 100644 --- a/main/linux-postmarketos-allwinner/0010-dts-pinephone-allow-leds-in-suspend.patch +++ b/main/linux-postmarketos-allwinner/0009-dts-pinephone-allow-leds-in-suspend.patch @@ -1,4 +1,4 @@ -From 52fd9463e180df272039eec04771274b6b981dfe Mon Sep 17 00:00:00 2001 +From b9517238d29b2d0b6ddb1664454d1bba894cb2ea Mon Sep 17 00:00:00 2001 From: Miles Alan Date: Wed, 11 Nov 2020 12:51:01 +0100 Subject: [PATCH] dts: pinephone: allow leds in suspend diff --git a/main/linux-postmarketos-allwinner/0010-media-ov5640-Implement-autofocus.patch b/main/linux-postmarketos-allwinner/0010-media-ov5640-Implement-autofocus.patch new file mode 100644 index 000000000..68c6581e3 --- /dev/null +++ b/main/linux-postmarketos-allwinner/0010-media-ov5640-Implement-autofocus.patch @@ -0,0 +1,409 @@ +From f062022f2a2781d6b8ca63c460b0e72ebac30870 Mon Sep 17 00:00:00 2001 +From: Martijn Braam +Date: Mon, 28 Sep 2020 14:26:11 +0200 +Subject: [PATCH] media: ov5640: Implement autofocus + +The autofocus functionality needs a firmware blob loaded into the +internal microcontroller. + +V4L2 doesn't have an api to control all autofocus functionality, but +this at least makes it possible to focus on the center of the sensor. + +Signed-off-by: Martijn Braam +--- + drivers/media/i2c/ov5640.c | 254 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 254 insertions(+) + +diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c +index df0a507c211f..08a5304c0e95 100644 +--- a/drivers/media/i2c/ov5640.c ++++ b/drivers/media/i2c/ov5640.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -31,7 +32,11 @@ + + #define OV5640_DEFAULT_SLAVE_ID 0x3c + ++#define OV5640_REG_SYS_RESET00 0x3000 ++#define OV5640_REG_SYS_RESET01 0x3001 + #define OV5640_REG_SYS_RESET02 0x3002 ++#define OV5640_REG_SYS_CLOCK_ENABLE00 0x3004 ++#define OV5640_REG_SYS_CLOCK_ENABLE01 0x3005 + #define OV5640_REG_SYS_CLOCK_ENABLE02 0x3006 + #define OV5640_REG_SYS_CTRL0 0x3008 + #define OV5640_REG_SYS_CTRL0_SW_PWDN 0x42 +@@ -41,6 +46,14 @@ + #define OV5640_REG_PAD_OUTPUT_ENABLE01 0x3017 + #define OV5640_REG_PAD_OUTPUT_ENABLE02 0x3018 + #define OV5640_REG_PAD_OUTPUT00 0x3019 ++#define OV5640_REG_FW_CMD_MAIN 0x3022 ++#define OV5640_REG_FW_CMD_ACK 0x3023 ++#define OV5640_REG_FW_CMD_PARA0 0x3024 ++#define OV5640_REG_FW_CMD_PARA1 0x3025 ++#define OV5640_REG_FW_CMD_PARA2 0x3026 ++#define OV5640_REG_FW_CMD_PARA3 0x3027 ++#define OV5640_REG_FW_CMD_PARA4 0x3028 ++#define OV5640_REG_FW_STATUS 0x3029 + #define OV5640_REG_SYSTEM_CONTROL1 0x302e + #define OV5640_REG_SC_PLL_CTRL0 0x3034 + #define OV5640_REG_SC_PLL_CTRL1 0x3035 +@@ -59,6 +72,7 @@ + #define OV5640_REG_AEC_PK_MANUAL 0x3503 + #define OV5640_REG_AEC_PK_REAL_GAIN 0x350a + #define OV5640_REG_AEC_PK_VTS 0x350c ++#define OV5640_REG_VCM_CONTROL4 0x3606 + #define OV5640_REG_TIMING_DVPHO 0x3808 + #define OV5640_REG_TIMING_DVPVO 0x380a + #define OV5640_REG_TIMING_HTS 0x380c +@@ -95,6 +109,20 @@ + #define OV5640_REG_SDE_CTRL4 0x5584 + #define OV5640_REG_SDE_CTRL5 0x5585 + #define OV5640_REG_AVG_READOUT 0x56a1 ++#define OV5640_REG_FIRMWARE_BASE 0x8000 ++ ++#define OV5640_FW_STATUS_S_FIRMWARE 0x7f ++#define OV5640_FW_STATUS_S_STARTUP 0x7e ++#define OV5640_FW_STATUS_S_IDLE 0x70 ++#define OV5640_FW_STATUS_S_FOCUSING 0x00 ++#define OV5640_FW_STATUS_S_FOCUSED 0x10 ++ ++#define OV5640_FW_CMD_TRIGGER_FOCUS 0x03 ++#define OV5640_FW_CMD_CONTINUOUS_FOCUS 0x04 ++#define OV5640_FW_CMD_GET_FOCUS_RESULT 0x07 ++#define OV5640_FW_CMD_RELEASE_FOCUS 0x08 ++#define OV5640_FW_CMD_ZONE_CONFIG 0x12 ++#define OV5640_FW_CMD_DEFAULT_ZONES 0x80 + + enum ov5640_mode_id { + OV5640_MODE_QCIF_176_144 = 0, +@@ -218,6 +246,12 @@ struct ov5640_ctrls { + struct v4l2_ctrl *auto_gain; + struct v4l2_ctrl *gain; + }; ++ struct { ++ struct v4l2_ctrl *focus_auto; ++ struct v4l2_ctrl *af_start; ++ struct v4l2_ctrl *af_stop; ++ struct v4l2_ctrl *af_status; ++ }; + struct v4l2_ctrl *brightness; + struct v4l2_ctrl *light_freq; + struct v4l2_ctrl *saturation; +@@ -261,6 +295,8 @@ struct ov5640_dev { + + bool pending_mode_change; + bool streaming; ++ ++ bool af_initialized; + }; + + static inline struct ov5640_dev *to_ov5640_dev(struct v4l2_subdev *sd) +@@ -1967,6 +2003,118 @@ static void ov5640_reset(struct ov5640_dev *sensor) + usleep_range(20000, 25000); + } + ++static int ov5640_copy_fw_to_device(struct ov5640_dev *sensor, ++ const struct firmware *fw) ++{ ++ struct i2c_client *client = sensor->i2c_client; ++ const u8 *data = (const u8 *)fw->data; ++ u8 fw_status; ++ int i; ++ int ret; ++ ++ // Putting MCU in reset state ++ ret = ov5640_write_reg(sensor, OV5640_REG_SYS_RESET00, 0x20); ++ if (ret) ++ return ret; ++ ++ // Write firmware ++ for (i = 0; i < fw->size / sizeof(u8); i++) ++ ov5640_write_reg(sensor, ++ OV5640_REG_FIRMWARE_BASE + i, ++ data[i]); ++ ++ // Reset MCU state ++ ov5640_write_reg(sensor, OV5640_REG_FW_CMD_MAIN, 0x00); ++ ov5640_write_reg(sensor, OV5640_REG_FW_CMD_ACK, 0x00); ++ ov5640_write_reg(sensor, OV5640_REG_FW_CMD_PARA0, 0x00); ++ ov5640_write_reg(sensor, OV5640_REG_FW_CMD_PARA1, 0x00); ++ ov5640_write_reg(sensor, OV5640_REG_FW_CMD_PARA2, 0x00); ++ ov5640_write_reg(sensor, OV5640_REG_FW_CMD_PARA3, 0x00); ++ ov5640_write_reg(sensor, OV5640_REG_FW_CMD_PARA4, 0x00); ++ ov5640_write_reg(sensor, OV5640_REG_FW_STATUS, 0x7f); ++ ++ // Start AF MCU ++ ret = ov5640_write_reg(sensor, OV5640_REG_SYS_RESET00, 0x00); ++ if (ret) ++ return ret; ++ ++ dev_info(&client->dev, "firmware upload success\n"); ++ ++ // Wait for firmware to be ready ++ for (i = 0; i < 5; i++) { ++ ret = ov5640_read_reg(sensor, OV5640_REG_FW_STATUS, &fw_status); ++ if (fw_status == OV5640_FW_STATUS_S_IDLE) { ++ dev_info(&client->dev, "fw started after %d ms\n", i * 50); ++ return ret; ++ } ++ msleep(50); ++ } ++ dev_err(&client->dev, "uploaded firmware didn't start, got to 0x%x, retrying...\n", fw_status); ++ ++ // Putting MCU in reset state ++ ret = ov5640_write_reg(sensor, OV5640_REG_SYS_RESET00, 0x20); ++ if (ret) ++ return ret; ++ // Start AF MCU ++ ret = ov5640_write_reg(sensor, OV5640_REG_SYS_RESET00, 0x00); ++ if (ret) ++ return ret; ++ // Wait for firmware to be ready ++ for (i = 0; i < 5; i++) { ++ ret = ov5640_read_reg(sensor, OV5640_REG_FW_STATUS, &fw_status); ++ if (fw_status == OV5640_FW_STATUS_S_IDLE) { ++ dev_info(&client->dev, "fw started after %d ms\n", i * 50); ++ return ret; ++ } ++ msleep(50); ++ } ++ dev_err(&client->dev, "uploaded firmware didn't start, got to 0x%x\n", fw_status); ++ return -ETIMEDOUT; ++} ++ ++static int ov5640_af_init(struct ov5640_dev *sensor) ++{ ++ struct i2c_client *client = sensor->i2c_client; ++ const char* fwname = "ov5640_af.bin"; ++ const struct firmware *fw; ++ int ret; ++ ++ if (sensor->af_initialized) { ++ return 0; ++ } ++ ++ if (firmware_request_nowarn(&fw, fwname, &client->dev) == 0) { ++ ret = ov5640_copy_fw_to_device(sensor, fw); ++ if (ret == 0) ++ sensor->af_initialized = 1; ++ } else { ++ dev_warn(&client->dev, "%s: no autofocus firmware available (%s)\n", ++ __func__, fwname); ++ ret = -1; ++ } ++ release_firmware(fw); ++ ++ if (ret) ++ return ret; ++ ++ // Enable AF systems ++ ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_CLOCK_ENABLE00, ++ (BIT(6) | BIT(5)), (BIT(6) | BIT(5))); ++ if (ret) ++ return ret; ++ ret = ov5640_mod_reg(sensor, OV5640_REG_SYS_CLOCK_ENABLE01, ++ BIT(6), BIT(6)); ++ if (ret) ++ return ret; ++ ++ // Set lens focus driver on ++ ov5640_write_reg(sensor, OV5640_REG_VCM_CONTROL4, 0x3f); ++ if (ret) ++ return ret; ++ ++ return ret; ++} ++ + static int ov5640_set_power_on(struct ov5640_dev *sensor) + { + struct i2c_client *client = sensor->i2c_client; +@@ -1988,6 +2117,8 @@ static int ov5640_set_power_on(struct ov5640_dev *sensor) + goto xclk_off; + } + ++ sensor->af_initialized = 0; ++ + ov5640_reset(sensor); + ov5640_power(sensor, true); + +@@ -2416,6 +2547,35 @@ static int ov5640_set_framefmt(struct ov5640_dev *sensor, + is_jpeg ? (BIT(5) | BIT(3)) : 0); + } + ++static int ov5640_fw_command(struct ov5640_dev *sensor, int command) ++{ ++ u8 fw_ack; ++ int i; ++ int ret; ++ ++ ret = ov5640_write_reg(sensor, OV5640_REG_FW_CMD_ACK, 0x01); ++ if(ret) ++ return ret; ++ ++ ret = ov5640_write_reg(sensor, OV5640_REG_FW_CMD_MAIN, command); ++ if(ret) ++ return ret; ++ ++ for (i = 0; i < 100; i++) { ++ ret = ov5640_read_reg(sensor, OV5640_REG_FW_CMD_ACK, &fw_ack); ++ if (ret) ++ return ret; ++ ++ if (fw_ack == 0){ ++ return ret; ++ } ++ ++ msleep(50); ++ } ++ return -ETIMEDOUT; ++} ++ ++ + /* + * Sensor Controls. + */ +@@ -2532,6 +2692,41 @@ static int ov5640_set_ctrl_exposure(struct ov5640_dev *sensor, + return ret; + } + ++static int ov5640_set_ctrl_focus(struct ov5640_dev *sensor, int command) ++{ ++ struct i2c_client *client = sensor->i2c_client; ++ int ret; ++ ++ ret = ov5640_af_init(sensor); ++ if (ret) { ++ dev_err(&client->dev, "%s: no autofocus firmware loaded\n", ++ __func__); ++ return 0; ++ } ++ ++ if (command == OV5640_FW_CMD_RELEASE_FOCUS) { ++ dev_dbg(&client->dev, "%s: Releasing autofocus\n", ++ __func__); ++ return ov5640_fw_command(sensor, OV5640_FW_CMD_RELEASE_FOCUS); ++ } ++ ++ // Restart zone config ++ ret = ov5640_fw_command(sensor, OV5640_FW_CMD_ZONE_CONFIG); ++ if (ret) ++ return ret; ++ ++ // Set default focus zones ++ ret = ov5640_fw_command(sensor, OV5640_FW_CMD_DEFAULT_ZONES); ++ if (ret) ++ return ret; ++ ++ dev_dbg(&client->dev, "%s: Triggering autofocus\n", ++ __func__); ++ ++ // Start focussing ++ return ov5640_fw_command(sensor, command); ++} ++ + static int ov5640_set_ctrl_gain(struct ov5640_dev *sensor, bool auto_gain) + { + struct ov5640_ctrls *ctrls = &sensor->ctrls; +@@ -2638,6 +2833,32 @@ static int ov5640_set_ctrl_vflip(struct ov5640_dev *sensor, int value) + (BIT(2) | BIT(1)) : 0); + } + ++static int ov5640_get_af_status(struct ov5640_dev *sensor) ++{ ++ u8 fw_status; ++ int ret; ++ ++ ret = ov5640_read_reg(sensor, OV5640_REG_FW_STATUS, &fw_status); ++ if (ret) ++ return ret; ++ ++ switch (fw_status) { ++ case OV5640_FW_STATUS_S_FIRMWARE: ++ case OV5640_FW_STATUS_S_STARTUP: ++ return V4L2_AUTO_FOCUS_STATUS_FAILED; ++ break; ++ case OV5640_FW_STATUS_S_IDLE: ++ return V4L2_AUTO_FOCUS_STATUS_IDLE; ++ break; ++ case OV5640_FW_STATUS_S_FOCUSED: ++ return V4L2_AUTO_FOCUS_STATUS_REACHED; ++ break; ++ default: ++ return V4L2_AUTO_FOCUS_STATUS_BUSY; ++ break; ++ } ++} ++ + static int ov5640_g_volatile_ctrl(struct v4l2_ctrl *ctrl) + { + struct v4l2_subdev *sd = ctrl_to_sd(ctrl); +@@ -2659,6 +2880,12 @@ static int ov5640_g_volatile_ctrl(struct v4l2_ctrl *ctrl) + return val; + sensor->ctrls.exposure->val = val; + break; ++ case V4L2_CID_FOCUS_AUTO: ++ val = ov5640_get_af_status(sensor); ++ if (val < 0) ++ return val; ++ sensor->ctrls.af_status->val = val; ++ break; + } + + return 0; +@@ -2690,6 +2917,18 @@ static int ov5640_s_ctrl(struct v4l2_ctrl *ctrl) + case V4L2_CID_AUTO_WHITE_BALANCE: + ret = ov5640_set_ctrl_white_balance(sensor, ctrl->val); + break; ++ case V4L2_CID_FOCUS_AUTO: ++ if (ctrl->val) ++ ret = ov5640_set_ctrl_focus(sensor, OV5640_FW_CMD_CONTINUOUS_FOCUS); ++ else ++ ret = ov5640_set_ctrl_focus(sensor, OV5640_FW_CMD_RELEASE_FOCUS); ++ break; ++ case V4L2_CID_AUTO_FOCUS_START: ++ ret = ov5640_set_ctrl_focus(sensor, OV5640_FW_CMD_TRIGGER_FOCUS); ++ break; ++ case V4L2_CID_AUTO_FOCUS_STOP: ++ ret = ov5640_set_ctrl_focus(sensor, OV5640_FW_CMD_RELEASE_FOCUS); ++ break; + case V4L2_CID_HUE: + ret = ov5640_set_ctrl_hue(sensor, ctrl->val); + break; +@@ -2762,6 +3001,20 @@ static int ov5640_init_controls(struct ov5640_dev *sensor) + ctrls->gain = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_GAIN, + 0, 1023, 1, 0); + ++ /* Autofocus */ ++ ctrls->focus_auto = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_FOCUS_AUTO, ++ 0, 1, 1, 0); ++ ctrls->af_start = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTO_FOCUS_START, ++ 0, 1, 1, 0); ++ ctrls->af_stop = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_AUTO_FOCUS_STOP, ++ 0, 1, 1, 0); ++ ctrls->af_status = v4l2_ctrl_new_std(hdl, ops, ++ V4L2_CID_AUTO_FOCUS_STATUS, 0, ++ (V4L2_AUTO_FOCUS_STATUS_BUSY | ++ V4L2_AUTO_FOCUS_STATUS_REACHED | ++ V4L2_AUTO_FOCUS_STATUS_FAILED), ++ 0, V4L2_AUTO_FOCUS_STATUS_IDLE); ++ + ctrls->saturation = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_SATURATION, + 0, 255, 1, 64); + ctrls->hue = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HUE, +@@ -2795,6 +3048,7 @@ static int ov5640_init_controls(struct ov5640_dev *sensor) + v4l2_ctrl_auto_cluster(3, &ctrls->auto_wb, 0, false); + v4l2_ctrl_auto_cluster(2, &ctrls->auto_gain, 0, true); + v4l2_ctrl_auto_cluster(2, &ctrls->auto_exp, 1, true); ++ v4l2_ctrl_cluster(4, &ctrls->focus_auto); + + sensor->sd.ctrl_handler = hdl; + return 0; +-- +2.25.4 + diff --git a/main/linux-postmarketos-allwinner/APKBUILD b/main/linux-postmarketos-allwinner/APKBUILD index 873b2045d..c272db582 100644 --- a/main/linux-postmarketos-allwinner/APKBUILD +++ b/main/linux-postmarketos-allwinner/APKBUILD @@ -5,9 +5,9 @@ _flavor=postmarketos-allwinner _config="config-$_flavor.$CARCH" pkgname=linux-$_flavor -pkgver=5.9.8_git20201115 +pkgver=5.9.8_git20201117 pkgrel=0 -_tag="orange-pi-5.9-20201115-2230" +_tag="orange-pi-5.9-20201117-1927" pkgdesc="Kernel fork with Pine64 patches (megi's tree, slightly patched)" arch="aarch64" _carch="arm64" @@ -30,12 +30,12 @@ source="$pkgname-$_tag.tar.gz::https://github.com/megous/linux/archive/$_tag.tar 0002-dts-add-pinetab-dev-old-display-panel.patch 0003-Disable-8723cs-power-saving.patch 0004-media-gc2145-Added-BGGR-bayer-mode.patch - 0005-dts-pinephone-Disable-flash-led-in-OV5640-node.patch - 0006-dts-pinetab-add-missing-bma223-ohci1.patch - 0007-dts-pinetab-make-audio-routing-consistent-with-pinep.patch - 0008-pinetab-bluetooth.patch - 0009-dts-pinephone-remove-bt-firmware-suffix.patch - 0010-dts-pinephone-allow-leds-in-suspend.patch + 0005-dts-pinetab-add-missing-bma223-ohci1.patch + 0006-dts-pinetab-make-audio-routing-consistent-with-pinep.patch + 0007-arm64-dts-allwinner-Add-bluetooth-node-to-the-PineTa.patch + 0008-dts-pinephone-remove-bt-firmware-suffix.patch + 0009-dts-pinephone-allow-leds-in-suspend.patch + 0010-media-ov5640-Implement-autofocus.patch " subpackages="$pkgname-dev" builddir="$srcdir/linux-$_tag" @@ -76,15 +76,15 @@ dev() { INSTALL_HDR_PATH="$subpkgdir"/usr } -sha512sums="a7095545fc2843c6235f7dbac21cda4f47bf0d78fc752455c98827936cf996201c56a41110fe2c00fdcec78f09ffdf2f15e72c7e62e2582a244ce5ca384df6f5 linux-postmarketos-allwinner-orange-pi-5.9-20201115-2230.tar.gz +sha512sums="4aef259ad83920b96b5cf4fde8a6c691c5ba166d39ed47671a58183fbc3a96bc8c47150121cea6a0f0f0d811ae06e66ced814175ff4e900452dfef13df92c0ae linux-postmarketos-allwinner-orange-pi-5.9-20201117-1927.tar.gz 0006b939af9c2af70266e9dc5a5b527a57cdd1abf9b6ca55c43254637519b166af88ead4f97a36b1607f96c711b287b0ba08769b5b2314407cfb41f087c50172 config-postmarketos-allwinner.aarch64 -bfeb383784e495a5d7c58fdd7abf44fa0d3460b48ddae09d69997791bb58beb55da8d04f05f30d12f4bdadbe81d0d5f8781c37a4904c1d7a283da3f7ecbadeda 0001-dts-add-dontbeevil-pinephone-devkit.patch -c157e2495a02417c2ef54c9e1788db7b32a111dd412146c4c925f2f489d0b5a94be4b484d71285abe83c4523f1ae1d4ec6f4af0acad922cb676e8a8f07611698 0002-dts-add-pinetab-dev-old-display-panel.patch -ab72dffc08e56c7ee96f87b30454f38eed6c4deb041f4cc562bdbf358a66821a698517ba9b095e327a0648cfc10e3b014187d428926ab87cb1c2441171ce2040 0003-Disable-8723cs-power-saving.patch -38d024a472dfc070b09c922548ba4eb952fde16bedbf265667c7609056f06d6d637a6236227a511198e488120bd0a2dcec5ccfc4708dc3efd800402c1904384c 0004-media-gc2145-Added-BGGR-bayer-mode.patch -796d59dc83b331e72be5943cdf899244e47f6ef14cace26950b1bb6b3f0fe5a942adf6da126a27ee0421c9a2cf862a9a18be4f1832e0ea15e4afe8a10151643a 0005-dts-pinephone-Disable-flash-led-in-OV5640-node.patch -60322820a6048c95f7a62180f3aa872f929c8c0aa6bc5cecff882cf671c132666ef803c6754e6d6f4b3d4342362ba9901c21cb23e5186601327ea17ac3d97573 0006-dts-pinetab-add-missing-bma223-ohci1.patch -36c310b00520650aec1e4ece3e995ab649d79315e5057f85587f3a6b1b5546549599c7db14bbf9b6cba76d87512116e132d0064f14aed0a6b7bbe66856e322d9 0007-dts-pinetab-make-audio-routing-consistent-with-pinep.patch -5bb1352b0bf35ff72eb9729248162faa37b0f1fe28c5cf9bd39b54148ff7750ca53d5934d6a128002a7a190180ef8e626733f260db722831ac35e3a5c1b25661 0008-pinetab-bluetooth.patch -a392e7b04dc411986b90adf8774ce8f4b77617993e7ca068ea202aa3c925d0ec3bdbd4c395505696816dce6284955bf96901d75833a9b6ca9df544386b07ff65 0009-dts-pinephone-remove-bt-firmware-suffix.patch -e254e1872617d13589b4c87c2fa5f1dff2f01b76b36fc8a4b23f843db997254013da495c419b5bef5da1bff0b1bdccfa8c650ff9e17e593e37720d16f589c047 0010-dts-pinephone-allow-leds-in-suspend.patch" +6b96dcdca84f0581d1f6354dfb752ef382b2a70793e881233e71c2af0c58d0eed965be7a494308a639e2e9035e46535f659e0c1721c0e3b8444a2ac981d7dc99 0001-dts-add-dontbeevil-pinephone-devkit.patch +5cd62667ebe1d5213d5d89423fe2a810c55fa84a238790af5f087b31cee3a3db66bcaba14001c345731bc1212060f74c0629433403be2485a5bbd4f0dd1c4f65 0002-dts-add-pinetab-dev-old-display-panel.patch +9ce2497ee1e4efd049bb41051f4e7f20bd82c2b0ed608e37d119b4973d0bc96361366fee56924c403b28d03a55264d97ac8744face524f1b88cd2731c5914509 0003-Disable-8723cs-power-saving.patch +d92db05628de20c57f69edd0558fc56eb5a1c90f6dd3046813dc2b8c7393030f55e4980ae4135f9a03dadfe9ea0d51755d997c0ba8933af7091277a5fa3a611b 0004-media-gc2145-Added-BGGR-bayer-mode.patch +10eb10fe09258e524b8770961e44bcda55189f86b0f21cf12c831beb94e9b81c66857771bbe75833d56a7bd44907efceb0e1c4022fcaaf8f1d106a83ec8a19eb 0005-dts-pinetab-add-missing-bma223-ohci1.patch +26bd19eb7849ad59ac73a002edeb5d015630c0f802b4da1ec75a01581aeb406350097b5e37ef5c0981cc503cdbfc4d24d446c193a533f01e3e4b51426c9e192e 0006-dts-pinetab-make-audio-routing-consistent-with-pinep.patch +79f244794906b84f2033b04429f9bf187f171291c8f808a65f6d2c3a9b8a029eb0460f281148ff4a43c12be4fac3d78fcc4ddfa4c14e687a3f7fc310a5921048 0007-arm64-dts-allwinner-Add-bluetooth-node-to-the-PineTa.patch +11e3210958afcd9a04885f364d9ce707845173430581601cc8d08451529f80aab137f1c578ab3453e7249fe38001eb6aafe728ba5e34e39b65c7e47a3ecd9fda 0008-dts-pinephone-remove-bt-firmware-suffix.patch +8654178915bc8251239cc2d2ee8b2f1fad6089d3fc0127d11cb1826eb88abf8b7e01aaf7e620a9e15cbc993e1120da27896b229d32a339eeb829fba7076e3efe 0009-dts-pinephone-allow-leds-in-suspend.patch +510e1cf463485315f99dfc86511fb7271591159c39cf1bbeecbc1056f8861c35603d61946f3488bfbb7a779ce9324c69d230fa159386b7920f866b47ada444a4 0010-media-ov5640-Implement-autofocus.patch"