0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Milkv?入坑(3)點亮ILI9488 SPI屏

worldy_2020 ? 來源: worldy_2020 ? 作者: worldy_2020 ? 2024-01-24 14:46 ? 次閱讀

1、概述

tinydrm驅(qū)動里合并了panel-mipi-dbi模塊。從名字上來看,這個模塊是用來驅(qū)動MIPI-DBI屏幕用的。TinyDRM對比fbtft有以下優(yōu)點:

DRM在用戶要求刷新屏幕的時候才刷新,而fbtft刷新屏幕是按照固定的幀率進行刷新。

fbtft只能一次刷新整個屏幕,而DRM沒有這樣的限制。

fbtft在探測(probe)到屏幕后打開它,DRM在使用屏幕的時候才會打開它。

fbtft的rotate值變成了rotation

DRM支持雙緩沖和page-flips(應(yīng)該是一種可以避免圖像撕裂現(xiàn)象(tearing effect)的算法)。

DRM支持在GPU中渲染,然后在屏幕上顯示。

當(dāng)然TinyDRM的缺點也是有的:只能使用兼容標(biāo)準(zhǔn)MIPI-DCS命令集的顯示IC,非標(biāo)準(zhǔn)命令集的無法使用。這里提供一個簡單的辦法確定屏幕是否兼容MIPI-DCS指令集:查看屏幕的0x2A,0x2B,0x2C命令對應(yīng)的操作,如果它們的操作分別是行地址設(shè)置(Column address set),列地址設(shè)置(Row address set)和顯存寫入(Memory write),則表示該屏幕應(yīng)該兼容MIPI-DCS指令集;

本文的知識點主要來源以下連接,本人只是做了簡單的整合和匯總,以方便于需要的朋友:

Milk-V Duo tinydrm驅(qū)動屏幕(ili9488/st7789) - Duo - MilkV Community

Milk-V Duo SPI驅(qū)動點亮屏幕(st7789) - Duo - MilkV Community,,

2、硬件連接:

使用SPI2及3個IO連接到SPI屏,如圖所示,紅色方框的圈出的管腳連接到SPI屏對應(yīng)的管腳,紅色字體指的是SPI的管腳;

wKgZomWvglWAD8AHAAMbAXkQLPc806.png

3、修改SDK

1)、下載最新版本的SDK,舊版本的SDK可能需要自己去配置管腳

git clone https://github.com/milkv-duo/duo-buildroot-sdk.git --depth=1

2)、添加ILI9488的驅(qū)動代碼:

在目錄XXX_SDK/linux_5.10/drivers/gpu/drm/tiny/下創(chuàng)建ili9488.c

