airlcd.lua 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. -- airlcd.lua
  2. --[[
  3. LCD显示屏驱动模块
  4. 核心功能:
  5. 1. 支持多种型号LCD的初始化配置
  6. 2. 提供统一的LCD初始化接口
  7. 3. 特殊型号特殊处理的初始化流程
  8. 支持的LCD型号:
  9. - AirLCD_1000: 320x480, ST7796控制器
  10. - AirLCD_1001: 320x480, ST7796控制器
  11. - AirLCD_1002: 480x480, R395435T01控制器
  12. - co5300: 480x466, 自定义初始化流程
  13. 对外接口:
  14. 1. lcd_init(sn): 初始化指定型号的LCD
  15. - sn: LCD型号字符串
  16. 注意:SPI引脚、供电引脚、RST引脚都需要与实际接线端口进行匹配
  17. ]]
  18. local airLCD = {}
  19. -- 必须在task里用,自发光屏幕不需要背光控制
  20. function co5300_init(lcd_cfg)
  21. lcd.qspi(0x02, 0x32, 0x12)
  22. lcd.init("user", lcd_cfg)
  23. gpio.set(lcd_cfg.pin_rst, 0)
  24. sys.wait(300)
  25. gpio.set(lcd_cfg.pin_rst, 1)
  26. sys.wait(200)
  27. lcd.cmd(0xfe, 0x00)
  28. lcd.cmd(0xc4, 0x80)
  29. lcd.cmd(0x3a, 0x55)
  30. lcd.cmd(0x35, 0x00)
  31. lcd.cmd(0x53, 0x20)
  32. lcd.cmd(0x51, 0x7a)
  33. lcd.cmd(0x63, 0xaa)
  34. lcd.cmd(0x36, 0x00) --方向
  35. lcd.wakeup()
  36. sys.wait(200)
  37. lcd.cmd(0x29)
  38. end
  39. function airLCD.lcd_init(sn)
  40. local width, height, lcd_ic
  41. if sn == "AirLCD_1000" then
  42. width = 320
  43. height = 480
  44. lcd_ic = "st7796"
  45. elseif sn == "AirLCD_1001" then
  46. width = 480 --横屏尺寸
  47. height = 320
  48. lcd_ic = "st7796"
  49. elseif sn == "AirLCD_1002" then
  50. width = 480
  51. height = 480
  52. lcd_ic = "R395435T01"
  53. elseif sn == "co5300" then -- 新增co5300支持
  54. width = 480
  55. height = 466
  56. lcd_ic = "user"
  57. else
  58. log.info("lcd", "没有找到合适的LCD")
  59. return
  60. end
  61. -- 公共初始化参数
  62. local lcd_param = {
  63. port = lcd.HWID_0, -- 使用的spi id 号
  64. --pin_dc = -1, -- QSPI模式不需要DC引脚
  65. --pin_rst = 36, -- 复位引脚
  66. pin_dc = 0xff, -- 命令选择硬件,不设置
  67. pin_rst = 36, -- 屏幕reset 管脚
  68. direction = 270, -- 屏幕方向,横屏
  69. w = width, -- 屏幕宽度
  70. h = height, -- 屏幕高度
  71. xoffset = 0, -- X轴偏移像素
  72. yoffset = 0, -- Y轴偏移像素
  73. sleepcmd = 0x10, -- LCD睡眠命令
  74. wakecmd = 0x11, -- LCD唤醒命令
  75. }
  76. -- 如果是co5300添加QSPI专用参数
  77. if sn == "co5300" then
  78. lcd_param.interface_mode = lcd.QSPI_MODE
  79. lcd_param.bus_speed = 60000000 -- 60MHz
  80. lcd_param.rb_swap = true
  81. lcd_param.pin_pwr = -1 -- 自发光屏不需要背光控制
  82. lcd_param.pin_dc = -1
  83. lcd_param.pin_rst = 36 --Air780EGH核心板是36,Air8000核心板是2
  84. gpio.setup(17, 0, gpio.PULLUP)-- CO5300电源
  85. sys.wait(100)
  86. gpio.setup(17, 1, gpio.PULLUP)
  87. sys.wait(1000)
  88. elseif sn == "AirLCD_1001" then
  89. lcd_param.pin_dc = 0xff
  90. lcd_param.pin_rst = 2
  91. gpio.setup(164, 1, gpio.PULLUP)
  92. gpio.setup(141, 1, gpio.PULLUP)
  93. sys.wait(1000)
  94. lcd.init(lcd_ic, lcd_param)
  95. end
  96. -- 特殊初始化流程
  97. if sn == "co5300" then
  98. co5300_init(lcd_param)
  99. else
  100. lcd.init(lcd_ic, lcd_param)
  101. end
  102. -- 公用设置
  103. lcd.setupBuff(nil, true)
  104. lcd.autoFlush(false)
  105. lcd.user_done()
  106. lcd.clear()
  107. lcd.flush()
  108. end
  109. return airLCD