Просмотр исходного кода

add:Air8101下新增AirFONTS_1000的demo,还没有完全写好,在等待新固件发布

zhutianhua 9 месяцев назад
Родитель
Сommit
38e4e62b54

+ 37 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lcd/AirFONTS_1000.lua

@@ -0,0 +1,37 @@
+local AirFONTS_1000 = {}
+
+--初始化AirFONTS_1000的SPI配置
+--AirFONTS_1000通过SPI接口(SCK CS MOSI MISO)和主控相连
+--主控设备为SPI主设备,AirFONTS_1000为SPI从设备
+
+--spi_id:number类型;
+--     表示主设备的SPI ID;
+--     取值范围:主控产品上有效的SPI ID值,例如Air8101上的取值范围为0和1;
+--     如果没有传入此参数或者传入了nil,则使用默认值1;
+--spi_cs:number类型;
+--     表示cs引脚的GPIO ID;
+--     取值范围:主控产品上有效的GPIO ID值,例如Air8101上的取值范围为0到9,12,14到55;
+--     如果没有传入此参数或者传入了nil,则使用默认值3;
+
+--返回值:成功返回true,失败返回false
+function AirFONTS_1000.init(spi_id, spi_cs)
+    --创建一个SPI设备对象
+    AirFONTS_1000.spi_gtfont = spi.deviceSetup(spi_id or 1, spi_cs or 3, 0, 0, 8, 20*1000*1000, spi.MSB, 1, 0)
+
+    --检查SPI设备对象是否创建成功
+    if type(AirFONTS_1000.spi_gtfont) ~= "userdata" then
+        log.error("AirFONTS_1000.init", "spi.deviceSetup error", type(AirFONTS_1000.spi_gtfont))
+        return false
+    end
+
+    --初始化矢量字库
+    if not gtfont.init(AirFONTS_1000.spi_gtfont) then
+        log.error("AirFONTS_1000.init", "gtfont.init error")
+        return false
+    end
+
+    return true
+end
+
+
+return AirFONTS_1000

+ 95 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lcd/AirLCD_1020.lua

@@ -0,0 +1,95 @@
+local AirLCD_1020 = 
+{
+    -- i2c_soft_device = , --触摸面板使用的软件I2C对象,必须使用全局变量存储,不能使用local类型的局部变量
+    -- tp_device = , --触摸面板设备
+}
+
+--AirLCD_1020显示屏的分辨率为800*480
+local WIDTH, HEIGHT = 800, 480
+
+
+--初始化AirLCD_1020的LCD配置
+
+--返回值:nil
+function AirLCD_1020.init_lcd()
+    -- st7265
+    lcd.init("custom",
+        {port = lcd.RGB, hbp = 8, hspw = 4, hfp = 8, vbp = 16, vspw = 4, vfp = 16,
+        bus_speed = 30*1000*1000, direction = 0, w = WIDTH, h = HEIGHT, xoffset = 0, yoffset = 0})
+end
+
+--关闭AirLCD_1020的LCD
+
+--返回值:nil
+function AirLCD_1020.close_lcd()
+    lcd.close()
+end
+
+
+--初始化AirLCD_1020的TP配置
+--无论使用硬件i2c还是软件io模拟i2c,都是传入引脚的GPIO ID
+
+--int:number类型;
+--     表示中断引脚GPIO ID;
+--     取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--     如果没有传入此参数或者传入了nil,则使用默认值7;
+--rst:number类型;
+--     表示复位控制引脚GPIO ID;
+--     取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--     如果没有传入此参数或者传入了nil,则使用默认值28;
+--sda:number类型;
+--     表示数据引脚GPIO ID;
+--     取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--     如果没有传入此参数或者传入了nil,则使用默认值1;
+--scl:number类型;
+--     表示时钟引脚脚GPIO ID;
+--     取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--     如果没有传入此参数或者传入了nil,则使用默认值0;
+--cb: function类型;
+--     表示触摸事件的回调函数,回调函数的定义格式如下:
+--     function cb_func(tp_device, tp_data)
+--         --tp_device:产生触摸事件的触摸设备,和AirLCD_1020.init_tp函数的返回值一致
+--         --tp_data:触摸事件的数据结构
+--                  tp_data[1].event:触摸事件,number类型,tp.EVENT_DOWN(按下事件,值为1),tp.EVENT_UP(弹起事件,值为2),tp.EVENT_MOVE(移动事件,值为3)
+--                  tp_data[1].x:触摸的x坐标,number类型
+--                  tp_data[1].y:触摸的y坐标,number类型
+--                  tp_data[1].timestamp:触摸时的系统tick数;每秒钟包含的tick数量可以通过mcu.hz()获取,例如Air8101上,每秒的tick数量是500
+--     end
+--     允许为空,没有默认值;
+
+--返回值:成功返回触摸设备对象(非nil),失败返回nil
+function AirLCD_1020.init_tp(int, rst, sda, scl, cb)
+    AirLCD_1020.i2c_soft_device = i2c.createSoft(scl or 0, sda or 1)  
+
+    AirLCD_1020.tp_device = tp.init("gt911",{port=AirLCD_1020.i2c_soft_device, pin_rst = rst or 28, pin_int = int or 7, w = WIDTH, h = HEIGHT}, cb)
+
+    return AirLCD_1020.tp_device
+end
+
+
+--打开AirLCD_1020的背光
+
+--gpio_id:number类型;
+--         表示控制LCD背光的GPIO ID;
+--         取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--         如果没有传入此参数或者传入了nil,则使用默认值8;
+
+--返回值:nil
+function AirLCD_1020.open_backlight(gpio_id)
+    gpio.setup(gpio_id or 8, 1)
+end
+
+--关闭AirLCD_1020的背光
+
+--gpio_id:number类型;
+--         表示控制LCD背光的GPIO ID;
+--         取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--         如果没有传入此参数或者传入了nil,则使用默认值8;
+
+--返回值:nil
+function AirLCD_1020.close_backlight(gpio_id)
+    gpio.setup(gpio_id or 8, 0)
+end
+
+
+return AirLCD_1020

