mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
modules/display: Add support for Python backlight controllers.
This commit is contained in:
parent
dd8e82fa95
commit
391ec443f6
@ -209,13 +209,6 @@
|
|||||||
#define OMV_SPI_DISPLAY_RST_PIN (&omv_pin_D12_GPIO)
|
#define OMV_SPI_DISPLAY_RST_PIN (&omv_pin_D12_GPIO)
|
||||||
#define OMV_SPI_DISPLAY_BL_PIN (&omv_pin_A5_GPIO)
|
#define OMV_SPI_DISPLAY_BL_PIN (&omv_pin_A5_GPIO)
|
||||||
|
|
||||||
#define OMV_DISPLAY_BL_DAC (DAC)
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CHANNEL (DAC_CHANNEL_2)
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CLK_ENABLE() __HAL_RCC_DAC_CLK_ENABLE()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CLK_DISABLE() __HAL_RCC_DAC_CLK_DISABLE()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_FORCE_RESET() __HAL_RCC_DAC_FORCE_RESET()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC_RELEASE_RESET()
|
|
||||||
|
|
||||||
// FIR Lepton
|
// FIR Lepton
|
||||||
#define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID)
|
#define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID)
|
||||||
#define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED)
|
#define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED)
|
||||||
|
|||||||
@ -209,13 +209,6 @@
|
|||||||
#define OMV_SPI_DISPLAY_RST_PIN (&omv_pin_D12_GPIO)
|
#define OMV_SPI_DISPLAY_RST_PIN (&omv_pin_D12_GPIO)
|
||||||
#define OMV_SPI_DISPLAY_BL_PIN (&omv_pin_A5_GPIO)
|
#define OMV_SPI_DISPLAY_BL_PIN (&omv_pin_A5_GPIO)
|
||||||
|
|
||||||
#define OMV_DISPLAY_BL_DAC (DAC)
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CHANNEL (DAC_CHANNEL_2)
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CLK_ENABLE() __HAL_RCC_DAC_CLK_ENABLE()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CLK_DISABLE() __HAL_RCC_DAC_CLK_DISABLE()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_FORCE_RESET() __HAL_RCC_DAC_FORCE_RESET()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC_RELEASE_RESET()
|
|
||||||
|
|
||||||
// FIR Lepton
|
// FIR Lepton
|
||||||
#define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID)
|
#define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID)
|
||||||
#define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED)
|
#define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED)
|
||||||
|
|||||||
@ -310,13 +310,6 @@
|
|||||||
#define OMV_SPI_DISPLAY_RST_PIN (&omv_pin_D12_GPIO)
|
#define OMV_SPI_DISPLAY_RST_PIN (&omv_pin_D12_GPIO)
|
||||||
#define OMV_SPI_DISPLAY_BL_PIN (&omv_pin_A5_GPIO)
|
#define OMV_SPI_DISPLAY_BL_PIN (&omv_pin_A5_GPIO)
|
||||||
|
|
||||||
#define OMV_DISPLAY_BL_DAC (DAC1)
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CHANNEL (DAC_CHANNEL_2)
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CLK_ENABLE() __HAL_RCC_DAC12_CLK_ENABLE()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CLK_DISABLE() __HAL_RCC_DAC12_CLK_DISABLE()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_FORCE_RESET() __HAL_RCC_DAC12_FORCE_RESET()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC12_RELEASE_RESET()
|
|
||||||
|
|
||||||
// FIR Lepton
|
// FIR Lepton
|
||||||
#define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID)
|
#define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID)
|
||||||
#define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED)
|
#define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED)
|
||||||
|
|||||||
@ -314,13 +314,6 @@
|
|||||||
#define OMV_SPI_DISPLAY_BL_PIN (&omv_pin_A5_GPIO)
|
#define OMV_SPI_DISPLAY_BL_PIN (&omv_pin_A5_GPIO)
|
||||||
#define OMV_SPI_DISPLAY_TRIPLE_BUFFER (1)
|
#define OMV_SPI_DISPLAY_TRIPLE_BUFFER (1)
|
||||||
|
|
||||||
#define OMV_DISPLAY_BL_DAC (DAC1)
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CHANNEL (DAC_CHANNEL_2)
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CLK_ENABLE() __HAL_RCC_DAC12_CLK_ENABLE()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CLK_DISABLE() __HAL_RCC_DAC12_CLK_DISABLE()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_FORCE_RESET() __HAL_RCC_DAC12_FORCE_RESET()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC12_RELEASE_RESET()
|
|
||||||
|
|
||||||
// FIR Lepton
|
// FIR Lepton
|
||||||
#define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID)
|
#define OMV_FIR_LEPTON_I2C_BUS (FIR_I2C_ID)
|
||||||
#define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED)
|
#define OMV_FIR_LEPTON_I2C_BUS_SPEED (FIR_I2C_SPEED)
|
||||||
|
|||||||
@ -355,15 +355,6 @@
|
|||||||
#define OMV_RGB_DISPLAY_DISP_PIN (&omv_pin_G9_GPIO)
|
#define OMV_RGB_DISPLAY_DISP_PIN (&omv_pin_G9_GPIO)
|
||||||
#define OMV_RGB_DISPLAY_BL_PIN (&omv_pin_B0_TIM3)
|
#define OMV_RGB_DISPLAY_BL_PIN (&omv_pin_B0_TIM3)
|
||||||
|
|
||||||
#define OMV_DISPLAY_BL_TIM (TIM3)
|
|
||||||
#define OMV_DISPLAY_BL_TIM_FREQ (100000)
|
|
||||||
#define OMV_DISPLAY_BL_TIM_CHANNEL (TIM_CHANNEL_3)
|
|
||||||
#define OMV_DISPLAY_BL_TIM_CLK_ENABLE() __HAL_RCC_TIM3_CLK_ENABLE()
|
|
||||||
#define OMV_DISPLAY_BL_TIM_CLK_DISABLE() __HAL_RCC_TIM3_CLK_DISABLE()
|
|
||||||
#define OMV_DISPLAY_BL_TIM_FORCE_RESET() __HAL_RCC_TIM3_FORCE_RESET()
|
|
||||||
#define OMV_DISPLAY_BL_TIM_RELEASE_RESET() __HAL_RCC_TIM3_RELEASE_RESET()
|
|
||||||
#define OMV_DISPLAY_BL_TIM_PCLK_FREQ() HAL_RCC_GetPCLK1Freq()
|
|
||||||
|
|
||||||
// SPI LCD Interface
|
// SPI LCD Interface
|
||||||
#define OMV_SPI_DISPLAY_CONTROLLER (SPI2_ID)
|
#define OMV_SPI_DISPLAY_CONTROLLER (SPI2_ID)
|
||||||
#define OMV_SPI_DISPLAY_MOSI_PIN (&omv_pin_B15_SPI2)
|
#define OMV_SPI_DISPLAY_MOSI_PIN (&omv_pin_B15_SPI2)
|
||||||
@ -376,13 +367,6 @@
|
|||||||
#define OMV_SPI_DISPLAY_BL_PIN (&omv_pin_A5_GPIO)
|
#define OMV_SPI_DISPLAY_BL_PIN (&omv_pin_A5_GPIO)
|
||||||
#define OMV_SPI_DISPLAY_TRIPLE_BUFFER (1)
|
#define OMV_SPI_DISPLAY_TRIPLE_BUFFER (1)
|
||||||
|
|
||||||
#define OMV_DISPLAY_BL_DAC (DAC1)
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CHANNEL (DAC_CHANNEL_2)
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CLK_ENABLE() __HAL_RCC_DAC12_CLK_ENABLE()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_CLK_DISABLE() __HAL_RCC_DAC12_CLK_DISABLE()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_FORCE_RESET() __HAL_RCC_DAC12_FORCE_RESET()
|
|
||||||
#define OMV_DISPLAY_BL_DAC_RELEASE_RESET() __HAL_RCC_DAC12_RELEASE_RESET()
|
|
||||||
|
|
||||||
// HDMI CEC/DDC I/O
|
// HDMI CEC/DDC I/O
|
||||||
#define OMV_DISPLAY_CEC_ENABLE (1)
|
#define OMV_DISPLAY_CEC_ENABLE (1)
|
||||||
#define OMV_DISPLAY_DDC_ENABLE (1)
|
#define OMV_DISPLAY_DDC_ENABLE (1)
|
||||||
|
|||||||
@ -69,6 +69,13 @@ STATIC mp_obj_t py_display_deinit(mp_obj_t self_in) {
|
|||||||
if (display_p->deinit != NULL) {
|
if (display_p->deinit != NULL) {
|
||||||
display_p->deinit(self);
|
display_p->deinit(self);
|
||||||
}
|
}
|
||||||
|
if (self->bl_controller != mp_const_none) {
|
||||||
|
mp_obj_t dest[2];
|
||||||
|
mp_load_method_maybe(self->bl_controller, MP_QSTR_deinit, dest);
|
||||||
|
if (dest[0] != MP_OBJ_NULL) {
|
||||||
|
mp_call_method_n_kw(0, 0, dest);
|
||||||
|
}
|
||||||
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_display_deinit_obj, py_display_deinit);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_display_deinit_obj, py_display_deinit);
|
||||||
@ -86,17 +93,27 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(py_display_clear_obj, 1, 2, py_displa
|
|||||||
|
|
||||||
STATIC mp_obj_t py_display_backlight(uint n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t py_display_backlight(uint n_args, const mp_obj_t *args) {
|
||||||
py_display_obj_t *self = MP_OBJ_TO_PTR(args[0]);
|
py_display_obj_t *self = MP_OBJ_TO_PTR(args[0]);
|
||||||
|
|
||||||
if (n_args > 1) {
|
if (n_args > 1) {
|
||||||
uint32_t intensity = mp_obj_get_int(args[1]);
|
uint32_t intensity = mp_obj_get_int(args[1]);
|
||||||
if ((intensity < 0) || (255 < intensity)) {
|
if (intensity > 100) {
|
||||||
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("0 <= intensity <= 255!"));
|
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Intensity ranges between 0 (off) and 100 (full on)"));
|
||||||
}
|
}
|
||||||
|
if (self->bl_controller != mp_const_none) {
|
||||||
|
// If the display has a backlight controller set, call it first.
|
||||||
|
mp_obj_t dest[3];
|
||||||
|
mp_load_method(self->bl_controller, MP_QSTR_backlight, dest);
|
||||||
|
dest[2] = args[1];
|
||||||
|
mp_call_method_n_kw(1, 0, dest);
|
||||||
|
} else {
|
||||||
|
// Otherwise, if the display protocol's set_backlight is set, call it.
|
||||||
py_display_p_t *display_p = (py_display_p_t *) MP_OBJ_TYPE_GET_SLOT(self->base.type, protocol);
|
py_display_p_t *display_p = (py_display_p_t *) MP_OBJ_TYPE_GET_SLOT(self->base.type, protocol);
|
||||||
if (display_p->set_backlight != NULL) {
|
if (display_p->set_backlight != NULL) {
|
||||||
display_p->set_backlight(self, intensity);
|
display_p->set_backlight(self, intensity);
|
||||||
|
} else {
|
||||||
|
mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Display does not support backlight control."));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
self->intensity = intensity;
|
||||||
} else {
|
} else {
|
||||||
return mp_obj_new_int(self->intensity);
|
return mp_obj_new_int(self->intensity);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,6 +52,7 @@ typedef struct _py_display_obj_t {
|
|||||||
bool display_on;
|
bool display_on;
|
||||||
bool portrait;
|
bool portrait;
|
||||||
mp_obj_t controller;
|
mp_obj_t controller;
|
||||||
|
mp_obj_t bl_controller;
|
||||||
#if defined(OMV_SPI_DISPLAY_CONTROLLER)
|
#if defined(OMV_SPI_DISPLAY_CONTROLLER)
|
||||||
omv_spi_t spi_bus;
|
omv_spi_t spi_bus;
|
||||||
bool spi_tx_running;
|
bool spi_tx_running;
|
||||||
|
|||||||
@ -288,53 +288,12 @@ static void spi_display_clear(py_display_obj_t *self, bool display_off) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef OMV_DISPLAY_BL_DAC
|
|
||||||
static DAC_HandleTypeDef lcd_dac_handle;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef OMV_SPI_DISPLAY_BL_PIN
|
#ifdef OMV_SPI_DISPLAY_BL_PIN
|
||||||
static void spi_display_set_backlight(py_display_obj_t *self, uint32_t intensity) {
|
static void spi_display_set_backlight(py_display_obj_t *self, uint32_t intensity) {
|
||||||
#ifdef OMV_DISPLAY_BL_DAC
|
|
||||||
if ((self->intensity < 255) && (255 <= intensity)) {
|
|
||||||
#else
|
|
||||||
if ((self->intensity < 1) && (1 <= intensity)) {
|
|
||||||
#endif
|
|
||||||
omv_gpio_write(OMV_SPI_DISPLAY_BL_PIN, 1);
|
|
||||||
omv_gpio_deinit(OMV_SPI_DISPLAY_BL_PIN);
|
|
||||||
} else if ((0 < self->intensity) && (intensity <= 0)) {
|
|
||||||
omv_gpio_config(OMV_SPI_DISPLAY_BL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
omv_gpio_config(OMV_SPI_DISPLAY_BL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
||||||
omv_gpio_write(OMV_SPI_DISPLAY_BL_PIN, 0);
|
omv_gpio_write(OMV_SPI_DISPLAY_BL_PIN, !!intensity);
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef OMV_DISPLAY_BL_DAC
|
|
||||||
if (((self->intensity <= 0) || (255 <= self->intensity)) && (0 < intensity) && (intensity < 255)) {
|
|
||||||
omv_gpio_config(OMV_SPI_DISPLAY_BL_PIN, OMV_GPIO_MODE_ANALOG, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
|
||||||
|
|
||||||
DAC_ChannelConfTypeDef lcd_dac_channel_handle;
|
|
||||||
lcd_dac_handle.Instance = OMV_DISPLAY_BL_DAC;
|
|
||||||
lcd_dac_channel_handle.DAC_Trigger = DAC_TRIGGER_NONE;
|
|
||||||
lcd_dac_channel_handle.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
|
|
||||||
#if defined(MCU_SERIES_H7)
|
|
||||||
lcd_dac_channel_handle.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
|
|
||||||
lcd_dac_channel_handle.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
|
|
||||||
lcd_dac_channel_handle.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
HAL_DAC_Init(&lcd_dac_handle);
|
|
||||||
HAL_DAC_ConfigChannel(&lcd_dac_handle, &lcd_dac_channel_handle, OMV_DISPLAY_BL_DAC_CHANNEL);
|
|
||||||
HAL_DAC_Start(&lcd_dac_handle, OMV_DISPLAY_BL_DAC_CHANNEL);
|
|
||||||
HAL_DAC_SetValue(&lcd_dac_handle, OMV_DISPLAY_BL_DAC_CHANNEL, DAC_ALIGN_8B_R, intensity);
|
|
||||||
} else if ((0 < self->intensity) && (self->intensity < 255) && ((intensity <= 0) || (255 <= intensity))) {
|
|
||||||
HAL_DAC_Stop(&lcd_dac_handle, OMV_DISPLAY_BL_DAC_CHANNEL);
|
|
||||||
HAL_DAC_DeInit(&lcd_dac_handle);
|
|
||||||
} else if ((0 < self->intensity) && (self->intensity < 255) && (0 < intensity) && (intensity < 255)) {
|
|
||||||
HAL_DAC_SetValue(&lcd_dac_handle, OMV_DISPLAY_BL_DAC_CHANNEL, DAC_ALIGN_8B_R, intensity);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
self->intensity = intensity;
|
|
||||||
}
|
}
|
||||||
#endif // OMV_SPI_DISPLAY_BL_PIN
|
#endif
|
||||||
|
|
||||||
static void spi_display_deinit(py_display_obj_t *self) {
|
static void spi_display_deinit(py_display_obj_t *self) {
|
||||||
if (self->triple_buffer) {
|
if (self->triple_buffer) {
|
||||||
@ -345,14 +304,13 @@ static void spi_display_deinit(py_display_obj_t *self) {
|
|||||||
omv_spi_deinit(&self->spi_bus);
|
omv_spi_deinit(&self->spi_bus);
|
||||||
omv_gpio_deinit(OMV_SPI_DISPLAY_RS_PIN);
|
omv_gpio_deinit(OMV_SPI_DISPLAY_RS_PIN);
|
||||||
omv_gpio_deinit(OMV_SPI_DISPLAY_RST_PIN);
|
omv_gpio_deinit(OMV_SPI_DISPLAY_RST_PIN);
|
||||||
|
|
||||||
#ifdef OMV_SPI_DISPLAY_BL_PIN
|
#ifdef OMV_SPI_DISPLAY_BL_PIN
|
||||||
spi_display_set_backlight(self, 255);
|
omv_gpio_deinit(OMV_SPI_DISPLAY_BL_PIN);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_t spi_display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
|
mp_obj_t spi_display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
|
||||||
enum { ARG_width, ARG_height, ARG_refresh, ARG_bgr, ARG_byte_swap, ARG_triple_buffer };
|
enum { ARG_width, ARG_height, ARG_refresh, ARG_bgr, ARG_byte_swap, ARG_triple_buffer, ARG_backlight };
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_width, MP_ARG_INT, {.u_int = 128 } },
|
{ MP_QSTR_width, MP_ARG_INT, {.u_int = 128 } },
|
||||||
{ MP_QSTR_height, MP_ARG_INT, {.u_int = 160 } },
|
{ MP_QSTR_height, MP_ARG_INT, {.u_int = 160 } },
|
||||||
@ -360,6 +318,7 @@ mp_obj_t spi_display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
|
|||||||
{ MP_QSTR_bgr, MP_ARG_BOOL, {.u_bool = false} },
|
{ MP_QSTR_bgr, MP_ARG_BOOL, {.u_bool = false} },
|
||||||
{ MP_QSTR_byte_swap, MP_ARG_BOOL, {.u_bool = false} },
|
{ MP_QSTR_byte_swap, MP_ARG_BOOL, {.u_bool = false} },
|
||||||
{ MP_QSTR_triple_buffer, MP_ARG_BOOL, {.u_bool = LCD_TRIPLE_BUFFER_DEFAULT} },
|
{ MP_QSTR_triple_buffer, MP_ARG_BOOL, {.u_bool = LCD_TRIPLE_BUFFER_DEFAULT} },
|
||||||
|
{ MP_QSTR_backlight, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} },
|
||||||
};
|
};
|
||||||
|
|
||||||
// Parse args.
|
// Parse args.
|
||||||
@ -386,6 +345,7 @@ mp_obj_t spi_display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
|
|||||||
self->triple_buffer = args[ARG_triple_buffer].u_bool;
|
self->triple_buffer = args[ARG_triple_buffer].u_bool;
|
||||||
self->bgr = args[ARG_bgr].u_bool;
|
self->bgr = args[ARG_bgr].u_bool;
|
||||||
self->byte_swap = args[ARG_byte_swap].u_bool;
|
self->byte_swap = args[ARG_byte_swap].u_bool;
|
||||||
|
self->bl_controller = args[ARG_backlight].u_obj;
|
||||||
|
|
||||||
omv_spi_config_t spi_config;
|
omv_spi_config_t spi_config;
|
||||||
omv_spi_default_config(&spi_config, OMV_SPI_DISPLAY_CONTROLLER);
|
omv_spi_default_config(&spi_config, OMV_SPI_DISPLAY_CONTROLLER);
|
||||||
@ -426,10 +386,6 @@ mp_obj_t spi_display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
|
|||||||
fb_alloc_mark_permanent();
|
fb_alloc_mark_permanent();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef OMV_SPI_DISPLAY_BL_PIN
|
|
||||||
spi_display_set_backlight(self, 255);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return MP_OBJ_FROM_PTR(self);
|
return MP_OBJ_FROM_PTR(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -55,9 +55,6 @@ typedef struct _display_state {
|
|||||||
#ifdef OMV_DSI_DISPLAY_CONTROLLER
|
#ifdef OMV_DSI_DISPLAY_CONTROLLER
|
||||||
DSI_HandleTypeDef hdsi;
|
DSI_HandleTypeDef hdsi;
|
||||||
#endif
|
#endif
|
||||||
#ifdef OMV_DISPLAY_BL_TIM
|
|
||||||
TIM_HandleTypeDef htim;
|
|
||||||
#endif
|
|
||||||
LTDC_LayerCfgTypeDef framebuffer_layers[FRAMEBUFFER_COUNT];
|
LTDC_LayerCfgTypeDef framebuffer_layers[FRAMEBUFFER_COUNT];
|
||||||
} display_state_t;
|
} display_state_t;
|
||||||
|
|
||||||
@ -485,56 +482,10 @@ static void display_clear(py_display_obj_t *self, bool off) {
|
|||||||
|
|
||||||
#ifdef OMV_DISPLAY_BL_PIN
|
#ifdef OMV_DISPLAY_BL_PIN
|
||||||
static void display_set_backlight(py_display_obj_t *self, uint32_t intensity) {
|
static void display_set_backlight(py_display_obj_t *self, uint32_t intensity) {
|
||||||
#ifdef OMV_DISPLAY_BL_TIM
|
|
||||||
if ((self->intensity < 255) && (255 <= intensity)) {
|
|
||||||
#else
|
|
||||||
if ((self->intensity < 1) && (1 <= intensity)) {
|
|
||||||
#endif
|
|
||||||
omv_gpio_config(OMV_DISPLAY_BL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
omv_gpio_config(OMV_DISPLAY_BL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
||||||
omv_gpio_write(OMV_DISPLAY_BL_PIN, 1);
|
omv_gpio_write(OMV_DISPLAY_BL_PIN, !!intensity);
|
||||||
} else if ((0 < self->intensity) && (intensity <= 0)) {
|
|
||||||
omv_gpio_write(OMV_DISPLAY_BL_PIN, 0);
|
|
||||||
omv_gpio_deinit(OMV_DISPLAY_BL_PIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef OMV_DISPLAY_BL_TIM
|
|
||||||
int tclk = OMV_DISPLAY_BL_TIM_PCLK_FREQ() * 2;
|
|
||||||
int period = (tclk / OMV_DISPLAY_BL_TIM_FREQ) - 1;
|
|
||||||
|
|
||||||
if (((self->intensity <= 0) || (255 <= self->intensity)) && (0 < intensity) && (intensity < 255)) {
|
|
||||||
omv_gpio_config(OMV_DISPLAY_BL_PIN, OMV_GPIO_MODE_ALT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
|
||||||
|
|
||||||
display.htim.Instance = OMV_DISPLAY_BL_TIM;
|
|
||||||
display.htim.Init.Prescaler = 0;
|
|
||||||
display.htim.Init.CounterMode = TIM_COUNTERMODE_UP;
|
|
||||||
display.htim.Init.Period = period;
|
|
||||||
display.htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
|
||||||
display.htim.Init.RepetitionCounter = 0;
|
|
||||||
display.htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
|
||||||
|
|
||||||
TIM_OC_InitTypeDef lcd_tim_oc_handle;
|
|
||||||
lcd_tim_oc_handle.Pulse = (period * intensity) / 255;
|
|
||||||
lcd_tim_oc_handle.OCMode = TIM_OCMODE_PWM1;
|
|
||||||
lcd_tim_oc_handle.OCPolarity = TIM_OCPOLARITY_HIGH;
|
|
||||||
lcd_tim_oc_handle.OCNPolarity = TIM_OCNPOLARITY_HIGH;
|
|
||||||
lcd_tim_oc_handle.OCFastMode = TIM_OCFAST_DISABLE;
|
|
||||||
lcd_tim_oc_handle.OCIdleState = TIM_OCIDLESTATE_RESET;
|
|
||||||
lcd_tim_oc_handle.OCNIdleState = TIM_OCNIDLESTATE_RESET;
|
|
||||||
|
|
||||||
HAL_TIM_PWM_Init(&display.htim);
|
|
||||||
HAL_TIM_PWM_ConfigChannel(&display.htim, &lcd_tim_oc_handle, OMV_DISPLAY_BL_TIM_CHANNEL);
|
|
||||||
HAL_TIM_PWM_Start(&display.htim, OMV_DISPLAY_BL_TIM_CHANNEL);
|
|
||||||
} else if ((0 < self->intensity) && (self->intensity < 255) && ((intensity <= 0) || (255 <= intensity))) {
|
|
||||||
HAL_TIM_PWM_Stop(&display.htim, OMV_DISPLAY_BL_TIM_CHANNEL);
|
|
||||||
HAL_TIM_PWM_DeInit(&display.htim);
|
|
||||||
} else if ((0 < self->intensity) && (self->intensity < 255) && (0 < intensity) && (intensity < 255)) {
|
|
||||||
__HAL_TIM_SET_COMPARE(&display.htim, OMV_DISPLAY_BL_TIM_CHANNEL, (period * intensity) / 255);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
self->intensity = intensity;
|
|
||||||
}
|
}
|
||||||
#endif // OMV_DISPLAY_BL_PIN
|
#endif
|
||||||
|
|
||||||
#ifdef OMV_DSI_DISPLAY_CONTROLLER
|
#ifdef OMV_DSI_DISPLAY_CONTROLLER
|
||||||
int display_dsi_write(py_display_obj_t *self, uint8_t cmd, uint8_t *args, size_t n_args, bool dcs) {
|
int display_dsi_write(py_display_obj_t *self, uint8_t cmd, uint8_t *args, size_t n_args, bool dcs) {
|
||||||
@ -591,18 +542,18 @@ static void display_deinit(py_display_obj_t *self) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fb_alloc_free_till_mark_past_mark_permanent();
|
|
||||||
|
|
||||||
#ifdef OMV_DISPLAY_BL_PIN
|
#ifdef OMV_DISPLAY_BL_PIN
|
||||||
if (self->display_on) {
|
omv_gpio_deinit(OMV_DISPLAY_BL_PIN);
|
||||||
// back to default state
|
#endif
|
||||||
display_set_backlight(self, 0);
|
|
||||||
}
|
fb_alloc_free_till_mark_past_mark_permanent();
|
||||||
#endif // OMV_DISPLAY_BL_PIN
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_t display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
|
mp_obj_t display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
|
||||||
enum { ARG_framesize, ARG_refresh, ARG_display_on, ARG_triple_buffer, ARG_portrait, ARG_channel, ARG_controller };
|
enum {
|
||||||
|
ARG_framesize, ARG_refresh, ARG_display_on, ARG_triple_buffer,
|
||||||
|
ARG_portrait, ARG_channel, ARG_controller, ARG_backlight
|
||||||
|
};
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_framesize, MP_ARG_INT, {.u_int = DISPLAY_RESOLUTION_FWVGA } },
|
{ MP_QSTR_framesize, MP_ARG_INT, {.u_int = DISPLAY_RESOLUTION_FWVGA } },
|
||||||
{ MP_QSTR_refresh, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 60 } },
|
{ MP_QSTR_refresh, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 60 } },
|
||||||
@ -611,6 +562,7 @@ mp_obj_t display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
|
|||||||
{ MP_QSTR_portrait, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} },
|
{ MP_QSTR_portrait, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} },
|
||||||
{ MP_QSTR_channel, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0 } },
|
{ MP_QSTR_channel, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0 } },
|
||||||
{ MP_QSTR_controller, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} },
|
{ MP_QSTR_controller, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} },
|
||||||
|
{ MP_QSTR_backlight, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} },
|
||||||
};
|
};
|
||||||
|
|
||||||
// Parse args.
|
// Parse args.
|
||||||
@ -647,6 +599,7 @@ mp_obj_t display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
|
|||||||
self->height = display_modes[self->framesize].vactive;
|
self->height = display_modes[self->framesize].vactive;
|
||||||
}
|
}
|
||||||
self->controller = args[ARG_controller].u_obj;
|
self->controller = args[ARG_controller].u_obj;
|
||||||
|
self->bl_controller = args[ARG_backlight].u_obj;
|
||||||
|
|
||||||
// Store state to access it from IRQ handlers or callbacks
|
// Store state to access it from IRQ handlers or callbacks
|
||||||
display.self = self;
|
display.self = self;
|
||||||
@ -672,12 +625,6 @@ mp_obj_t display_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef OMV_DISPLAY_BL_PIN
|
|
||||||
if (self->display_on) {
|
|
||||||
display_set_backlight(self, 255); // to on state
|
|
||||||
}
|
|
||||||
#endif // OMV_DISPLAY_BL_PIN
|
|
||||||
|
|
||||||
return MP_OBJ_FROM_PTR(self);
|
return MP_OBJ_FROM_PTR(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -289,12 +289,6 @@ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) {
|
|||||||
}
|
}
|
||||||
#endif // (OMV_XCLK_SOURCE == OMV_XCLK_TIM)
|
#endif // (OMV_XCLK_SOURCE == OMV_XCLK_TIM)
|
||||||
|
|
||||||
#if defined(OMV_DISPLAY_BL_TIM)
|
|
||||||
if (htim->Instance == OMV_DISPLAY_BL_TIM) {
|
|
||||||
OMV_DISPLAY_BL_TIM_CLK_ENABLE();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(OMV_BUZZER_TIM)
|
#if defined(OMV_BUZZER_TIM)
|
||||||
if (htim->Instance == OMV_BUZZER_TIM) {
|
if (htim->Instance == OMV_BUZZER_TIM) {
|
||||||
OMV_BUZZER_TIM_CLK_ENABLE();
|
OMV_BUZZER_TIM_CLK_ENABLE();
|
||||||
@ -303,14 +297,6 @@ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) {
|
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim) {
|
||||||
#if defined(OMV_DISPLAY_BL_TIM)
|
|
||||||
if (htim->Instance == OMV_DISPLAY_BL_TIM) {
|
|
||||||
OMV_DISPLAY_BL_TIM_FORCE_RESET();
|
|
||||||
OMV_DISPLAY_BL_TIM_RELEASE_RESET();
|
|
||||||
OMV_DISPLAY_BL_TIM_CLK_DISABLE();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(OMV_BUZZER_TIM)
|
#if defined(OMV_BUZZER_TIM)
|
||||||
if (htim->Instance == OMV_BUZZER_TIM) {
|
if (htim->Instance == OMV_BUZZER_TIM) {
|
||||||
OMV_BUZZER_TIM_FORCE_RESET();
|
OMV_BUZZER_TIM_FORCE_RESET();
|
||||||
@ -660,11 +646,6 @@ void HAL_LTDC_MspInit(LTDC_HandleTypeDef *hltdc) {
|
|||||||
omv_gpio_config(OMV_RGB_DISPLAY_DISP_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
omv_gpio_config(OMV_RGB_DISPLAY_DISP_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
||||||
omv_gpio_write(OMV_RGB_DISPLAY_DISP_PIN, 0);
|
omv_gpio_write(OMV_RGB_DISPLAY_DISP_PIN, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OMV_RGB_DISPLAY_BL_PIN)
|
|
||||||
omv_gpio_config(OMV_RGB_DISPLAY_BL_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
|
||||||
omv_gpio_write(OMV_RGB_DISPLAY_BL_PIN, 0);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc) {
|
void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc) {
|
||||||
@ -714,31 +695,9 @@ void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc) {
|
|||||||
#if defined(OMV_RGB_DISPLAY_DISP_PIN)
|
#if defined(OMV_RGB_DISPLAY_DISP_PIN)
|
||||||
omv_gpio_deinit(OMV_RGB_DISPLAY_DISP_PIN);
|
omv_gpio_deinit(OMV_RGB_DISPLAY_DISP_PIN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OMV_RGB_DISPLAY_BL_PIN)
|
|
||||||
omv_gpio_deinit(OMV_RGB_DISPLAY_BL_PIN);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac) {
|
|
||||||
#if defined(OMV_DISPLAY_BL_DAC)
|
|
||||||
if (hdac->Instance == OMV_DISPLAY_BL_DAC) {
|
|
||||||
OMV_DISPLAY_BL_DAC_CLK_ENABLE();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void HAL_DAC_MspDeInit(DAC_HandleTypeDef *hdac) {
|
|
||||||
#if defined(OMV_DISPLAY_BL_DAC)
|
|
||||||
if (hdac->Instance == OMV_DISPLAY_BL_DAC) {
|
|
||||||
OMV_DISPLAY_BL_DAC_FORCE_RESET();
|
|
||||||
OMV_DISPLAY_BL_DAC_RELEASE_RESET();
|
|
||||||
OMV_DISPLAY_BL_DAC_CLK_DISABLE();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void HAL_MspDeInit(void) {
|
void HAL_MspDeInit(void) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user