-- airlcd.lua
--[[
LCD显示屏驱动模块
核心功能：
1. 支持多种型号LCD的初始化配置
2. 提供统一的LCD初始化接口
3. 特殊型号特殊处理的初始化流程

支持的LCD型号：
- AirLCD_1000: 320x480, ST7796控制器
- AirLCD_1001: 320x480, ST7796控制器
- AirLCD_1002: 480x480, R395435T01控制器
- co5300: 480x466, 自定义初始化流程

对外接口：
1. lcd_init(sn): 初始化指定型号的LCD
   - sn: LCD型号字符串

注意：SPI引脚、供电引脚、RST引脚都需要与实际接线端口进行匹配
]]

local airLCD = {}

-- 必须在task里用,自发光屏幕不需要背光控制
function co5300_init(lcd_cfg)
    lcd.qspi(0x02, 0x32, 0x12)
    lcd.init("user", lcd_cfg)
    gpio.set(lcd_cfg.pin_rst, 0)
    sys.wait(300)
    gpio.set(lcd_cfg.pin_rst, 1)
    sys.wait(200)
    lcd.cmd(0xfe, 0x00)
    lcd.cmd(0xc4, 0x80)
    lcd.cmd(0x3a, 0x55)
    lcd.cmd(0x35, 0x00)
    lcd.cmd(0x53, 0x20)
    lcd.cmd(0x51, 0x7a)
    lcd.cmd(0x63, 0xaa)
    lcd.cmd(0x36, 0x00) --方向
    lcd.wakeup()
    sys.wait(200)
    lcd.cmd(0x29)
end

function airLCD.lcd_init(sn)
    local width, height, lcd_ic

    if sn == "AirLCD_1000" then
        width = 320
        height = 480
        lcd_ic = "st7796"
    elseif sn == "AirLCD_1001" then
        width = 480
        height = 320
        lcd_ic = "st7796"
    elseif  sn == "AirLCD_1002" then
        width = 480
        height = 480
        lcd_ic = "R395435T01"
    elseif sn == "co5300" then
        width = 480
        height = 466
        lcd_ic = "user"
    else
        log.info("lcd", "没有找到合适的LCD")
        return
    end

    -- 公共初始化参数
    local lcd_param = {
        port = lcd.HWID_0,        -- 使用的spi id 号
        --pin_dc = -1,            -- QSPI模式不需要DC引脚
        --pin_rst = 36,           -- 复位引脚
        pin_dc = 0xff,            -- 命令选择硬件，不设置
        pin_rst = 36,             -- 屏幕reset 管脚，Air780EHM核心板是36，Air8000核心板是2  
        direction = 270,          -- 屏幕方向
        w = width,                -- 屏幕宽度
        h = height,               -- 屏幕高度
        xoffset = 0,              -- X轴偏移像素
        yoffset = 0,              -- Y轴偏移像素
        sleepcmd = 0x10,          -- LCD睡眠命令
        wakecmd = 0x11,           -- LCD唤醒命令
    }

    -- 如果是co5300添加QSPI专用参数
    if sn == "co5300" then
        lcd_param.interface_mode = lcd.QSPI_MODE
        lcd_param.bus_speed = 60000000  -- 60MHz
        lcd_param.rb_swap = true
        lcd_param.pin_pwr = -1         -- 自发光屏不需要背光控制
        lcd_param.pin_dc = -1
        lcd_param.pin_rst = 36  
        gpio.setup(17, 0, gpio.PULLUP)-- CO5300电源
        sys.wait(100)
        gpio.setup(17, 1, gpio.PULLUP)
        sys.wait(1000)
    elseif sn == "AirLCD_1001" then
        lcd_param.pin_dc = 0xff
        lcd_param.pin_rst = 2
        gpio.setup(164, 1, gpio.PULLUP)
        gpio.setup(141, 1, gpio.PULLUP)
        sys.wait(1000)
        lcd.init(lcd_ic, lcd_param)
    end


    -- 特殊初始化流程
    if sn == "co5300" then
        co5300_init(lcd_param)
    else
        lcd.init(lcd_ic, lcd_param)
    end

    -- 公用设置
    lcd.setupBuff(nil, true)
    lcd.autoFlush(false)
    lcd.user_done()
    lcd.clear()
    lcd.flush()

end

return airLCD