+ 98 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lcd/lcd_vector_font_app.lua

@@ -0,0 +1,98 @@
+--加载AirFONTS_1000驱动文件
+local air_vetor_fonts = require "AirFONTS_1000"
+--加载AirLCD_1020驱动文件
+local air_lcd = require "AirLCD_1020"
+
+
+--lcd显示矢量字体的task
+--自动刷新显示不同字号矢量字体以及不同bit的灰度显示效果
+local function lcd_vector_font_app_task_func()
+    log.info("lcd_vector_font_app_task_func enter")
+    -- 开启显示缓冲区, 刷屏速度会加快, 但也消耗2倍屏幕分辨率的内存(2*宽*高 字节)
+    -- 第一个参数无意义,直接填nil即可
+    -- 第二个参数true表示使用sys中的内存
+    lcd.setupBuff(nil, true)
+    --禁止自动刷新
+    --需要刷新时需要主动调用lcd.flush()接口,才能将缓冲区中的数据显示到lcd上
+    lcd.autoFlush(false)
+
+    --每隔10秒清屏并且全屏刷新显示一张图片
+    while true do
+        --清屏
+        lcd.clear()
+
+        lcd.setColor(0xFFFF, 0x0000)
+        lcd.drawGtfontUtf8("AirFONTS_1000",32,240,150)
+        lcd.drawGtfontUtf8Gray("配件板",32,4,444,150)
+
+        lcd.setColor(0xFFFF, 0xF800)
+        lcd.drawGtfontUtf8Gray("支持",32,4,224-8,191)
+        lcd.drawGtfontUtf8("16",32,288-8,191)
+        lcd.drawGtfontUtf8Gray("到",32,4,320-8,191)
+        lcd.drawGtfontUtf8("192",32,352-8,191)
+        lcd.drawGtfontUtf8Gray("号的黑体字体",32,4,384+3,191)
+
+        lcd.setColor(0xFFFF, 0x07E0)
+        lcd.drawGtfontUtf8Gray("支持",32,4,192-10,232)
+        lcd.drawGtfontUtf8("GBK",32,256-10,232)
+        lcd.drawGtfontUtf8Gray("中文和",32,4,324-10,232)
+        lcd.drawGtfontUtf8("ASCII",32,420-10,232)
+        lcd.drawGtfontUtf8Gray("码字符集",32,4,500-10,232)
+
+        lcd.setColor(0xFFFF, 0x001F)
+        lcd.drawGtfontUtf8Gray("支持灰度显示,字体边缘更平滑",32,4,176,273)
+
+        -- lcd.flush()
+
+
+        -- for i=16,32,2 do
+        --     lcd.clear()
+        --     lcd.drawGtfontUtf8(i.."号:合宙Air8101   LuatOS",i,10,10)
+        --     lcd.flush()
+        --     sys.wait(1000)
+        -- end
+
+        --灰度1:16 24 32
+        --灰度2:16 24 32
+        --灰度3:16 32
+        --灰度4:16 20 24 28 32
+        -- for i=16,32,2 do
+        --     lcd.clear()
+        --     lcd.drawGtfontUtf8Gray(i.."号灰度4:合宙Air8101 LuatOS",i,4,10,10)
+        --     lcd.flush()
+        --     sys.wait(1000)
+        -- end
+       
+        -- lcd.drawGtfontUtf8("16号:合宙Air8101 LuatOS",16,10,10)
+        -- lcd.drawGtfontUtf8("20号:合宙Air8101 LuatOS",20,10,30)
+        -- lcd.drawGtfontUtf8("24号:合宙Air8101 LuatOS",24,10,54)
+        -- lcd.drawGtfontUtf8("28号:合宙Air8101 LuatOS",28,10,82)
+        -- lcd.drawGtfontUtf8("32号:合宙Air8101 LuatOS",32,10,114)
+        -- lcd.drawGtfontUtf8("36号:合宙Air8101 LuatOS",36,10,150)
+        -- lcd.drawGtfontUtf8("40号:合宙Air8101 LuatOS",40,10,190)
+        -- lcd.drawGtfontUtf8("44号:合宙Air8101 LuatOS",44,10,234)
+        -- lcd.drawGtfontUtf8("48号:合宙Air8101 LuatOS",48,10,282)
+        -- lcd.drawGtfontUtf8("64号:合宙Air8101 LuatOS",64,10,334)
+
+        -- lcd.drawGtfontUtf8("合宙Air8101 LuatOS",12,0,100)
+        -- lcd.drawGtfontUtf8Gray("啊啊啊",32,4,0,140)
+        --刷屏,将缓冲区中的数据显示到lcd上
+        lcd.flush()
+        --等待10秒钟
+        sys.wait(1000000)
+    end
+end
+
+
+--初始化矢量字库
+air_vetor_fonts.init()
+
+--初始化LCD
+air_lcd.init_lcd()
+--打开LCD背光
+air_lcd.open_backlight()
+
+--创建并且启动一个task
+--task的主函数为lcd_vector_font_app_task_func
+sys.taskInit(lcd_vector_font_app_task_func)
+