// SPDX-License-Identifier: GPL-2.0
/*
 * DRM driver for Ilitek ILI9488 panels
 *
 * Copyright 2020 Kamlesh Gurudasani 
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define ILI9488_VCOM_CONTROL_1 0xC5
#define ILI9488_COLUMN_ADDRESS_SET 0x2A
#define ILI9488_PAGE_ADDRESS_SET 0x2B
#define ILI9488_MEMORY_WRITE 0x2C
#define ILI9488_POSITIVE_GAMMA_CORRECTION0xE0
#define ILI9488_NEGATIVE_GAMMA_CORRECTION0xE1
#define ILI9488_POWER_CONTROL_1 0xC0
#define ILI9488_POWER_CONTROL_2 0xC1

#define ILI9488_MEMORY_ACCESS_CONTROL 0x36
#define ILI9488_COLMOD_PIXEL_FORMAT_SET 0x3A
#define ILI9488_INTERFACE_MODE_CONTROL 0xB0
#define ILI9488_FRAME_RATE_CONTROL_PARTIAL 0xB3
#define ILI9488_DISPLAY_INVERSION_CONTROL0xB4
#define ILI9488_SET_IMAGE_FUNCTION 0xE9
#define ILI9488_ADJUST_CONTROL_3 0xF7
#define ILI9488_ADJUST_CONTROL_3 0xF7
#define ILI9488_DISPLAY_ON 0x29
#define ILI9488_DISPLAY_OFF 0x28
#define ILI9488_ENTER_SLEEP_MODE 0x10
#define ILI9488_DBI_BPP18 0x06
#define ILI9488_DPI_BPP18 0x60
#define ILI9488_FRAME_RATE_CONTROL_NORMAL0xB1
#define ILI9488_SLEEP_OUT 0x11

#define ILI9488_MADCTL_BGRBIT(3)
#define ILI9488_MADCTL_MVBIT(5)
#define ILI9488_MADCTL_MXBIT(6)
#define ILI9488_MADCTL_MYBIT(7)

static void ili9488_rgb565_to_rgb666_line(u8 *dst, u16 *sbuf,unsignedint pixels)
{
  unsignedint x;

  for (x = 0; x < pixels; x++) {
 ????? *dst++ = ((*sbuf & 0xF800) >> 8);
  *dst++ = ((*sbuf & 0x07E0) >> 3);
  *dst++ = ((*sbuf & 0x001F) x2 - rect->x1;
  size_t src_len = linepixels * sizeof(u16);
  size_t dst_len = linepixels * 3;
  unsignedint y, lines = rect->y2 - rect->y1;
  u16 *sbuf;

  /*
  * The cma memory is write-combined so reads are uncached.
  * Speed up by fetching one line at a time.
  */
  sbuf = kmalloc(src_len, GFP_KERNEL);
  if (!sbuf)
  return;

  vaddr += rect->y1 * fb->pitches[0] + rect->x1 * sizeof(u16);
  for (y = 0; y < lines; y++) {
 ????? memcpy(sbuf, vaddr, src_len);
 ????? ili9488_rgb565_to_rgb666_line(dst, sbuf, linepixels);
 ????? vaddr += fb-?>pitches[0];
  dst += dst_len;
  }
  kfree(sbuf);
}

static int ili9488_buf_copy(void *dst, struct drm_framebuffer *fb,struct drm_rect *rect)
{
  struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
  struct dma_buf_attachment *import_attach = cma_obj->base.import_attach;
  struct drm_format_name_buf format_name;
  void *src = cma_obj->vaddr;
  int ret = 0;

  if (import_attach) {
  ret = dma_buf_begin_cpu_access(import_attach->dmabuf,
        DMA_FROM_DEVICE);
  if (ret)
  return ret;
  }

  switch (fb->format->format) {
  case DRM_FORMAT_RGB565:
  ili9488_rgb565_to_rgb666(dst, src, fb, rect);
  break;
  default:
  dev_err_once(fb->dev->dev, "Format is not supported: %sn",
     drm_get_format_name(fb->format->format,
  &format_name));
  return -EINVAL;
  }

  if (import_attach)
  ret = dma_buf_end_cpu_access(import_attach->dmabuf,
      DMA_FROM_DEVICE);
  return ret;
}

static void ili9488_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
{
  struct drm_gem_cma_object *cma_obj = drm_fb_cma_get_gem_obj(fb, 0);
  struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(fb->dev);
  struct mipi_dbi *dbi = &dbidev->dbi;
  int idx, ret = 0;
  void *tr;
  bool full;
  unsignedint height = rect->y2 - rect->y1;
  unsignedint width = rect->x2 - rect->x1;

  // if (!dbidev->enabled)
  //  return;

  if (!drm_dev_enter(fb->dev, &idx))
  return;

  full = width == fb->width && height == fb->height;

  DRM_DEBUG_KMS("Flushing [FB:%d] " DRM_RECT_FMT "n", fb->base.id,
       DRM_RECT_ARG(rect));

  /* Always invoke copy buffer routine as the display supports
  * only RGB666 format which is not implemented in DRM
  */
  if (!dbi->dc || !full ||
     fb->format->format == DRM_FORMAT_RGB565) {
  tr = dbidev->tx_buf;
  ret = ili9488_buf_copy(dbidev->tx_buf, fb, rect);
  if (ret)
  goto err_msg;
  } else {
  tr = cma_obj->vaddr;
  }

  mipi_dbi_command(dbi, ILI9488_COLUMN_ADDRESS_SET,
  (rect->x1 >> 8) & 0xFF, rect->x1 & 0xFF,
  (rect->x2 >> 8) & 0xFF, (rect->x2 - 1) & 0xFF);

  mipi_dbi_command(dbi, ILI9488_PAGE_ADDRESS_SET,
  (rect->y1 >> 8) & 0xFF, rect->y1 & 0xFF,
  (rect->y2 >> 8) & 0xFF, (rect->y2 - 1) & 0xFF);

  ret = mipi_dbi_command_buf(dbi, ILI9488_MEMORY_WRITE, tr,
    width * height * 3);

 err_msg:
  if (ret)
  dev_err_once(fb->dev->dev, "Failed to update display %dn", ret);

  drm_dev_exit(idx);
}

