def init(self): self.disp_spi_init() # Initialize non-SPI GPIOs esp.gpio_pad_select_gpio(self.dc) esp.gpio_set_direction(self.dc, esp.GPIO_MODE.OUTPUT) # Power the display # Gets powered on M5Stack initialization # Reset the display self.m5stack.lcd_rst(0) sleep_ms(100) self.m5stack.lcd_rst(1) sleep_ms(100) # Send all the commands for cmd in self.init_cmds: self.send_cmd(cmd["cmd"]) if "data" in cmd: self.send_data(cmd["data"]) if "delay" in cmd: sleep_ms(cmd["delay"]) if self.debug: print("{} initialization completed".format(self.display_name)) # Enable backlight self.m5stack.lcd_brightness(100)
def init(self): self.disp_spi_init() esp.gpio_pad_select_gpio(self.dc) # Initialize non-SPI GPIOs esp.gpio_set_direction(self.dc, esp.GPIO_MODE.OUTPUT) esp.gpio_set_direction(self.rst, esp.GPIO_MODE.OUTPUT) if self.backlight != -1: esp.gpio_set_direction(self.backlight, esp.GPIO_MODE.OUTPUT) # Reset the display esp.gpio_set_level(self.rst, 0) esp.task_delay_ms(100) esp.gpio_set_level(self.rst, 1) esp.task_delay_ms(100) # Send all the commands for cmd in self.init_cmds: self.send_cmd(cmd['cmd']) self.send_data(cmd['data']) if 'delay' in cmd: esp.task_delay_ms(cmd['delay']) print("ILI9341 initialization completed") # Enable backlight if self.backlight != -1: print("Enable backlight") esp.gpio_set_level(self.backlight, 1)
def disp_spi_init(self): buscfg = esp.spi_bus_config_t({ "miso_io_num": self.miso, "mosi_io_num": self.mosi, "sclk_io_num": self.clk, "quadwp_io_num": -1, "quadhd_io_num": -1, "max_transfer_sz": 128 * 1024, }) devcfg = esp.spi_device_interface_config_t({ "clock_speed_hz": self.mhz * 1000 * 1000, # Clock out at DISP_SPI_MHZ MHz "mode": 0, # SPI mode 0 "spics_io_num": self.cs, # CS pin "queue_size": 1, "pre_cb": None, "post_cb": None, "flags": 1 << 4, # SPI_DEVICE_HALFDUPLEX "duty_cycle_pos": 128, }) esp.gpio_pad_select_gpio(self.miso) esp.gpio_pad_select_gpio(self.mosi) esp.gpio_pad_select_gpio(self.clk) esp.gpio_set_direction(self.miso, esp.GPIO_MODE.INPUT) esp.gpio_set_pull_mode(self.miso, esp.GPIO.PULLUP_ONLY) esp.gpio_set_direction(self.mosi, esp.GPIO_MODE.OUTPUT) esp.gpio_set_direction(self.clk, esp.GPIO_MODE.OUTPUT) esp.gpio_pad_select_gpio(self.cs) # Initialize the SPI bus ret = esp.spi_bus_initialize(self.spihost, buscfg, 1) if ret != 0: raise RuntimeError("Failed initializing SPI bus") # Attach the LCD to the SPI bus ptr_to_spi = esp.C_Pointer() ret = esp.spi_bus_add_device(self.spihost, devcfg, ptr_to_spi) if ret != 0: raise RuntimeError("Failed adding SPI device") self.spi = ptr_to_spi.ptr_val
async def _init(self, sleep_func): # Initialize non-SPI GPIOs esp.gpio_pad_select_gpio(self.dc) if self.rst != -1: esp.gpio_pad_select_gpio(self.rst) if self.backlight != -1: esp.gpio_pad_select_gpio(self.backlight) if self.power != -1: esp.gpio_pad_select_gpio(self.power) esp.gpio_set_direction(self.dc, esp.GPIO_MODE.OUTPUT) if self.rst != -1: esp.gpio_set_direction(self.rst, esp.GPIO_MODE.OUTPUT) if self.backlight != -1: esp.gpio_set_direction(self.backlight, esp.GPIO_MODE.OUTPUT) if self.power != -1: esp.gpio_set_direction(self.power, esp.GPIO_MODE.OUTPUT) # Power the display if self.power != -1: esp.gpio_set_level(self.power, self.power_on) await sleep_func(100) # Reset the display if self.rst != -1: esp.gpio_set_level(self.rst, 0) await sleep_func(100) esp.gpio_set_level(self.rst, 1) await sleep_func(100) # Send all the commands for cmd in self.init_cmds: self.send_cmd(cmd['cmd']) if 'data' in cmd: self.send_data(cmd['data']) if 'delay' in cmd: await sleep_func(cmd['delay']) print("{} initialization completed".format(self.display_name)) # Enable backlight if self.backlight != -1: print("Enable backlight") esp.gpio_set_level(self.backlight, self.backlight_on) # Register the driver self.disp_drv.register()
def spi_init(self): esp.gpio_pad_select_gpio(self.cs) # Initialize the SPI bus, if needed if self.miso >= 0 and self.mosi >= 0 and self.clk >= 0: esp.gpio_pad_select_gpio(self.miso) esp.gpio_pad_select_gpio(self.mosi) esp.gpio_pad_select_gpio(self.clk) esp.gpio_set_direction(self.miso, esp.GPIO_MODE.INPUT) esp.gpio_set_pull_mode(self.miso, esp.GPIO.PULLUP_ONLY) esp.gpio_set_direction(self.mosi, esp.GPIO_MODE.OUTPUT) esp.gpio_set_direction(self.clk, esp.GPIO_MODE.OUTPUT) buscfg = esp.spi_bus_config_t({ "miso_io_num": self.miso, "mosi_io_num": self.mosi, "sclk_io_num": self.clk, "quadwp_io_num": -1, "quadhd_io_num": -1, "max_transfer_sz": 128, }) ret = esp.spi_bus_initialize(self.spihost, buscfg, 1) if ret != 0: raise RuntimeError("Failed initializing SPI bus") # Register finalizer callback to deinit SPI. This gets called on soft reset. self.finalizer = lvesp32.cb_finalizer(self.deinit) # Attach the xpt2046 to the SPI bus devcfg = esp.spi_device_interface_config_t({ "clock_speed_hz": self.mhz * 1000 * 1000, "mode": 0, # SPI mode 0 "spics_io_num": self.cs, # CS pin "queue_size": 2, "duty_cycle_pos": 128, }) ptr_to_spi = esp.C_Pointer() ret = esp.spi_bus_add_device(self.spihost, devcfg, ptr_to_spi) if ret != 0: raise RuntimeError("Failed adding SPI device") self.spi = ptr_to_spi.ptr_val
async def _init(self, sleep_func): # Initialize non-SPI GPIOs esp.gpio_pad_select_gpio(self.dc) esp.gpio_set_direction(self.dc, esp.GPIO_MODE.OUTPUT) # Power the display # Reset the display self.m5stack.lcd_rst(0) await sleep_func(100) self.m5stack.lcd_rst(1) await sleep_func(100) # Send all the commands for cmd in self.init_cmds: self.send_cmd(cmd['cmd']) if 'data' in cmd: self.send_data(cmd['data']) if 'delay' in cmd: await sleep_func(cmd['delay']) print("{} initialization completed".format(self.display_name)) # Enable backlight if self.backlight != -1: print("Enable backlight") self.m5stack.lcd_backlight(self.backlight_on) self.m5stack.lcd_brightness(self.backlight) # Register the driver self.disp_drv.register()
def init(self): self.disp_spi_init() # Initialize non-SPI GPIOs esp.gpio_pad_select_gpio(self.dc) esp.gpio_pad_select_gpio(self.rst) if self.backlight != -1: esp.gpio_pad_select_gpio(self.backlight) if self.power != -1: esp.gpio_pad_select_gpio(self.power) esp.gpio_set_direction(self.dc, esp.GPIO_MODE.OUTPUT) esp.gpio_set_direction(self.rst, esp.GPIO_MODE.OUTPUT) if self.backlight != -1: esp.gpio_set_direction(self.backlight, esp.GPIO_MODE.OUTPUT) if self.power != -1: esp.gpio_set_direction(self.power, esp.GPIO_MODE.OUTPUT) # Power the display if self.power != -1: esp.gpio_set_level(self.power, self.power_on) sleep_ms(100) # Reset the display esp.gpio_set_level(self.rst, 0) sleep_ms(100) esp.gpio_set_level(self.rst, 1) sleep_ms(100) # Send all the commands for cmd in self.init_cmds: self.send_cmd(cmd['cmd']) if 'data' in cmd: self.send_data(cmd['data']) if 'delay' in cmd: sleep_ms(cmd['delay']) print("{} initialization completed".format(self.display_name)) # Enable backlight if self.backlight != -1: print("Enable backlight") esp.gpio_set_level(self.backlight, self.backlight_on)
def disp_spi_init(self): # Register finalizer callback to deinit SPI. # This would get called on soft reset. self.finalizer = lvesp32.cb_finalizer(self.deinit) lvesp32.init() buscfg = esp.spi_bus_config_t({ "miso_io_num": self.miso, "mosi_io_num": self.mosi, "sclk_io_num": self.clk, "quadwp_io_num": -1, "quadhd_io_num": -1, "max_transfer_sz": self.buf_size, }) devcfg = esp.spi_device_interface_config_t({ "clock_speed_hz": self.mhz * 1000 * 1000, # Clock out at DISP_SPI_MHZ MHz "mode": 0, # SPI mode 0 "spics_io_num": self.cs, # CS pin "queue_size": 2, #"flags": esp.SPI_DEVICE.HALFDUPLEX, "duty_cycle_pos": 128, }) if self.hybrid and hasattr(esp, 'ili9341_post_cb_isr'): devcfg.pre_cb = None devcfg.post_cb = esp.ili9341_post_cb_isr else: devcfg.pre_cb = esp.spi_pre_cb_isr devcfg.post_cb = esp.spi_post_cb_isr esp.gpio_pad_select_gpio(self.cs) # Initialize the SPI bus, if needed. if buscfg.miso_io_num >= 0 and \ buscfg.mosi_io_num >= 0 and \ buscfg.sclk_io_num >= 0: esp.gpio_pad_select_gpio(self.miso) esp.gpio_pad_select_gpio(self.mosi) esp.gpio_pad_select_gpio(self.clk) esp.gpio_set_direction(self.miso, esp.GPIO_MODE.INPUT) esp.gpio_set_pull_mode(self.miso, esp.GPIO.PULLUP_ONLY) esp.gpio_set_direction(self.mosi, esp.GPIO_MODE.OUTPUT) esp.gpio_set_direction(self.clk, esp.GPIO_MODE.OUTPUT) ret = esp.spi_bus_initialize(self.spihost, buscfg, 1) if ret != 0: raise RuntimeError("Failed initializing SPI bus") self.trans_buffer = esp.heap_caps_malloc(TRANS_BUFFER_LEN, esp.MALLOC_CAP.DMA) self.cmd_trans_data = self.trans_buffer.__dereference__(1) self.word_trans_data = self.trans_buffer.__dereference__(4) # Attach the LCD to the SPI bus ptr_to_spi = esp.C_Pointer() ret = esp.spi_bus_add_device(self.spihost, devcfg, ptr_to_spi) if ret != 0: raise RuntimeError("Failed adding SPI device") self.spi = ptr_to_spi.ptr_val self.bytes_transmitted = 0 completed_spi_transaction = esp.spi_transaction_t() cast_spi_transaction_instance = esp.spi_transaction_t.cast_instance def post_isr(arg): reported_transmitted = self.bytes_transmitted if reported_transmitted > 0: print('- Completed DMA of %d bytes (mem_free=0x%X)' % (reported_transmitted, gc.mem_free())) self.bytes_transmitted -= reported_transmitted # Called in ISR context! def flush_isr(spi_transaction_ptr): lv.disp_flush_ready(self.disp_drv) # esp.spi_device_release_bus(self.spi) esp.get_ccount(self.end_time_ptr) # cast_spi_transaction_instance(completed_spi_transaction, spi_transaction_ptr) # self.bytes_transmitted += completed_spi_transaction.length # try: # micropython.schedule(post_isr, None) # except RuntimeError: # pass self.spi_callbacks = esp.spi_transaction_set_cb(None, flush_isr)
def spi_init(self): buscfg = esp.spi_bus_config_t({ "miso_io_num": self.miso, "mosi_io_num": self.mosi, "sclk_io_num": self.clk, "quadwp_io_num": -1, "quadhd_io_num": -1, "max_transfer_sz": 4, }) devcfg = esp.spi_device_interface_config_t({ "command_bits": 9, # Actually 8, but need another cycle before xpt starts transmitting response, see Figure 12 on the datasheet. "clock_speed_hz": self.mhz * 1000 * 1000, "mode": 0, # SPI mode 0 "spics_io_num": self.cs, # CS pin "queue_size": self.max_cmds, "flags": esp.SPI_DEVICE.HALFDUPLEX, "duty_cycle_pos": 128, }) esp.gpio_pad_select_gpio(self.cs) # Initialize the SPI bus, if needed if buscfg.miso_io_num >= 0 and \ buscfg.mosi_io_num >= 0 and \ buscfg.sclk_io_num >= 0: esp.gpio_pad_select_gpio(self.miso) esp.gpio_pad_select_gpio(self.mosi) esp.gpio_pad_select_gpio(self.clk) esp.gpio_set_direction(self.miso, esp.GPIO_MODE.INPUT) esp.gpio_set_pull_mode(self.miso, esp.GPIO.PULLUP_ONLY) esp.gpio_set_direction(self.mosi, esp.GPIO_MODE.OUTPUT) esp.gpio_set_direction(self.clk, esp.GPIO_MODE.OUTPUT) ret = esp.spi_bus_initialize(self.spihost, buscfg, 1) if ret != 0: raise RuntimeError("Failed initializing SPI bus") # Register finalizer callback to deinit SPI. # This would get called on soft reset. self.finalizer = lvesp32.cb_finalizer(self.deinit) # Attach the xpt2046 to the SPI bus ptr_to_spi = esp.C_Pointer() ret = esp.spi_bus_add_device(self.spihost, devcfg, ptr_to_spi) if ret != 0: raise RuntimeError("Failed adding SPI device") self.spi = ptr_to_spi.ptr_val # Prepare transactions. Each response is 16bit long self.trans = [ esp.spi_transaction_t({ 'rx_buffer': bytearray(2), 'rxlength': 16 }) for i in range(0, self.max_cmds) ]
def disp_spi_init(self): buscfg = esp.spi_bus_config_t({ "miso_io_num": self.miso, "mosi_io_num": self.mosi, "sclk_io_num": self.clk, "quadwp_io_num": -1, "quadhd_io_num": -1, "max_transfer_sz": 128 * 1024, }) devcfg = esp.spi_device_interface_config_t({ "clock_speed_hz": self.mhz * 1000 * 1000, # Clock out at DISP_SPI_MHZ MHz "mode": 0, # SPI mode 0 "spics_io_num": self.cs, # CS pin "queue_size": 2, "pre_cb": esp.spi_pre_cb_isr, "post_cb": esp.spi_post_cb_isr, "flags": 1 << 4, # SPI_DEVICE_HALFDUPLEX "duty_cycle_pos": 128, }) esp.gpio_pad_select_gpio(self.miso) esp.gpio_pad_select_gpio(self.mosi) esp.gpio_pad_select_gpio(self.clk) esp.gpio_set_direction(self.miso, esp.GPIO_MODE.INPUT) esp.gpio_set_pull_mode(self.miso, esp.GPIO.PULLUP_ONLY) esp.gpio_set_direction(self.mosi, esp.GPIO_MODE.OUTPUT) esp.gpio_set_direction(self.clk, esp.GPIO_MODE.OUTPUT) esp.gpio_pad_select_gpio(self.cs) # Initialize the SPI bus ret = esp.spi_bus_initialize(self.spihost, buscfg, 1) if ret != 0: raise RuntimeError("Failed initializing SPI bus") # Attach the LCD to the SPI bus ptr_to_spi = esp.C_Pointer() ret = esp.spi_bus_add_device(self.spihost, devcfg, ptr_to_spi) if ret != 0: raise RuntimeError("Failed adding SPI device") self.spi = ptr_to_spi.ptr_val self.bytes_transmitted = 0 completed_spi_transaction = esp.spi_transaction_t() cast_spi_transaction_instance = esp.spi_transaction_t.cast_instance def post_isr(arg): reported_transmitted = self.bytes_transmitted if reported_transmitted > 0: print('- Completed DMA of %d bytes (mem_free=0x%X)' % (reported_transmitted, gc.mem_free())) self.bytes_transmitted -= reported_transmitted # Called in ISR context! def flush_isr(spi_transaction_ptr): lv.disp_flush_ready(self.disp_drv) # cast_spi_transaction_instance(completed_spi_transaction, spi_transaction_ptr) # self.bytes_transmitted += completed_spi_transaction.length # try: # micropython.schedule(post_isr, None) # except RuntimeError: # pass self.spi_callbacks = esp.spi_transaction_set_cb(None, flush_isr)