+ 78 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lcd/main.lua

@@ -0,0 +1,78 @@
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+
+AirFONTS_1000是合宙设计生产的一款矢量字体的配件板;
+支持GBK中文和ASCII码字符集
+支持16到192号的黑体字体
+16号到31号,支持4bit灰度显示
+32号到64号,支持2bit灰度显示
+65号到192号,不支持灰度显示
+本demo演示的核心功能为:
+Air8101核心板+AirFONTS_1000配件板+AirLCD_1020配件板,演示多种字号和灰度的显示效果;
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "AirLCD_1020_LCD"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+-- 加载必须用到的sys功能模块
+-- sys功能模块是LuatOS运行框架的基础模块
+_G.sys = require("sys")
+
+
+-- 加载大部分情况下会用到的sysplus功能模块
+-- sysplus功能模块是sys功能模块的强力补充
+-- 如果项目脚本中用到了sysplus的接口,则打开此处的注释
+-- _G.sysplus = require("sysplus")
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+--  end, 3000)
+
+-- 加载lcd和矢量字体显示应用模块
+require "lcd_vector_font_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 123 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lcd/readme.md

@@ -0,0 +1,123 @@
+
+## 演示功能概述
+
+AirFONTS_1000是合宙设计生产的一款矢量字体的配件板;
+
+支持GBK中文和ASCII码字符集
+
+支持16到192号的黑体字体
+
+16号到31号,支持4bit灰度显示
+
+32号到64号,支持2bit灰度显示
+
+65号到192号,不支持灰度显示
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirFONTS_1000配件板+AirLCD_1020配件板,演示多种字号和灰度的显示效果;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirFONTS_1000/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirFONTS_1000配件板+6根5cm长的母对母的杜邦线(一定要使用配套的杜邦线,如果杜邦线太长,SPI数据传输不稳定,可能会出现显示花屏的问题)
+
+3、AirLCD_1020配件板+40pin双头线
+
+4、Air8101核心板和AirFONTS_1000配件板、AirLCD_1020配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirFONTS_1000配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给FONTS芯片供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
+
+
+| Air8101核心板 | AirFONTS_1000配件板|
+| ------------ | ------------------ |
+|     vbat     |         3.3V       |
+|     gnd      |         GND        |
+|   67/GPIO4   |         MOSI       |
+|   8/GPIO5    |         MISO       |
+|   66/GPIO3   |          CS        |
+|   65/GPIO2   |         CLK        |
+
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirLCD_1020配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
+
+- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
+
+| Air8101核心板 | AirLCD_1020配件板 |
+| ------------ | ------------------ |
+|     gnd      |         GND        |
+|     vbat     |         VCC        |
+|    42/R0     |        RGB_R0      |
+|    40/R1     |        RGB_R1      |
+|    43/R2     |        RGB_R2      |
+|    39/R3     |        RGB_R3      |
+|    44/R4     |        RGB_R4      |
+|    38/R5     |        RGB_R5      |
+|    45/R6     |        RGB_R6      |
+|    37/R7     |        RGB_R7      |
+|    46/G0     |        RGB_G0      |
+|    36/G1     |        RGB_G1      |
+|    47/G2     |        RGB_G2      |
+|    35/G3     |        RGB_G3      |
+|    48/G4     |        RGB_G4      |
+|    34/G5     |        RGB_G5      |
+|    49/G6     |        RGB_G6      |
+|    33/G7     |        RGB_G7      |
+|    50/B0     |        RGB_B0      |
+|    32/B1     |        RGB_B1      |
+|    51/B2     |        RGB_B2      |
+|    31/B3     |        RGB_B3      |
+|    52/B4     |        RGB_B4      |
+|    30/B5     |        RGB_B5      |
+|    53/B6     |        RGB_B6      |
+|    29/B7     |        RGB_B7      |
+|   28/DCLK    |       RGB_DCLK     |
+|   54/DISP    |       RGB_DISP     |
+|   55/HSYN    |       RGB_HSYNC    |
+|   56/VSYN    |       RGB_VSYNC    |
+|    57/DE     |        RGB_DE      |
+|   14/GPIO8   |        LCD_BL      |
+|   13/GPIO9   |        LCD_RST     |
+|    8/GPIO5   |        LCD_SDI     |
+|    9/GPIO6   |        LCD_SCL     |
+|  68/GPIO12   |        LCD_CS      |
+|  75/GPIO28   |        TP_RST      |
+|   10/GPIO7   |        TP_INT      |
+|   12/U1TX    |        TP_SCL      |
+|   11/U1RX    |        TP_SDA      |
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[目前还没有正式固件,只有临时内测固件,联系合宙销售同事获取](https://docs.openluat.com/air8101/luatos/firmware/)
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+   (1) ;
+   
+

+ 37 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lvgl/AirFONTS_1000.lua

@@ -0,0 +1,37 @@
+local AirFONTS_1000 = {}
+
+--初始化AirFONTS_1000的SPI配置
+--AirFONTS_1000通过SPI接口(SCK CS MOSI MISO)和主控相连
+--主控设备为SPI主设备,AirFONTS_1000为SPI从设备
+
+--spi_id:number类型;
+--     表示主设备的SPI ID;
+--     取值范围:主控产品上有效的SPI ID值,例如Air8101上的取值范围为0和1;
+--     如果没有传入此参数或者传入了nil,则使用默认值1;
+--spi_cs:number类型;
+--     表示cs引脚的GPIO ID;
+--     取值范围:主控产品上有效的GPIO ID值,例如Air8101上的取值范围为0到9,12,14到55;
+--     如果没有传入此参数或者传入了nil,则使用默认值3;
+
+--返回值:成功返回spi设备对象(userdata类型),失败返回false
+function AirFONTS_1000.init(spi_id, spi_cs)
+    --创建一个SPI设备对象
+    AirFONTS_1000.spi_gtfont = spi.deviceSetup(spi_id or 1, spi_cs or 3, 0, 0, 8, 20*1000*1000, spi.MSB, 1, 0)
+
+    --检查SPI设备对象是否创建成功
+    if type(AirFONTS_1000.spi_gtfont) ~= "userdata" then
+        log.error("AirFONTS_1000.init", "spi.deviceSetup error", type(AirFONTS_1000.spi_gtfont))
+        return false
+    end
+
+    --初始化矢量字库
+    if not gtfont.init(AirFONTS_1000.spi_gtfont) then
+        log.error("AirFONTS_1000.init", "gtfont.init error")
+        return false
+    end
+
+    return AirFONTS_1000.spi_gtfont
+end
+
+
+return AirFONTS_1000

+ 95 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lvgl/AirLCD_1020.lua

@@ -0,0 +1,95 @@
+local AirLCD_1020 = 
+{
+    -- i2c_soft_device = , --触摸面板使用的软件I2C对象,必须使用全局变量存储,不能使用local类型的局部变量
+    -- tp_device = , --触摸面板设备
+}
+
+--AirLCD_1020显示屏的分辨率为800*480
+local WIDTH, HEIGHT = 800, 480
+
+
+--初始化AirLCD_1020的LCD配置
+
+--返回值:nil
+function AirLCD_1020.init_lcd()
+    -- st7265
+    lcd.init("custom",
+        {port = lcd.RGB, hbp = 8, hspw = 4, hfp = 8, vbp = 16, vspw = 4, vfp = 16,
+        bus_speed = 30*1000*1000, direction = 0, w = WIDTH, h = HEIGHT, xoffset = 0, yoffset = 0})
+end
+
+--关闭AirLCD_1020的LCD
+
+--返回值:nil
+function AirLCD_1020.close_lcd()
+    lcd.close()
+end
+
+
+--初始化AirLCD_1020的TP配置
+--无论使用硬件i2c还是软件io模拟i2c,都是传入引脚的GPIO ID
+
+--int:number类型;
+--     表示中断引脚GPIO ID;
+--     取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--     如果没有传入此参数或者传入了nil,则使用默认值7;
+--rst:number类型;
+--     表示复位控制引脚GPIO ID;
+--     取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--     如果没有传入此参数或者传入了nil,则使用默认值28;
+--sda:number类型;
+--     表示数据引脚GPIO ID;
+--     取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--     如果没有传入此参数或者传入了nil,则使用默认值1;
+--scl:number类型;
+--     表示时钟引脚脚GPIO ID;
+--     取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--     如果没有传入此参数或者传入了nil,则使用默认值0;
+--cb: function类型;
+--     表示触摸事件的回调函数,回调函数的定义格式如下:
+--     function cb_func(tp_device, tp_data)
+--         --tp_device:产生触摸事件的触摸设备,和AirLCD_1020.init_tp函数的返回值一致
+--         --tp_data:触摸事件的数据结构
+--                  tp_data[1].event:触摸事件,number类型,tp.EVENT_DOWN(按下事件,值为1),tp.EVENT_UP(弹起事件,值为2),tp.EVENT_MOVE(移动事件,值为3)
+--                  tp_data[1].x:触摸的x坐标,number类型
+--                  tp_data[1].y:触摸的y坐标,number类型
+--                  tp_data[1].timestamp:触摸时的系统tick数;每秒钟包含的tick数量可以通过mcu.hz()获取,例如Air8101上,每秒的tick数量是500
+--     end
+--     允许为空,没有默认值;
+
+--返回值:成功返回触摸设备对象(非nil),失败返回nil
+function AirLCD_1020.init_tp(int, rst, sda, scl, cb)
+    AirLCD_1020.i2c_soft_device = i2c.createSoft(scl or 0, sda or 1)  
+
+    AirLCD_1020.tp_device = tp.init("gt911",{port=AirLCD_1020.i2c_soft_device, pin_rst = rst or 28, pin_int = int or 7, w = WIDTH, h = HEIGHT}, cb)
+
+    return AirLCD_1020.tp_device
+end
+
+
+--打开AirLCD_1020的背光
+
+--gpio_id:number类型;
+--         表示控制LCD背光的GPIO ID;
+--         取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--         如果没有传入此参数或者传入了nil,则使用默认值8;
+
+--返回值:nil
+function AirLCD_1020.open_backlight(gpio_id)
+    gpio.setup(gpio_id or 8, 1)
+end
+
+--关闭AirLCD_1020的背光
+
+--gpio_id:number类型;
+--         表示控制LCD背光的GPIO ID;
+--         取值范围:主控产品(例如Air8101)上有效的GPIO ID值;
+--         如果没有传入此参数或者传入了nil,则使用默认值8;
+
+--返回值:nil
+function AirLCD_1020.close_backlight(gpio_id)
+    gpio.setup(gpio_id or 8, 0)
+end
+
+
+return AirLCD_1020

+ 94 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lvgl/lcd_vector_font_app.lua

@@ -0,0 +1,94 @@
+--加载AirFONTS_1000驱动文件
+local air_vetor_fonts = require "AirFONTS_1000"
+--加载AirLCD_1020驱动文件
+local air_lcd = require "AirLCD_1020"
+--TP设备
+local tp_device
+
+
+--lcd显示矢量字体的task
+--自动刷新显示不同字号矢量字体以及不同bit的灰度显示效果
+local function lcd_vector_font_app_task_func()
+    log.info("lcd_vector_font_app_task_func enter")
+    -- 开启显示缓冲区, 刷屏速度会加快, 但也消耗2倍屏幕分辨率的内存(2*宽*高 字节)
+    -- 第一个参数无意义,直接填nil即可
+    -- 第二个参数true表示使用sys中的内存
+    lcd.setupBuff(nil, true)
+    --禁止自动刷新
+    --需要刷新时需要主动调用lcd.flush()接口,才能将缓冲区中的数据显示到lcd上
+    lcd.autoFlush(false)
+
+    lvgl.init()
+    lvgl.indev_drv_register("pointer", "touch", tp_device)
+
+    local scr = lvgl.obj_create(nil, nil)
+
+    -- 加载16号和32号矢量字体
+    local counter_label_font_size = 16
+    local font_counter_label = lvgl.font_load(air_vetor_fonts.spi_gtfont, counter_label_font_size)
+    local font32 = lvgl.font_load(air_vetor_fonts.spi_gtfont, 32)
+
+    -- 创建一个按钮
+    local btn = lvgl.btn_create(scr)  -- 在屏幕上创建一个按钮
+    lvgl.obj_set_size(btn, 100, 50)  -- 设置按钮大小为100x50
+    lvgl.obj_align(btn, nil, lvgl.ALIGN_CENTER, 0, 0)  -- 将按钮居中
+
+    -- 在按钮上添加一个标签
+    local btn_label = lvgl.label_create(btn)  -- 在按钮上创建一个标签
+    lvgl.obj_set_style_local_text_font(btn_label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font32)  -- 设置为32号矢量字体
+    lvgl.label_set_text(btn_label, "点我")  -- 设置按钮标签的文本为“Press Me”
+    lvgl.obj_align(btn_label, nil, lvgl.ALIGN_CENTER, 0, 0)  -- 将标签居中显示在按钮上
+
+    -- 创建一个标签用于显示数字
+    local counter_label = lvgl.label_create(scr)  -- 在屏幕上创建一个标签
+    lvgl.obj_set_style_local_text_font(counter_label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font_counter_label) -- 初始设置为16号矢量字体
+    lvgl.label_set_text(counter_label, counter_label_font_size.."号字体")  -- 设置标签的初始文本为“16号字体”
+    lvgl.obj_align(counter_label, nil, lvgl.ALIGN_CENTER, 0, -100)  -- 将标签左右居中,向上偏移100像素
+
+    -- 按钮点击事件回调函数
+    local function btn_event_cb(obj, event)
+        --颜色表,依次是黑色,红色,绿色,蓝色
+        local color_table = {lvgl.color_hex(0x000000), lvgl.color_hex(0xFF0000), lvgl.color_hex(0x00FF00), lvgl.color_hex(0x0000FF)}
+        if event == lvgl.EVENT_CLICKED then  -- 如果按钮被点击
+            log.info("button clicked")
+  
+            -- 要显示的矢量字体字号加一
+            counter_label_font_size = counter_label_font_size+1
+            -- 如果大于32,复位到默认值16
+            if counter_label_font_size>32 then counter_label_font_size = 16 end
+
+            -- 加载counter_label_font_size字号大小的矢量字体
+            font_counter_label = lvgl.font_load(air_vetor_fonts.spi_gtfont, counter_label_font_size)
+            -- 设置标签的显示字体为counter_label_font_size字号大小的矢量字体
+            lvgl.obj_set_style_local_text_font(counter_label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, font_counter_label) 
+            -- 设置标签上显示内容的颜色,依次在黑,红,绿,蓝之间循环
+            lvgl.obj_set_style_local_text_color(counter_label, lvgl.LABEL_PART_MAIN, lvgl.STATE_DEFAULT, color_table[counter_label_font_size%4+1])
+
+            -- 更新标签上显示的内容
+            lvgl.label_set_text(counter_label, counter_label_font_size .. "号字体")
+        end
+    end
+    
+
+    -- 将回调函数绑定到按钮的点击事件
+    lvgl.obj_set_event_cb(btn, btn_event_cb, lvgl.EVENT_CLICKED, nil)
+    
+    
+    lvgl.scr_load(scr)
+end
+
+
+--初始化矢量字库
+air_vetor_fonts.init()
+
+--初始化LCD
+air_lcd.init_lcd()
+--初始化TP触摸面板
+tp_device = air_lcd.init_tp()
+--打开LCD背光
+air_lcd.open_backlight()
+
+--创建并且启动一个task
+--task的主函数为lcd_vector_font_app_task_func
+sys.taskInit(lcd_vector_font_app_task_func)
+

+ 75 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lvgl/main.lua

@@ -0,0 +1,75 @@
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+
+AirFONTS_1000是合宙设计生产的一款矢量字体的配件板;
+支持GBK中文和ASCII码字符集
+支持16到192号的黑体字体,支持灰度显示
+本demo演示的核心功能为:
+Air8101核心板+AirFONTS_1000配件板+AirLCD_1020配件板,演示多种字号的显示效果;
+更多说明参考本目录下的readme.md文件
+]]
+PROJECT = "AirLCD_1020_LCD"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+-- 加载必须用到的sys功能模块
+-- sys功能模块是LuatOS运行框架的基础模块
+_G.sys = require("sys")
+
+
+-- 加载大部分情况下会用到的sysplus功能模块
+-- sysplus功能模块是sys功能模块的强力补充
+-- 如果项目脚本中用到了sysplus的接口,则打开此处的注释
+-- _G.sysplus = require("sysplus")
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+--  end, 3000)
+
+-- 加载lcd和矢量字体显示应用模块
+require "lcd_vector_font_app"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 119 - 0
module/Air8101/project/core_accessory_board/AirFONTS_1000/lvgl/readme.md