static void ili9488_pipe_update(struct drm_simple_display_pipe *pipe,struct drm_plane_state *old_state)
{
  struct drm_plane_state *state = pipe->plane.state;
  struct drm_rect rect;

  if (drm_atomic_helper_damage_merged(old_state, state, &rect))
  ili9488_fb_dirty(state->fb, &rect);
}

static void ili9488_pipe_enable(struct drm_simple_display_pipe *pipe,struct drm_crtc_state *crtc_state,struct drm_plane_state *plane_state)
{
  struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(pipe->crtc.dev);
  struct drm_framebuffer *fb = plane_state->fb;
  struct mipi_dbi *dbi = &dbidev->dbi;
  u8 addr_mode;
  int ret, idx;
  struct drm_rect rect = {
  .x1 = 0,
  .x2 = fb->width,
  .y1 = 0,
  .y2 = fb->height,
  };

  if (!drm_dev_enter(pipe->crtc.dev, &idx))
  return;

  DRM_DEBUG_KMS("n");

  ret = mipi_dbi_poweron_conditional_reset(dbidev);
  if (ret < 0)
 ????? goto out_exit;
 ?? if (ret == 1)
 ????? goto out_enable;

 ?? mipi_dbi_command(dbi, ILI9488_POSITIVE_GAMMA_CORRECTION,
 ????????? ?0x00, 0x03, 0x09, 0x08, 0x16,
 ????????? ?0x0a, 0x3f, 0x78, 0x4c, 0x09,
 ????????? ?0x0a, 0x08, 0x16, 0x1a, 0x0f);

 ?? mipi_dbi_command(dbi, ILI9488_NEGATIVE_GAMMA_CORRECTION,
 ????????? ?0x00, 0x16, 0x19, 0x03, 0x0f,
 ????????? ?0x05, 0x32, 0x45, 0x46, 0x04,
 ????????? ?0x0e, 0x0d, 0x35, 0x37, 0x0f);

 ?? mipi_dbi_command(dbi, ILI9488_POWER_CONTROL_1, 0x17, 0x15);

 ?? mipi_dbi_command(dbi, ILI9488_POWER_CONTROL_2, 0x41);

 ?? mipi_dbi_command(dbi, ILI9488_VCOM_CONTROL_1, 0x00, 0x12, 0x80);

 ?? mipi_dbi_command(dbi, ILI9488_COLMOD_PIXEL_FORMAT_SET,
 ????????? ?ILI9488_DBI_BPP18 | ILI9488_DPI_BPP18);

 ?? mipi_dbi_command(dbi, ILI9488_INTERFACE_MODE_CONTROL, 0x80);

 ?? mipi_dbi_command(dbi, ILI9488_FRAME_RATE_CONTROL_NORMAL, 0xa0);

 ?? mipi_dbi_command(dbi, ILI9488_DISPLAY_INVERSION_CONTROL, 0x02);

 ?? mipi_dbi_command(dbi, ILI9488_SET_IMAGE_FUNCTION, 0x00);

 ?? mipi_dbi_command(dbi, ILI9488_ADJUST_CONTROL_3,0xa9, 0x51, 0x2c, 0x82);

 ?? mipi_dbi_command(dbi, ILI9488_SLEEP_OUT);

 ?? msleep(120);

 ?? mipi_dbi_command(dbi, ILI9488_DISPLAY_ON);

 ?? // dbidev-?>enabled = true;
  ili9488_fb_dirty(fb, &rect);

 out_enable:
  switch (dbidev->rotation) {
  default:
  addr_mode = ILI9488_MADCTL_MX;
  break;
  case 90:
  addr_mode = ILI9488_MADCTL_MV;
  break;
  case 180:
  addr_mode = ILI9488_MADCTL_MY;
  break;
  case 270:
  addr_mode = ILI9488_MADCTL_MV | ILI9488_MADCTL_MY |
  ILI9488_MADCTL_MX;
  break;
  }
  addr_mode |= ILI9488_MADCTL_BGR;
  mipi_dbi_command(dbi, MIPI_DCS_SET_ADDRESS_MODE, addr_mode);
 out_exit:
  drm_dev_exit(idx);
}

static void ili9488_pipe_disable(struct drm_simple_display_pipe *pipe)
{
  struct mipi_dbi_dev *dbidev = drm_to_mipi_dbi_dev(pipe->crtc.dev);

  /*
  * This callback is not protected by drm_dev_enter/exit since we want to
  * turn off the display on regular driver unload. It's highly unlikely
  * that the underlying SPI controller is gone should this be called
  * after unplug.
  */

  DRM_DEBUG_KMS("n");

  // if (!dbidev->enabled)
  //  return;

  mipi_dbi_command(&dbidev->dbi, MIPI_DCS_SET_DISPLAY_OFF);
  // dbidev->enabled = false;
}

static const u32 ili9488_formats[] = {
  DRM_FORMAT_RGB565,
};

static const struct drm_simple_display_pipe_funcs ili9488_pipe_funcs = {
  .enable = ili9488_pipe_enable,
  .disable = ili9488_pipe_disable,
  .update = ili9488_pipe_update,
  .prepare_fb = drm_gem_fb_simple_display_pipe_prepare_fb,
};

static const struct drm_display_mode ili9488_mode = {
  DRM_SIMPLE_MODE(320, 480, 49, 73),
};

DEFINE_DRM_GEM_CMA_FOPS(ili9488_fops);

static struct drm_driver ili9488_driver = {
  .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
  .fops = &ili9488_fops,
  DRM_GEM_CMA_DRIVER_OPS_VMAP,
  .debugfs_init = mipi_dbi_debugfs_init,
  .name = "ili9488",
  .desc = "Ilitek ILI9488",
  .date = "20200607",
  .major = 1,
  .minor = 0,
};

static const struct of_device_id ili9488_of_match[] = {
  { .compatible = "eastrising,er-tft035-6" },
  { }
};
MODULE_DEVICE_TABLE(of, ili9488_of_match);

static const struct spi_device_id ili9488_id[] = {
  { "er-tft035-6", 0 },
  { }
};
MODULE_DEVICE_TABLE(spi, ili9488_id);

static int ili9488_probe(struct spi_device *spi)
{
  struct device *dev = &spi->dev;
  struct mipi_dbi_dev *dbidev;
  struct drm_device *drm;
  struct mipi_dbi *dbi;
  struct gpio_desc *dc;
  u32 rotation = 0;
  size_t bufsize;
  int ret;

  dbidev = devm_drm_dev_alloc(dev, &ili9488_driver,
     struct mipi_dbi_dev, drm);
  if (IS_ERR(dbidev))
  return PTR_ERR(dbidev);

  dbi = &dbidev->dbi;
  drm = &dbidev->drm;

  // ret = devm_drm_dev_init(dev, drm, &ili9488_driver);
  // if (ret) {
  //  kfree(dbidev);
  //  return ret;
  // }

  drm_mode_config_init(drm);

  bufsize = ili9488_mode.vdisplay * ili9488_mode.hdisplay * 3;

  dbi->reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
  if (IS_ERR(dbi->reset)) {
  DRM_DEV_ERROR(dev, "Failed to get gpio 'reset'n");
  return PTR_ERR(dbi->reset);
  }

  dc = devm_gpiod_get(dev, "dc", GPIOD_OUT_LOW);
  if (IS_ERR(dc)) {
  DRM_DEV_ERROR(dev, "Failed to get gpio 'dc'n");
  return PTR_ERR(dc);
  }

  dbidev->backlight = devm_of_find_backlight(dev);
  if (IS_ERR(dbidev->backlight))
  return PTR_ERR(dbidev->backlight);

  device_property_read_u32(dev, "rotation", &rotation);

  ret = mipi_dbi_spi_init(spi, dbi, dc);
  if (ret)
  return ret;

  dbidev->drm.mode_config.preferred_depth = 16;

  ret = mipi_dbi_dev_init_with_formats(dbidev, &ili9488_pipe_funcs,
      ili9488_formats,
      ARRAY_SIZE(ili9488_formats),
      &ili9488_mode, rotation, bufsize);
  if (ret)
  return ret;

  drm_mode_config_reset(drm);

  ret = drm_dev_register(drm, 0);
  if (ret)
  return ret;

  spi_set_drvdata(spi, drm);

  drm_fbdev_generic_setup(drm, 0);

  return 0;
}