@@ -0,0 +1,119 @@
+
+## 演示功能概述
+
+AirFONTS_1000是合宙设计生产的一款矢量字体的配件板;
+
+支持GBK中文和ASCII码字符集
+
+支持16到192号的黑体字体,支持灰度显示
+
+本demo演示的核心功能为:
+
+Air8101核心板+AirFONTS_1000配件板+AirLCD_1020配件板,演示多种字号和灰度的显示效果;
+
+
+## 核心板+配件板资料
+
+[Air8101核心板+配件板相关资料](https://docs.openluat.com/air8101/product/shouce/#air8101_1)
+
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8101/product/file/AirFONTS_1000/hw_connection.jpg)
+
+1、Air8101核心板
+
+2、AirFONTS_1000配件板+6根5cm长的母对母的杜邦线(一定要使用配套的杜邦线,如果杜邦线太长,SPI数据传输不稳定,可能会出现显示花屏的问题)
+
+3、AirLCD_1020配件板+40pin双头线
+
+4、Air8101核心板和AirFONTS_1000配件板、AirLCD_1020配件板的硬件接线方式为
+
+- Air8101核心板通过TYPE-C USB口供电(核心板背面的功耗测试开关拨到OFF一端);如果测试发现软件重启,并且日志中出现  poweron reason 0,表示供电不足,此时再通过直流稳压电源对核心板的VIN管脚进行5V供电;
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirFONTS_1000配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给FONTS芯片供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
+
+
+| Air8101核心板 | AirFONTS_1000配件板|
+| ------------ | ------------------ |
+|     vbat     |         3.3V       |
+|     gnd      |         GND        |
+|   67/GPIO4   |         MOSI       |
+|   8/GPIO5    |         MISO       |
+|   66/GPIO3   |          CS        |
+|   65/GPIO2   |         CLK        |
+
+
+- 为了演示方便,所以Air8101核心板上电后直接通过vbat引脚给AirLCD_1020配件板提供了3.3V的供电;
+
+- 客户在设计实际项目时,一般来说,需要通过一个GPIO来控制LDO给LCD和TP供电,这样可以灵活地控制供电,可以使项目的整体功耗降到最低;
+
+- 核心板和配件板之间配备了双排40PIN的双头线,可以参考下表很方便地连接双方各自的40个管脚,插入或者拔出双头线时,要慢慢的操作,防止将排针折弯;
+
+| Air8101核心板 | AirLCD_1020配件板 |
+| ------------ | ------------------ |
+|     gnd      |         GND        |
+|     vbat     |         VCC        |
+|    42/R0     |        RGB_R0      |
+|    40/R1     |        RGB_R1      |
+|    43/R2     |        RGB_R2      |
+|    39/R3     |        RGB_R3      |
+|    44/R4     |        RGB_R4      |
+|    38/R5     |        RGB_R5      |
+|    45/R6     |        RGB_R6      |
+|    37/R7     |        RGB_R7      |
+|    46/G0     |        RGB_G0      |
+|    36/G1     |        RGB_G1      |
+|    47/G2     |        RGB_G2      |
+|    35/G3     |        RGB_G3      |
+|    48/G4     |        RGB_G4      |
+|    34/G5     |        RGB_G5      |
+|    49/G6     |        RGB_G6      |
+|    33/G7     |        RGB_G7      |
+|    50/B0     |        RGB_B0      |
+|    32/B1     |        RGB_B1      |
+|    51/B2     |        RGB_B2      |
+|    31/B3     |        RGB_B3      |
+|    52/B4     |        RGB_B4      |
+|    30/B5     |        RGB_B5      |
+|    53/B6     |        RGB_B6      |
+|    29/B7     |        RGB_B7      |
+|   28/DCLK    |       RGB_DCLK     |
+|   54/DISP    |       RGB_DISP     |
+|   55/HSYN    |       RGB_HSYNC    |
+|   56/VSYN    |       RGB_VSYNC    |
+|    57/DE     |        RGB_DE      |
+|   14/GPIO8   |        LCD_BL      |
+|   13/GPIO9   |        LCD_RST     |
+|    8/GPIO5   |        LCD_SDI     |
+|    9/GPIO6   |        LCD_SCL     |
+|  68/GPIO12   |        LCD_CS      |
+|  75/GPIO28   |        TP_RST      |
+|   10/GPIO7   |        TP_INT      |
+|   12/U1TX    |        TP_SCL      |
+|   11/U1RX    |        TP_SDA      |
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[目前还没有正式固件,只有临时内测固件,联系合宙销售同事获取](https://docs.openluat.com/air8101/luatos/firmware/)
+
+## 演示操作步骤
+
+1、搭建好演示硬件环境
+
+2、不需要修改demo脚本代码
+
+3、Luatools烧录内核固件和demo脚本代码
+
+4、烧录成功后,自动开机运行
+
+   (1) 开机后会显示一个标签和一个按钮,标签上显示的内容为“16号字体”,颜色为黑色;按钮上显示的内容为“点我”;
+
+   (2) 点击一次“点我”按钮,标签上显示的内容和颜色发生变化,显示的内容中的数字依次加一,在16和32之间循环;显示的颜色在黑色,红色,绿色,蓝色之间循环;
+   
+