static int ili9488_remove(struct spi_device *spi)
{
  struct drm_device *drm = spi_get_drvdata(spi);

  drm_dev_unplug(drm);
  drm_atomic_helper_shutdown(drm);

  return 0;
}

static void ili9488_shutdown(struct spi_device *spi)
{
  drm_atomic_helper_shutdown(spi_get_drvdata(spi));
}

static struct spi_driver ili9488_spi_driver = {
  .driver = {
  .name = "ili9488",
  .owner = THIS_MODULE,
  .of_match_table = ili9488_of_match,
  },
  .id_table = ili9488_id,
  .probe = ili9488_probe,
  .remove = ili9488_remove,
  .shutdown = ili9488_shutdown,
};
module_spi_driver(ili9488_spi_driver);

MODULE_DESCRIPTION("Ilitek ILI9488 DRM driver");
MODULE_AUTHOR("Kamlesh Gurudasani ");
MODULE_LICENSE("GPL");

3)、修改/linux_5.10/drivers/gpu/drm/tiny/Kconfig文件: 在Kconfig底部添加

config TINYDRM_ILI9488

  tristate "DRM support for ILI9488 display panels"
  depends on DRM && SPI
  select DRM_KMS_HELPER
  select DRM_KMS_CMA_HELPER
  select DRM_MIPI_DBI
  select BACKLIGHT_CLASS_DEVICE
  help
  DRM driver for the following Ilitek ILI9488 panel
   If M is selected the module will be called ili9488

4)、修改/linux_5.10/drivers/gpu/drm/tiny/Makefile文件,底部添加

obj-$(CONFIG_TINYDRM_ILI9488) += ili9488.o

5)、修改/build/boards/cv180x/cv1800b_milkv_duo_sd/linux/cvitek_cv1800b_milkv_duo_sd_defconfig文件: 底部添加下述內(nèi)容,注意上層文件夾也有一個同名的文件,別修改錯了文件;

CONFIG_TTY=y
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_FB_CMDLINE=y
CONFIG_FB_NOTIFY=y
CONFIG_FONT_SUPPORT=y
CONFIG_FONTS=y
CONFIG_FONT_8x16=y
CONFIG_VGA_CONSOLE=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_DUMMY_CONSOLE_COLUMNS=80
CONFIG_DUMMY_CONSOLE_ROWS=25
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y

CONFIG_DRM=y
CONFIG_DRM_MIPI_DBI=yCONFIG_DRM_KMS_HELPER=y
CONFIG_DRM_KMS_FB_HELPER=y
CONFIG_DRM_FBDEV_EMULATION=y
CONFIG_DRM_FBDEV_OVERALLOC=100
CONFIG_DRM_GEM_CMA_HELPER=y
CONFIG_DRM_KMS_CMA_HELPER=y
CONFIG_DRM_PANEL=y
CONFIG_DRM_BRIDGE=y
CONFIG_DRM_PANEL_BRIDGE=y
CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y
CONFIG_TINYDRM_ILI9488=y

6)、 修改/build/boards/cv180x/cv1800b_milkv_duo_sd/dts_riscv/cv1800b_milkv_duo_sd.dts文件,注意,修改&SPI2部分即可

/dts-v1/;
#include "cv180x_base_riscv.dtsi"
#include "cv180x_asic_qfn.dtsi"
#include "cv180x_asic_sd.dtsi"
#include "cv180x_default_memmap.dtsi"

&mipi_rx{
  snsr-reset = , , ;
};

&spi2 {
  status = "okay";
  /delete-node/ spidev@0;
  display@0{
  compatible = "eastrising,er-tft035-6"; //匹配驅(qū)動名稱,使用st7789的話修改為sitronix,st7789v_240x320
      
  reg = ;
  status = "okay";
  spi-max-frequency = ;
  spi-cpol;
  spi-cpha;
  dc-gpios = ;  //GPIOA_24做DC腳
  reset-gpios = ; //GPIOA_23做Reset腳
  rotation = ;
  };
};

&uart4 {
  status = "okay";
};

&i2c1 {
       status = "okay";
       clock-frequency = ;
};

/ {

};

7) 、修改build/boards/default/dts/cv180x/cv180x_base.dtsi

spi2:spi2@041A0000 {

compatible = "snps,dw-apb-ssi";

reg = <0x0 0x041A0000 0x0 0x10000>;

clocks = <&clk CV180X_CLK_SPI>;

#address-cells = <1>;

#size-cells = <0>;

bias-pull-up; //添加本行,作用是端口上拉

};

8) 、修改 u-boot-2021.10includeconfigscv180x-asic.h

搜到

#defineSET_BOOTARGS "setenv bootargs ${root} ${mtdparts} " “console=$consoledev,$baudrate $othbootargs;”


將其替換為為:

#defineSET_BOOTARGS "setenv bootargs ${root} ${mtdparts} " “console=tty0 console=$consoledev,$baudrate $othbootargs;”

注意標(biāo)點符號必須為英文類型,否則會發(fā)生編譯錯誤;

編譯SDK:

cd duo-buildroot-sdk/
./build.sh

4、下載,上電:

如果屏幕沒有輸出請使用cvi_pinmux工具檢查管腳配置是否正確,如果管腳不正確,請自行配置管腳,如果順利,就會串口輸出的內(nèi)容同時在屏幕上顯示;

wKgaomWvglWAM39dAAUZfTKdLVc623.png




審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • DCS
    DCS
    +關(guān)注

    關(guān)注

    20

    文章

    591

    瀏覽量

    49804
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1669

    瀏覽量

    90740
  • DRM
    DRM
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    15082
  • MIPI
    +關(guān)注

    關(guān)注

    10

    文章

    303

    瀏覽量

    48383
  • ILI9488
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    7395
收藏 人收藏

    評論

    相關(guān)推薦

    STM32H5開發(fā)(6)----SPI驅(qū)動TFT-LCD

    在嵌入式領(lǐng)域,TFT-LCD是最常用的顯示解決方案之一,因為它們提供了豐富的顏色和高分辨率的圖像顯示能力。STM32H5作為ST的高性能微控制器系列,具備了強大的處理能力和多種通信接口,非常適合于驅(qū)動TFT-LCD顯示,該液晶
    的頭像 發(fā)表于 12-01 16:45 ?2250次閱讀
    STM32H5開發(fā)(6)----<b class='flag-5'>SPI</b>驅(qū)動TFT-LCD<b class='flag-5'>屏</b>

    瑞薩e2studio----SPI驅(qū)動TFT-LCD

    在嵌入式領(lǐng)域,TFT-LCD是最常用的顯示解決方案之一,因為它們提供了豐富的顏色和高分辨率的圖像顯示能力。RA4M2作為瑞薩的微控制器系列,具備了強大的處理能力和多種通信接口,非常適合于驅(qū)動TFT-LCD顯示,該液晶st7
    的頭像 發(fā)表于 08-07 17:46 ?1106次閱讀
    瑞薩e2studio----<b class='flag-5'>SPI</b>驅(qū)動TFT-LCD<b class='flag-5'>屏</b>

    ILI9488液晶顯示用戶手冊

    ILI9488液晶顯示用戶手冊,相信這個手冊不是太容易找到的。
    發(fā)表于 07-06 20:10

    ILI9488 IC驅(qū)動顯示用戶手冊,這個手冊不是太容易找到的。

    [tr=transparent]ILI9488液晶顯示用戶手冊,找這個手冊不是太容易找到的。[/tr]
    發(fā)表于 03-16 09:56

    【原創(chuàng)開源應(yīng)用第4期】給ili9488,RA8875等類顯示的emWin底層增加DMA加速,提供RTX,uCOS和FreeRTOS版本

    說明:1、emWin底層中最重要的一個優(yōu)化就是16bpp繪制,特此為其增加DMA加速,已經(jīng)支持RA8875和ili9488。2、使用中務(wù)必將emWin任務(wù)設(shè)置為除了空閑任務(wù),統(tǒng)計任務(wù)以外的最低優(yōu)先級
    發(fā)表于 07-07 15:55

    Harmony LCD ILI9844 錯誤

    /lcd_t1/firmware/src/system_config/default/framework/gfx/driver/controller/ili9488/drv_gfx_ili9488.c:139
    發(fā)表于 11-06 14:43

    請問ili9488屏幕的光標(biāo)能關(guān)閉顯示嗎

    新手一枚,求助,ili9488的屏幕, 能寫字能畫畫,就是下面的光標(biāo)一直顯示, 想請問大神tft屏幕的光標(biāo)能關(guān)閉顯示嗎,怎么關(guān)閉顯示, 還有我用的是spi的方式傳輸數(shù)據(jù)的,選擇的是RGB模式,照理說0xffff顯示的是黑色,0x0000顯示的是白色,但是我顯示出來的正好反
    發(fā)表于 11-13 08:50

    ili9341透明圖片顯示顏色不正的解決辦法有哪些?

    ili9341 透明圖片顯示顏色不正,只換ili9488和驅(qū)動,其他函數(shù)不變,就能正常顯示。調(diào)了好幾天了也沒找到驅(qū)動哪里的問題,求大神解答
    發(fā)表于 04-22 22:04

    ILI9341_SPI的使用教程

    ILI9341_SPI的使用教程目錄引言接線STM32CubMX配置ILI9341_SPI庫函數(shù)移植在工程中添加ILI9341_SPI庫顯示字符串例程效果演示:進階操作顯示中文字符打
    發(fā)表于 08-24 07:39

    【野火啟明6M5開發(fā)板體驗】移植ILI9488液晶驅(qū)動及LVGL

    1.移植ILI9488驅(qū)動,是有io模擬spi進行驅(qū)動液晶,因為之前已經(jīng)在其他板卡上運行過液晶程序,已驗證可以試用,在瑞薩的板卡上只需要再次配置相應(yīng)的管腳模式就可以。驅(qū)動液晶主要使用的是PMOD1
    發(fā)表于 01-02 22:32

    ili9488 rgb接口初始化問題

    9488的rgb接口使用前需要通過4線spi進行寄存器初始化,供應(yīng)商表示,在spi初始化完成后,不進行送顯的情況下,屏幕會顯示為滿屏雪花狀態(tài)。我根據(jù)供應(yīng)商給我的spi初始化驅(qū)動,通過G
    發(fā)表于 01-08 18:24

    如果TFT LCD已經(jīng)集成顯示控制器,使用LTDC的好處是什么?

    您好,我正在尋找將 TFT LCD 添加到項目中,我一直在尋找 iltek 控制顯示器作為解決方案,特別是 ili9488。集成了ili9486、ili9341、ili9488等各種驅(qū)
    發(fā)表于 01-12 06:39

    【Milk-V Duo 開發(fā)板免費體驗】Milkv (1). 從0出發(fā)

    本帖最后由 worldy_2020 于 2023-8-12 21:28 編輯 概要本文介紹如何以最簡單的方式點亮milkv,手把手教你在Windows環(huán)境下(無需linux)
    發(fā)表于 08-12 18:04

    ILI9488 TFT LCD單片驅(qū)動器芯片的數(shù)據(jù)手冊免費下載

    (用于320(RGB)x 480點的圖形數(shù)據(jù))和電源電路組成。ILI9488支持并行DBI類型B 8-/9-/16-/18-/24位數(shù)據(jù)總線接口和DBI類型C 3-/4線串行外圍接口(SPI)來輸入命令。
    發(fā)表于 01-12 08:00 ?267次下載
    <b class='flag-5'>ILI9488</b> TFT LCD單片驅(qū)動器芯片的數(shù)據(jù)手冊免費下載

    如何利用ESP32和ILI9488制作一個智能手表

    大家好,這個項目將為大家介紹我制作的一個巨大的智能手表,我用 ESP32 和 ILI9488 Raspberry pi 顯示器制作了它。雖然它確實很大,但戴起來很有趣。
    的頭像 發(fā)表于 07-01 16:55 ?8651次閱讀
    如何利用ESP32和<b class='flag-5'>ILI9488</b>制作一個智能手表