tangloong 说:wakulgz 说:@tangloong
大佬 你的LVGL是用什么软件模拟的 啊官方提供的工程 vscode 或者 codeblock 都可以
请问有下载链接吗 这边确实没有找到啊 原谅手残 谢谢
https://docs.lvgl.io/master/integration/ide/pc-simulator.html#simulator 这里有各个ide 的模拟器 都是弄好了的
楼主,还是请教下,还是不知道drv_i2c这种文件从哪里来的,是官方有? 还是别人工程移植的? 还是自己写的?
https://gitee.com/LicheePiNano/lv7_rtthread_f1c100s/tree/master/rt-thread/bsp/allwinner_tina/drivers
这里 别人根据LINUX驱动移植的,RTT没有官方支持的都是自己弄,本来F1C100S官方资料都不会给,怎么可能有RTT的驱动
我也搞个板子测试下,看如何:D
https://whycan.com/files/members/2275/微信截图_20231222165548.jpg
boot 按键? 两路电源? rst 按键跟排针有阻碍
楼主,用哪个工具写的norspi?可以正常引导了吗? 能分享一下具体的过程和 命令格式吗? 我在一直停留在
Init OK
Boot to SPI mode
3852464152
Magic error
https://gitee.com/kasira/f1c200s_rtt_lvgl830
我的这个readme 里面 后半部分有详细介绍boot 和app 之间拷贝到关系
照着我的link.lds 和 start gcc.s 进行改造即可
看视频,还是很流畅,一个的问题就是内存感觉不太够用,再刷多两张图,估计就不行了。
https://whycan.com/files/members/7292/b630bab353097d56977e19812cec5b82.mp4
谢谢支持 板子手焊了很多元器件 搞的比较烂
d133和你的d21x比咋样
1.启动速度确实快
2.调试完的SDK链接,触摸和RGB显示已调通,IO模拟SPI显示SPI屏幕等 https://gitee.com/kasira/luban-lite
3.淘宝链接: https://item.taobao.com/item.htm?spm=a21n57.1.0.0.6b12523ccXOYnr&id=756590027971&ns=1&abbucket=20#detail
4.
问下,批量后对标f1c100性能的芯片价格能跟f1c100差多少,目前使用f1c100做产品,准备寻找个替换型号
d133cbs 跟f1c100s 应该持平吧 d133bbs 估计更便宜
但是d13x 有2d加速 支持lvds mipi mac 等 还是工业级的 这是优点 缺点是貌似8m ram 小了点
还有个是开发支持,我用f1c100s 全靠自己摸,d133cbs我目前还在验证,毕竟是个新东西还不太熟悉,走了很大弯路,官方sdk也一直在完善,d13x 我觉得是对标f1c100s的吧,算降维吧,如果配置上d12x 对标f1c100s,那价格可以说直接秒杀他,除非降到四五年前的价格去
F1C200S跑tina3.0开机的时候初始化完LCD屏幕就会显示成一半蓝一半绿,怎么能去掉不让显示这个出来
https://whycan.com/files/members/1378/111.jpg
估计是驱动里面给了颜色吧,要是改不了就把背光关了
有点跟不上 d12x是啥
https://whycan.com/t_10339.html
看选型表 没有摄像头 没有网络的系列
tangloong 说:@lfs911
见 https://whycan.com/t_10374.html 这里有运行日志
Startup time: 0.456 sec
这是跑的rtthread的demo程序是是在哪跑的,Flash、SRAM还是PSRAM?
Flash里,运行的镜像大小:2.86MB ,按理说应该运行lvgl的,但实际情况貌似初始化完gt911后就结束了
@lfs911
见 https://whycan.com/t_10374.html 这里有运行日志
Startup time: 0.456 sec
这是跑的rtthread的demo
tangloong 说:我的40pin rgb目前不能显示
贴出来,我让FAE看一下,有日志吗?
贴了呀
https://whycan.com/t_10374.html 帖子也有
微信群 你跟GEO都在的群包括原理图和运行日志都给你们了
感觉没运行到LVGL处去,
我在 luban-lite\application\baremetal\helloworld\main.c 的 AIC_LVGL_DEMO 添加了 printf("Welcome to Init LVGL");
但是日志都没打出来,而且我在这个文件多处打印信息包括更改show_banner 没有用每次烧录都还是原来的,不是我改动的版本,难道不是改这个文件么?
Pre-Boot Program ... (2023-11-14 13:46:14)SPINOR
tinySPL [Built on Nov 21 2023 11:14:09]
[W] usbh_get_connect_id()107 usb 0 port change wait failed.
[E] main()137 Not find udisk.
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
qspi0 freq ( bus ): 100000000Hz
Selecting default config 'Luban-lite firmware'
mtd read: 690412 byte, 31891 us -> 21141 KB/s
no string for index 1
148198 : Run APP
_ _ ___ ___ _ _
/ \ _ __| |_|_ _|_ __ / __| |__ (_)_ __
/ _ \ | '__| __|| || '_ \| | | '_ \| | '_ \
/ ___ \| | | |_ | || | | | |__| | | | | |_) |
/_/ \_\_| \__|___|_| |_|\___|_| |_|_| .__/
|_|
Welcome to ArtInChip Luban-Lite 1.0 [Built on Dec 10 2023 17:13:44]
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
[32m01-01 08:00:00 I/SFUD: Flash ID: 0xef4017
[0m[32m01-01 08:00:00 I/SFUD: Find a Winbond flash chip. Size is 8388608 bytes.
[0mqspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 100000000Hz
[32m01-01 08:00:00 I/SFUD: norflash0 flash device is initialize success.
[0m[32m01-01 08:00:00 I/SFUD: Probe SPI flash norflash0 by SPI device qspi01 success.
[0m[32m01-01 08:00:00 I/touch: rt_touch init success
[0m[32m01-01 08:00:00 I/gt911: touch device gt911 init success
[0m[I] aicfb_find_component()472 find component: artinchip-de
[I] aicfb_find_component()472 find component: artinchip-rgb
[I] aic_find_panel()56 find panel driver : panel-rgb
[I] aicfb_probe()809 fb0 allocated at 0x40010300
[I] hal_ge_init()320 cmd queue hal, cmdq buffer size = 2048
[I] hal_ge_init()377 dither line phys :0X040394b80
[I] hal_ge_init()385 hal_ge_init() end
[I] aic_sdmc_clk_init()543 SDMC1 sclk: 49500 KHz, parent clk 792000 KHz
[32m01-01 08:00:00 I/SDMC: SDMC1 BW 1, sclk 49500 KHz, clk 400 KHz(399 KHz), div 2-62
[0m[I] aic_sdmc_probe()636 SDMC1 driver loaded
[31;22m[E/FAL] (check_and_update_part_cache:123) Initialize failed! Partition(data) offset address(8650752) out of flash bound(<8388608).[0m
[31;22m[E/FAL] (check_and_update_part_cache:123) Initialize failed! Partition(data) offset address(8650752) out of flash bound(<8388608).[0m
[31;22m[E/FAL] (fal_init:48) RT-Thread Flash Abstraction Layer initialize failed.[0m
[32m01-01 08:00:00 I/WDT: ArtInChip WDT loaded
[0m[31m01-01 08:00:00 E/DFS: mount fs[elm] on /rodata failed.
[0m[31m01-01 08:00:00 E/DFS: mount fs[lfs] on /data failed.
[0m[31m01-01 08:00:00 E/DFS: mount fs[elm] on /sdcard failed.
[0m[31m01-01 08:00:00 E/DFS: mount fs[elm] on /sdcard failed.
[0mReboot action: Warm-Reset, reason: External-Reset
Startup time: 0.451 sec
info: cmd ring buf size:1920
info: cmd ring buf size:1920
id = GT911
range_x = 1024
range_y = 600
point_num = 1
aic /> [32m01-01 08:00:00 I/SDMC: SDMC1 BW 1, sclk 49500 KHz, clk 400 KHz(399 KHz), div 2-62
[0m
板子接口稍微有点少,我画的板子,基本接口都接出来了。
https://whycan.com/files/members/739/D133CBS.png
usb 转串口有ch340e 封装小很多
USB烧录貌似时间有点长需要46秒 镜像大小2.90M 明天吧屏幕焊接号应该就能显示了
Pre-Boot Program ... (2023-11-14 13:46:14)SPINOR
tinySPL [Built on Nov 21 2023 11:14:09]
[W] usbh_get_connect_id()107 usb 0 port change wait failed.
[E] main()137 Not find udisk.
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
qspi0 freq ( bus ): 100000000Hz
Selecting default config 'Luban-lite firmware'
mtd read: 696332 byte, 32161 us -> 21143 KB/s
no string for index 1
146569 : Run APP
_ _ ___ ___ _ _
/ \ _ __| |_|_ _|_ __ / __| |__ (_)_ __
/ _ \ | '__| __|| || '_ \| | | '_ \| | '_ \
/ ___ \| | | |_ | || | | | |__| | | | | |_) |
/_/ \_\_| \__|___|_| |_|\___|_| |_|_| .__/
|_|
Welcome to ArtInChip Luban-Lite 1.0 [Built on Dec 7 2023 09:54:34]
qspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 50000000Hz
[32m01-01 08:00:00 I/SFUD: Flash ID: 0xef4017
[0m[32m01-01 08:00:00 I/SFUD: Find a Winbond flash chip. Size is 8388608 bytes.
[0mqspi0 freq (input): 100000000Hz
qspi0 freq ( bus ): 100000000Hz
[32m01-01 08:00:00 I/SFUD: norflash0 flash device is initialize success.
[0m[32m01-01 08:00:00 I/SFUD: Probe SPI flash norflash0 by SPI device qspi01 success.
[0m[32m01-01 08:00:00 I/touch: rt_touch init success
[0m[32m01-01 08:00:00 I/gt911: touch device gt911 init success
[0m[I] aic_find_panel()56 find panel driver : panel-rgb
[I] aicfb_probe()809 fb0 allocated at 0x40010720
[I] hal_ge_init()320 cmd queue hal, cmdq buffer size = 2048
[I] hal_ge_init()377 dither line phys :0X040268f80
[I] hal_ge_init()385 hal_ge_init() end
[32m01-01 08:00:00 I/touch: rt_touch init success
[0m[32m01-01 08:00:00 I/RTP: ArtInChip RTP loaded
[0m[I] aic_sdmc_clk_init()543 SDMC1 sclk: 49500 KHz, parent clk 792000 KHz
[32m01-01 08:00:00 I/SDMC: SDMC1 BW 1, sclk 49500 KHz, clk 400 KHz(399 KHz), div 2-62
[0m[I] aic_sdmc_probe()636 SDMC1 driver loaded
[31;22m[E/FAL] (check_and_update_part_cache:123) Initialize failed! Partition(data) offset address(8650752) out of flash bound(<8388608).[0m
[31;22m[E/FAL] (check_and_update_part_cache:123) Initialize failed! Partition(data) offset address(8650752) out of flash bound(<8388608).[0m
[31;22m[E/FAL] (fal_init:48) RT-Thread Flash Abstraction Layer initialize failed.[0m
[32m01-01 08:00:00 I/WDT: ArtInChip WDT loaded
[0m[31m01-01 08:00:00 E/DFS: mount fs[elm] on /rodata failed.
[0m[31m01-01 08:00:00 E/DFS: mount fs[lfs] on /data failed.
[0m[31m01-01 08:00:00 E/DFS: mount fs[elm] on /sdcard failed.
[0m[31m01-01 08:00:00 E/DFS: mount fs[elm] on /sdcard failed.
[0mReboot action: Warm-Reset, reason: External-Reset
Startup time: 0.456 sec
info: cmd ring buf size:1920
info: cmd ring buf size:1920
[31m01-01 08:00:00 E/gt911: read id failed
[0mid = GT67126203
[31m01-01 08:00:00 E/gt911: read info failed
[0mrange_x = 0
range_y = 0
point_num = 251
aic /> [32m01-01 08:00:00 I/SDMC: SDMC1 BW 1, sclk 49500 KHz, clk 400 KHz(399 KHz), div 2-62
[0m[31m01-01 08:00:00 E/gt911: read info failed
[0m
@tangloong
支持MJPEG硬解 ,可能效率没那么高。
请问 13X的SDK是
git clone https://gitee.com/artinchip/aic1602-lite.git 这个还是 https://gitee.com/artinchip/luban-lite
aic1602-lite没权限访问 怎么申请权限?d13x-doc-master 写的是 aic1602-lite
还有12X的SDK是不是也是这个
layer0_attr1_ctrl 0x8A0
write32((rt_uint32_t)&debe->layer0_attr1_ctrl, (0x05 << 8)); //[RGB565=0x5][ARGB8888=0xA]
参考 https://gitee.com/kasira/f1c200s_rtt_lvgl830/blob/master/drivers/drv_fb.c 348行
D133BBS 只有Flash 和SD卡 RGB 40PIN + 电容触摸 所有IO引出 type-C 供电
D133CBS 只有Flash 和SD卡 RGB 40PIN + 电容触摸 type-c USB 功能 24M晶振 所有IO引出
D133BBS 原理图
Schematic_D133BBS_V1.0_2023-11-27.pdf
D133BBS PCB
D133BBS PCB 和SMT
D133CBS 半成品
PCB+SMT 差不多 330元 + 自己邮寄 D133BBS 总共20片 每片合计30多点吧 ,加上邮费啥的 40块钱那样子,有要的吗?
ArtInChip 说:正在做4.3寸的开发板,以最低的价格给各位。
https://whycan.com/files/members/13307/微信图片_20231114214515.png这个活动已经结束啦?:o
我问了 原厂还在生产,估计还发不了货,就先下架了,避免人家下单
jinlong631 说:D211/D213这芯片强啊 从哪里能买到?
https://gitee.com/armylnk/ArtInChip/raw/master/匠芯创ArtInChip产品选型表V18.pdf
这个PDF 是你们自己做的吗?
正在做4.3寸的开发板,以最低的价格给各位。
https://whycan.com/files/members/13307/微信图片_20231114214515.png
功能全的搞一个 我说d13x 哈
最小系统板也搞一个 反正你这个是驱屏利器 引出io 加个40pin rgb ctp 就好了
ssd201核心板才50块钱 想接外围自己画个板子装上就行
防抄版 是加密还是打磨芯片?
性价比超F1C100S 是88PIN的吗?要是这样带mipi QSPI flash CAN 2D加速就吊炸天了
开发板299 太贵了,能不能出个100以内的入门款,或者出个邮票孔核心板也行
具备强大的显示功能支持,D13系列采用平头哥RISC-V高性能处理器架构,主频达500MHz以上,集成1MB SRAM,合封4-16MB PSRAM,也可合封2MB-32MB QSPI NOR Flash 怎么选择合封的Flash呢? 外扩Flash 有时候给别人提供flash 加密都不好加,
加入不用RTC 是不是电源仅用一路3.3V供电就可以了?
4MB PSRAM 不知道比起 F1C100S 32MB DDR 咋样,稍大点应用 估计4MB 不够吧?
boot 使用的是 https://gitee.com/LicheePiNano/lv7_rtthread_f1c100s 的spl
借鉴了一个keil 工程 和 https://whycan.com/t_1457.html 的 framebuffer
其中dede 初始化的时候 设置dede->mode 就崩溃了,很奇怪 可以读寄存器,但是不能写,写完程序就奔溃了,
如果屏蔽掉了就可以运行通过,但是可以显示,屏幕分辨率可以设置,但是显示的颜色不是设置buff的颜色,而是随机的 几个颜色重复出现,感觉buff的数据没设置进去
想咨询一下 移植过framebuffer的高手,处理按步骤初始化,还需要做什么额外处理吗 例如在启动文件添加某些东西?
/*debe配置*/
void Debe_Init(struct fb_f1c100s_pdata_t * pdat){
struct f1c100s_debe_reg_t * debe = (struct f1c100s_debe_reg_t *)pdat->virtdebe;
//时钟与复位
S_BIT(CCU_BUS_CLK_GATING_REG1,12);
S_BIT(CCU_BUS_SOFT_RST_REG1,12);
//delay_ms(1);
//使能DEBE
//S_BIT((virtual_addr_t)&debe->mode,0); // 用这个方式也不能用 设置程序就挂掉
uint32_t val = read32((virtual_addr_t)&debe->mode);
val |= (1 << 0);
logout("debe->mode %d",val);
write32((virtual_addr_t)&debe->mode, val); // 用这个方式也不能用 设置程序就挂掉
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include "drv_fb.h"
#include "drv_gpio.h"
#include "drv_clock.h"
#include "reg-ccu.h"
#include "reg-debe.h"
#include "reg-defe.h"
#include "reg-tcon.h"
#include "io.h"
//全局结构体
struct fb_f1c100s_pdata_t __lcd_pdat;
struct fb_f1c100s_pdata_t * lcd_pdat;
//LCD时序
struct __lcd_timing lcd_timing = {
/*模式 ----水平时序------, -----垂直时序------, -极性控制--, 串并行 CPU_MODE PCKL=(24MHz*N)/M/F [5<F<96]*/
/*MODE WIDTH,HFP,HBP,HSPW, HEIGHT,VFP,VBP,VSPW, HA,VA,DA,CA, s, 0, N, M, F, */
#ifdef LCD_TYPE_RGB43_480_272
2, 480, 8, 43, 1, 272, 4, 12, 10, 0, 0, 1, 0, 1, 0, 65, 4,40 //PCLK=9.75MHZ
#endif
#ifdef LCD_TYPE_RGB43_800_480
2, 800, 40, 87, 1, 480, 13, 31, 1, 0, 0, 1, 0, 1, 0, 65, 4,13 //PCLK=30MHZ
#endif
#ifdef LCD_TYPE_RGB80_800_600
2, 800, 40, 87, 1, 600, 13, 31, 1, 0, 0, 1, 0, 1, 0, 65, 4,13 //PCLK=30MHZ
#endif
#ifdef LCD_TYPE_RGB70_1024_600
2, 1024,160,160, 1, 600, 2, 23, 12, 0, 0, 1, 0, 1, 0, 65, 4, 13 //PCLK=48.75MHZ
#endif
};
/**
* @brief 获取视频时钟频率
* @return uint32_t
*/
inline static uint32_t get_video_pll_clk(void){
uint32_t reg;
int n, m;
reg = CCU->pll_video_ctrl;
if (!(reg & (0x01 << 31)))
return 0;
if (reg & PLL_VIDEO_MODE_SEL){
//(24MHz*n)/m
n = PLL_VIDEO_FACTOR_N(reg) + 1;
m = PLL_VIDEO_PREDIV_M(reg) + 1;
return (_24MHZ_ * n) / m;
}
if (reg & PLL_VIDEO_FRAC_CLK_OUT)
return 270000000;
else
return 297000000;
return 0;
}
/**
* @brief 等待PLL时钟开启
* @param base
* @return rt_err_t
*/
static long f1c100s_clk_wait_pll_stable(uint32_t base){
uint32_t rval = 0;
volatile int time = 0xfff;
do {
rval = read32(base);
time--;
} while (time && !(rval & (1 << 28)));
return !time;
}
/**
* @brief 启用视频时钟
* @param dev
* @param enable
*/
inline static void f1c100s_clk_pll_video_set_enable(bool enable){
rt_uint32_t val = read32(CCU->pll_video_ctrl);
if(enable) {
val |= (1 << 31);
} else {
val &= ~(1 << 31);
}
write32(CCU->pll_video_ctrl, val);
if (enable) {
f1c100s_clk_wait_pll_stable(CCU->pll_video_ctrl);
}
}
/*debe配置*/
void Debe_Init(struct fb_f1c100s_pdata_t * pdat){
struct f1c100s_debe_reg_t * debe = (struct f1c100s_debe_reg_t *)pdat->virtdebe;
//时钟与复位
S_BIT(CCU_BUS_CLK_GATING_REG1,12);
S_BIT(CCU_BUS_SOFT_RST_REG1,12);
//delay_ms(1);
//使能DEBE
//S_BIT((virtual_addr_t)&debe->mode,0); // 用这个方式也不能用 设置程序就挂掉
uint32_t val = read32((virtual_addr_t)&debe->mode);
val |= (1 << 0);
logout("debe->mode %d",val);
write32((virtual_addr_t)&debe->mode, val); // 用这个方式也不能用 设置程序就挂掉
// 背景颜色 //
write32((virtual_addr_t)&debe->backcolor, (0xef0017) );
write32((virtual_addr_t)&debe->disp_size, (((pdat->height) - 1) << 16) | (((pdat->width) - 1) << 0));
//设置层0参数
write32((virtual_addr_t)&debe->layer0_size, (((pdat->height) - 1) << 16) | (((pdat->width) - 1) << 0));
write32((virtual_addr_t)&debe->layer0_stride, ((pdat->width) << 4));//[RGB565=4][ARGB8888=5]
write32((virtual_addr_t)&debe->layer0_addr_low32b, (int32_t)(pdat->vram[0]) << 3);
write32((virtual_addr_t)&debe->layer0_addr_high4b, (int32_t)(pdat->vram[0]) >> 29);
write32((virtual_addr_t)&debe->layer0_attr1_ctrl, 0x5 << 8);//[RGB565=0x5][ARGB8888=0xA]
S_BIT((virtual_addr_t)&debe->mode,8);//层0使能
if((pdat->vram[1]!=0)&&(pdat->vram[0]!=pdat->vram[1])){
//设置层1参数
write32((virtual_addr_t)&debe->disp_size, (((pdat->height) - 1) << 16) | (((pdat->width) - 1) << 0));
write32((virtual_addr_t)&debe->layer1_size, (((pdat->height) - 1) << 16) | (((pdat->width) - 1) << 0));
write32((virtual_addr_t)&debe->layer1_stride, ((pdat->width) <<5));//[RGB565=4][ARGB8888=5]
write32((virtual_addr_t)&debe->layer1_addr_low32b, (int32_t)(pdat->vram[1]) << 3);
write32((virtual_addr_t)&debe->layer1_addr_high4b, (int32_t)(pdat->vram[1]) >> 29);
write32((virtual_addr_t)&debe->layer1_attr1_ctrl, 0x0A << 8);//[RGB565=0x5][ARGB8888=0xA]
S_BIT((virtual_addr_t)&debe->layer1_attr0_ctrl,10);//优先级
S_BIT((virtual_addr_t)&debe->layer1_attr0_ctrl,15);//1: select Pipe 1 需要透明叠加时需要输入不同管道
S_BIT((virtual_addr_t)&debe->mode,9);//层1使能
}
//加载
S_BIT((virtual_addr_t)&debe->reg_ctrl,0);
//DEBE 开始
S_BIT((virtual_addr_t)&debe->mode,1);
}
/*TCON初始化*/
void Tcon_Init(struct fb_f1c100s_pdata_t * pdat){
struct f1c100s_tcon_reg_t *tcon=((struct f1c100s_tcon_reg_t *)pdat->virttcon);
int val;
int bp, total;
/*设置VIDEO PLL时钟*/
C_BIT(CCU_Base_Address+0x010,31);
write32(CCU_Base_Address+0x010,((lcd_timing.n-1)<<8)|((lcd_timing.m-1)<<0)|(3<<24));
S_BIT(CCU_Base_Address+0x010,31);
//delay_ms(1);
/*设置TCON时钟与复位*/
S_BIT(CCU_BUS_CLK_GATING_REG1,4);
S_BIT(CCU_TCON_CLK_REG,31);
S_BIT(CCU_BUS_SOFT_RST_REG1,4);
//delay_ms(1);
/*TCON配置*/
C_BIT(TCON_Base_Address+0x40,0);
val = (lcd_timing.v_front_porch + lcd_timing.v_back_porch + lcd_timing.v_sync_len);
write32(TCON_Base_Address+0x40,(0x1 << 31) |(val & 0x1f) << 4);
//val = lcd_timing.f; // 5< DCLKDIV <96 时钟除数
val = get_video_pll_clk() / 32000000;
write32(TCON_Base_Address+0x44, (0xf << 28) | (val << 0));
/*设置宽高*/
write32((virtual_addr_t)&tcon->tcon0_timing_active, ((lcd_timing.width - 1) << 16) | ((lcd_timing.height - 1) << 0));
/*设置HT+HBP*/
bp = lcd_timing.h_sync_len + lcd_timing.h_back_porch;
total = (lcd_timing.width*lcd_timing.serial) + lcd_timing.h_front_porch + bp;
write32((virtual_addr_t)&tcon->tcon0_timing_h, ((total - 1) << 16) | ((bp - 1) << 0));
/*设置VT+VBP*/
bp = lcd_timing.v_sync_len + lcd_timing.v_back_porch;
total = lcd_timing.height + lcd_timing.v_front_porch + bp;
write32((virtual_addr_t)&tcon->tcon0_timing_v, ((total * 2) << 16) | ((bp - 1) << 0));
/*设置时钟宽度*/
write32((virtual_addr_t)&tcon->tcon0_timing_sync, ((lcd_timing.h_sync_len - 1) << 16) | ((lcd_timing.v_sync_len - 1) << 0));
/*设置RB交换-方便布线*/
#if 0
S_BIT(TCON_Base_Address+0x40,23);
#endif
/*设置模式*/
write32((virtual_addr_t)&tcon->tcon0_hv_intf, 0);
write32((virtual_addr_t)&tcon->tcon0_cpu_intf, 0);
//FRM
if(pdat->bits_per_pixel == 18 || pdat->bits_per_pixel == 16){
write32((virtual_addr_t)&tcon->tcon0_frm_seed[0], 0x11111111);
write32((virtual_addr_t)&tcon->tcon0_frm_seed[1], 0x11111111);
write32((virtual_addr_t)&tcon->tcon0_frm_seed[2], 0x11111111);
write32((virtual_addr_t)&tcon->tcon0_frm_seed[3], 0x11111111);
write32((virtual_addr_t)&tcon->tcon0_frm_seed[4], 0x11111111);
write32((virtual_addr_t)&tcon->tcon0_frm_seed[5], 0x11111111);
write32((virtual_addr_t)&tcon->tcon0_frm_table[0], 0x01010000);
write32((virtual_addr_t)&tcon->tcon0_frm_table[1], 0x15151111);
write32((virtual_addr_t)&tcon->tcon0_frm_table[2], 0x57575555);
write32((virtual_addr_t)&tcon->tcon0_frm_table[3], 0x7f7f7777);
write32((virtual_addr_t)&tcon->tcon0_frm_ctrl, (pdat->bits_per_pixel == 18) ? ((1 << 31) | (0 << 4)) : ((1 << 31) | (5 << 4)));
}
//极性控制
val = (1 << 28);
if(!lcd_timing.h_sync_active) val |= (1 << 25);
if(!lcd_timing.v_sync_active) val |= (1 << 24);
if(!lcd_timing.den_active) val |= (1 << 27);
if(!lcd_timing.clk_active) val |= (1 << 26);
write32((virtual_addr_t)&tcon->tcon0_io_polarity, val);
//触发控制关
write32((virtual_addr_t)&tcon->tcon0_io_tristate, 0);
}
/*关TCON时钟*/
void Tcon_Clk_Close(void){
C_BIT(CCU_BUS_CLK_GATING_REG1,4);
C_BIT(CCU_TCON_CLK_REG,31);
C_BIT(CCU_BUS_SOFT_RST_REG1,4);
}
/*关Debe时钟*/
void Debe_Clk_Close(void){
C_BIT(CCU_BUS_CLK_GATING_REG1,12);
C_BIT(CCU_BUS_SOFT_RST_REG1,12);
}
#define gate_clk_enable(virt, shift, invert) write32(virt, (read32(virt) & ~(0x1 << shift)) | ((invert ? 0x0 : 0x1) << shift))
#define gate_clk_disable(virt, shift, invert) write32(virt, (read32(virt) & ~(0x1 << shift)) | ((invert ? 0x1 : 0x0) << shift))
static void clk_divider_set_rate(virtual_addr_t virt, uint32_t width, uint32_t shift, bool onebased, uint64_t prate, uint64_t rate){
uint32_t mask = ((1 << (width)) - 1);
uint32_t div;
uint32_t val;
if(rate == 0)
rate = prate;
div = prate / rate;
if(onebased)
div--;
if(div > mask)
div = mask;
val = read32(virt);
val &= ~(mask << shift);
val |= div << shift;
write32(virt, val);
}
static void clk_mux_set_parent(virtual_addr_t virt, uint32_t width, uint32_t shift, uint32_t parent_val){
uint32_t val;
val = read32(virt);
val &= ~(((1 << width) - 1) << shift);
val |= parent_val << shift;
write32(virt, val);
}
/**
* @brief 开启DEFE时钟
* @param dev 设备指针
*/
inline static void f1c100s_clk_defe_enable(){
gate_clk_enable(F1C100S_CCU_BASE + CCU_DEFE_CLK, 31, false);
gate_clk_enable(F1C100S_CCU_BASE + CCU_BUS_CLK_GATE1, 14, false);
}
/**
* @brief 开启TCON时钟
*
* @param dev 设备指针
*/
inline static void f1c100s_clk_tcon_enable(){
gate_clk_enable(F1C100S_CCU_BASE + CCU_LCD_CLK, 31, false);
gate_clk_enable(F1C100S_CCU_BASE + CCU_BUS_CLK_GATE1, 4, false);
}
/**
* @brief 开启DEBE时钟
*
* @param dev 设备指针
*/
inline static void f1c100s_clk_debe_enable(){
gate_clk_enable(F1C100S_CCU_BASE + CCU_DEBE_CLK, 31, false);
gate_clk_enable(F1C100S_CCU_BASE + CCU_BUS_CLK_GATE1, 12, false);
}
/**
* @brief 初始化DEBE时钟
* @param dev
*/
static void f1c100s_clk_debe_init(){
clk_mux_set_parent(F1C100S_CCU_BASE + CCU_DEBE_CLK, 3, 24, 0);
// clk_divider_set_rate(F1C100S_CCU_BASE + CCU_DEBE_CLK, 4, 0, true, 24000000, 198000000);
clk_divider_set_rate(F1C100S_CCU_BASE + CCU_DEBE_CLK, 4, 0, true, 198000000, 198000000);
}
/**
* @brief 初始化DEF时钟
* @param dev 设备指针
*/
static void f1c100s_clk_defe_init(){
// 选择时钟源为 0b011
clk_mux_set_parent(F1C100S_CCU_BASE + CCU_DEFE_CLK, 3, 24, 0);
//clk_divider_set_rate(F1C100S_CCU_BASE + CCU_DEFE_CLK, 4, 0, true, 24000000, 198000000);
clk_divider_set_rate(F1C100S_CCU_BASE + CCU_DEFE_CLK, 4, 0, true, 198000000, 198000000);
}
/*tcon使能*/
void f1c100s_tcon_enable(struct fb_f1c100s_pdata_t * pdat){
struct f1c100s_tcon_reg_t * tcon = (struct f1c100s_tcon_reg_t *)pdat->virttcon;
uint32_t val;
val = read32((virtual_addr_t)&tcon->ctrl);
val |= (1 << 31);
write32((virtual_addr_t)&tcon->ctrl, val);
}
/*tcon失能*/
void f1c100s_tcon_disable(struct fb_f1c100s_pdata_t * pdat){
struct f1c100s_tcon_reg_t * tcon = (struct f1c100s_tcon_reg_t *)pdat->virttcon;
uint32_t val;
write32((virtual_addr_t)&tcon->ctrl, 0);
write32((virtual_addr_t)&tcon->int0, 0);
val = read32((virtual_addr_t)&tcon->tcon0_dclk);
val &= ~(0xf << 28);
write32((virtual_addr_t)&tcon->tcon0_dclk, val);
write32((virtual_addr_t)&tcon->tcon0_io_tristate, 0xffffffff);
write32((virtual_addr_t)&tcon->tcon1_io_tristate, 0xffffffff);
}
/*LCD配置*/
void F1C100S_LCD_Config(int width,int height,unsigned int *buff1,unsigned int *buff2){
int i;
lcd_pdat=&__lcd_pdat;
//设置地址
lcd_pdat->virtdebe = F1C100S_DEBE_BASE;
lcd_pdat->virttcon = F1C100S_TCON_BASE;
//LCD宽高
lcd_pdat->width = width;
lcd_pdat->height = height;
//像素位宽
lcd_pdat->bits_per_pixel = 18;
//设置缓存
lcd_pdat->vram[0] = buff1;
lcd_pdat->vram[1] = buff2;
f1c100s_clk_defe_enable();
f1c100s_clk_debe_enable();
f1c100s_clk_tcon_enable();
//清寄存器
for(i = 0x0800; i < 0x1000; i += 4)
write32(F1C100S_DEBE_BASE + i, 0);
f1c100s_clk_pll_video_set_enable(true);
f1c100s_clk_debe_init();
f1c100s_clk_defe_init();
//debe+tcon配置
f1c100s_tcon_disable(lcd_pdat);
Debe_Init(lcd_pdat);
Tcon_Init(lcd_pdat);
f1c100s_tcon_enable(lcd_pdat);
}
/* LCD IO初始化 */
void LCD_IO_Init(void){
int i=0;
for(i=18;i<=21;i++)gpio_set_config(GPIO_PORT_D,GPIO_PIN_0+i,IO_FUN_1,PULL_DISABLE);
for(i=1;i<=8;i++)gpio_set_config(GPIO_PORT_D,GPIO_PIN_0+i,IO_FUN_1,PULL_DISABLE);
for(i=10;i<=17;i++)gpio_set_config(GPIO_PORT_D,GPIO_PIN_0+i,IO_FUN_1,PULL_DISABLE);
}
/* LCD初始化 */
void F1C100S_LCD_Init(int width,int height,unsigned int *buff1,unsigned int *buff2){
// 多次初始化时要先关时钟
Tcon_Clk_Close();
Debe_Clk_Close();
LCD_IO_Init(); //IO初始化
F1C100S_LCD_Config(width,height,buff1,buff2);//TCON DEBE 初始化
}
1.成本上来说EA3036 0.7 - 1.5(不同量) 三个ASM1117 0.12-0.2(不同量)*3 而且EA3036 还需要配3个2.2uH的电感,还有3个电阻 不管是物料还是焊点都比ASM1117多不少。
2.易用性来说,坏一路电源 EA3036需要整个更换 ASM1117换对于的就好。
3.布局上 ASM1117可能更省事一些吧,不同路可以分开较远 也可以更紧凑。
基于以上三点我觉得ASM1117应该更可取才是呢?为什么好多都用EA3036呢?因为我做的几个板子都用的EA3036,没用过ASM1117,所以想咨询一下ASM1117 有什么弊端吗?还是说不能用,又或者是功耗的问题?
如果需要毫秒级的定时器的话 可以用rt_thread 的软件定时器
/* 定时器的控制块 */
static rt_timer_t timer1;
static int cnt = 0;
/**
* 定时器1超时函数 即回调
*
* @param parameter
*/
static void timeout1(void *parameter){
rt_kprintf("periodic timer is timeout %d\n", cnt);
/* 运行第10次,停止周期定时器 */
if (cnt++ >= 9){
rt_timer_stop(timer1);
rt_kprintf("periodic timer was stopped! \n");
}
}
/*
* 函数名:timer_sample(void)
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 函数作用: 创建一个软件定时器 如果需要更细的us 需要使用硬件定时器 直接调用 timer_sample();
*/
int timer_sample(void){
/* 创建定时器1 周期定时器 */
//单次定时RT_TIMER_FLAG_ONE_SHOT、周期定时RT_TIMER_FLAG_PERIODIC、 硬件模式RT_TIMER_FLAG_HARD_TIMER、软件模式RT_TIMER_FLAG_SOFT_TIMER;
//time 定时器的超时时间,单位是时钟节拍 这里是1ms 最小单位也是1ms 如果需要更细的us 需要使用硬件定时器
timer1 = rt_timer_create("timer1", timeout1,RT_NULL,1000,RT_TIMER_FLAG_PERIODIC);
/* 启动定时器1 */
if (timer1 != RT_NULL) rt_timer_start(timer1);
else rt_kprintf("timer1 error ! \n");
return 0;
}
直接在需要的地方调用 timer_sample 即可
懒得在嵌入式写校准的程序了,希望同型号屏幕下的电阻屏参数都一样吧!这样就把参数固定就好了,实话说就是 校准程序我不会写
写了一个根据5点校准法的计算参数的程序 里面有两种方法 一种来自xboot 一个来自安卓 里面txt有算法的函数和使用说明
我使用的结果来看 算法2是正确的 我的屏幕是 1024*600
依次
第1行是 LCD 屏幕的横坐标五个点
第2行是 LCD 屏幕的纵坐标五个点
第3行是 TP 点击对应点的横坐标五个点
第4行是 TP 点击对应点的纵坐标五个点
然后点击 计算即可 得到 7点参数 拿着这7个参数就可以用了
五点校准验算.zip
至于怎么知道LCD真正的坐标呢 我用LVGL在屏幕 在对应位置打了5个点
8.2.15. Display Inversion OFF (20h).............................................................................................. 105
8.2.16. Display Inversion ON (21h) ............................................................................................... 106艾,我也是栽这里
我的F1c100s 使用rgb 50pin 有一款屏幕正常 有一款白色显示黑色 整个反了过来 ,请问需要调整哪里?是fb 么 还是调屏幕硬件?
系统 RTThread
芯片 F1C100S
使用 drv_pwm 驱动
代码如下
//gpio_set_func(BKPWM,IO_FUN_3); // PE6 pwm1 设置为PWM 模式
//gpio_set_func(PWM0,IO_FUN_3); // PA2设置为PWM 模式
/************************* 设置 pwm1 通道 开始 ************************** /
rt_uint32_t period, pulse;
period = 500000; // 周期为0.5ms,单位为纳秒ns
pulse = 5000; // PWM脉冲宽度值,单位为纳秒ns
// 查找设备
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
if (pwm_dev == RT_NULL){
rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
return RT_ERROR;
}
// 设置PWM周期和脉冲宽度
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); //PWM_DEV_CHANNEL 1 period 500000 pulse 5000
// 使能设备
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
rt_kprintf("%s run success! \n", PWM_DEV_NAME);
/************************* 设置 pwm1 通道 结束 **************************/
烧录后 pwm 初始化是成功的 也能找到这个设备 但是IO没有反应 一直是高电平
后来使用 直接写寄存器的方式 也不行 这个代码摘自 https://github.com/nminaylov/F1C100s_projects/tree/master 的逻辑程序
gpio_set_func(BKPWM,IO_FUN_3);
gpio_set_pull_mode(BKPWM,PULL_DISABLE);
pwm_init(PWM1, PWM_MODE_CONTINUOUS, 1, PWM_PSC_120); // 24M / 120 = 200kHz
pwm_set_period(PWM1, LED_PWM_PERIOD); // 200k / 200 = 1kHz
pwm_set_pulse_len(PWM1, 30);
pwm_enable(PWM1);
应用层通过/sys/class/gpio文件操作gpio口
不需要写驱动 不需要改设备树 不需要了解寄存器
本来想做一个LED 翻转效果的,就是在读取灯亮的时候灭灯,灭灯的时候亮灯的
结果发现在设置IO为in的时候,GPIO给拉低了造成读一直是0,实现不了想要的效果了
但是我在终端敲命令 echo in > /sys/class/gpio/gpio137/direction 设置为输入模式就不会拉低
不知道为啥
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#define SYSFS_GPIO_DIR "/sys/class/gpio"
#define MAX_BUF 64
//#define BOARD_SSD201
//uart device name
#ifdef BOARD_SSD201
#define LED_GPIO 85 //PAD_GPIO85 =》 SSD201
#else
#define LED_GPIO 137 //#define LED0 GPIO_PORT_E,GPIO_PIN_9 (A0 B1 C2 D3 E4 F5)=> PE9 = 32*4+9=137 F1C100S
#endif
/**
* function: gpio export
*/
int ss_gpio_export(unsigned int gpio){
int fd, len;
char buf[MAX_BUF];
fd = open(SYSFS_GPIO_DIR "/export", O_WRONLY);
if (fd < 0) {
perror("gpio/export");
return fd;
}
len = snprintf(buf, sizeof(buf), "%d", gpio);
write(fd, buf, len);
close(fd);
return 0;
}
/**
* function: gpio unexport
*/
int ss_gpio_unexport(unsigned int gpio){
int fd, len;
char buf[MAX_BUF];
fd = open(SYSFS_GPIO_DIR "/unexport", O_WRONLY);
if (fd < 0) {
perror("gpio/export");
return fd;
}
len = snprintf(buf, sizeof(buf), "%d", gpio);
write(fd, buf, len);
close(fd);
return 0;
}
/**
* function: gpio set direction
* parameter: out_flag = 1 -- out
* out_flag = 0 -- in
*/
int ss_gpio_set_dir(unsigned int gpio, unsigned int out_flag){
int fd;
char buf[MAX_BUF];
snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/direction", gpio);
fd = open(buf, O_WRONLY);
if (fd < 0) {
perror("gpio/direction");
return fd;
}
if (out_flag)
write(fd, "out", 4);
else
write(fd, "in", 3);
close(fd);
return 0;
}
/**
* function: gpio set value
* parameter: value = 1 -- high
* value = 0 -- low
*/
int ss_gpio_set_value(unsigned int gpio, unsigned int value){
int fd;
char buf[MAX_BUF];
snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
fd = open(buf, O_WRONLY);
if (fd < 0) {
perror("gpio/set-value");
return fd;
}
if (value)
write(fd, "1", 2);
else
write(fd, "0", 2);
close(fd);
return 0;
}
/**
* function: gpio get value
*/
int ss_gpio_get_value(unsigned int gpio, unsigned int *value){
int fd;
char buf[MAX_BUF];
char ch;
snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
fd = open(buf, O_RDONLY);
if (fd < 0) {
perror("gpio/get-value");
return fd;
}
read(fd, &ch, 1);
if (ch != '0') {
*value = 1;
} else {
*value = 0;
}
close(fd);
return 0;
}
/**
* function: gpio_set edge
* parameter: edge = "none", "rising", "falling", "both"
*/
int ss_gpio_set_edge(unsigned int gpio, char *edge){
int fd;
char buf[MAX_BUF];
snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/edge", gpio);
fd = open(buf, O_WRONLY);
if (fd < 0) {
perror("gpio/set-edge");
return fd;
}
write(fd, edge, strlen(edge) + 1);
close(fd);
return 0;
}
/**
* function: gpio open fd
*/
int ss_gpio_open(unsigned int gpio){
int fd;
char buf[MAX_BUF];
snprintf(buf, sizeof(buf), SYSFS_GPIO_DIR "/gpio%d/value", gpio);
fd = open(buf, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
perror("gpio/fd_open");
}
return fd;
}
/**
* function: gpio close fd
*/
int ss_gpio_close(int fd){
return close(fd);
}
void led_switch(){
int value = 0;
ss_gpio_export(LED_GPIO); //
ss_gpio_set_dir(LED_GPIO, 0);// 不能通过读取IO值,因为设置读会拉低IO
ss_gpio_get_value(LED_GPIO, &value);
printf("gpio[%d] value = %d\n", LED_GPIO, value);
ss_gpio_set_dir(LED_GPIO, 1);// set LEDIO putput
if(value == 0){
ss_gpio_set_value(LED_GPIO, 1);
}else{
ss_gpio_set_value(LED_GPIO, 0);
}
ss_gpio_unexport(LED_GPIO);
}
#if 1
int main(int argc, char *argv[]){
int fd = -1, value = 0;
if (argc < 2){
printf("eg:./gpio_main input\n");
printf("eg:./gpio_main output 1\n");
return -1;
}
ss_gpio_export(LED_GPIO);
if (!strcmp(argv[1], "input")){
ss_gpio_set_dir(LED_GPIO, 0);// set input then pin low ??
ss_gpio_get_value(LED_GPIO, &value);
printf("gpio[%d] value = %d\n", LED_GPIO, value);
}else if (!strcmp(argv[1], "output")){
if (argc < 3){
ss_gpio_unexport(LED_GPIO);
return -1;
}
value = atoi(argv[2]);
ss_gpio_set_dir(LED_GPIO, 1);
ss_gpio_set_value(LED_GPIO, value);
}else{
printf("unknown commamd\n");
}
ss_gpio_unexport(LED_GPIO);
// led_switch();
return 0;
}
#endif
全志的 v85x, 或者瑞芯微的 rv110x等等,价格敢和100S比一下吗?
之前打算用F1C100S做1024*600的大屏项目,不过需要竖屏使用,RGB屏幕实在找不到竖屏,滑动的时候 lvgl 帧率掉到10以下,团队的人完美主义犯了,觉得接受不了,换了贵了一倍的SSD201,现在用mipi, 软件旋转lvgl 稳定在30帧了,估计加上硬件旋转或者硬件加速有提升,或者直接上mipi竖屏 妥妥的60帧,至于为什么不选差不多价格的D1S呢,全志的资料太难找了,不过要是做横屏 低成本的案子,F1C100S 还是值得选择的,RTThread 坑差不多踩完了
# kill -9 902
# mount /dev/sda1 /usr/usbfold/
# cd /usr/usbfold/
# ls
app libg726.so libmi_disp.so libmi_vdec.so
demo83 libjpeg.so libmi_divp.so libmi_venc.so
demossd libjpeg.so.7 libmi_gfx.so libmi_wlan.so
libCReader.so libjpeg.so.7.0.0 libmi_hdmi.so libz.so
libDSpotter.so libmi_ai.so libmi_panel.so libz.so.1
libcjson.so libmi_ao.so libmi_rgn.so libz.so.1.2.2
libg711.so libmi_common.so libmi_sys.so
# ./demossd
client [945] connected, module:sys
DISP width: 1024,height: 600
client [945] connected, module:disp
[MI WRN ]: MI_DISP_IMPL_BindVideoLayer[4233]: VideoLayer:0 is binded
[MI WRN ]: MI_DISP_IMPL_EnableVideoLayer[3742]: VideoLayer:0 is enabled
client [945] connected, module:panel
_HalPnlIfGetInfoParamConfig 471, LinkType is not Correct (MIPI_DSI != TTL)
_DrvPnlIfExecuteQuery 609, Query:PARAM, Ret:RET_CFGERR
[MI ERR ]: MI_PANEL_IMPL_SetPanelParam[958]: mi panel set panel param failed
[MI_PANEL_Init][294]LCD environment is Invalid
init_ssd20x_disp 155 52
xres: 1024,yres: 600,line_length: 4096,eFbColorFmt: 5 finfo.smem_start = 43126784 finfo.smem_len = 4194304
The evdev device was opened successfully.
client [945] disconnected, module:panel
client [945] disconnected, module:disp
client [945] disconnected, module:sys
[MI ERR ]: MI_SYS_IMPL_Exit[3821]: gSysInitCount:2
Segmentation fault
#
我启动显示一下就死机了 client [945] disconnected 不知道咋回事
我更新了一下 boot的 代码 在burn 路径下的f1c100s_spl_sd_nor_nand_uart1 文件夹,这是boot源码,编译一下就好了 我添加了SD卡驱动 nand flash 驱动
我将nor flash 驱动的spi 速率 降到50M了,nor flash 可以成功启动了,nand flash 的话 boot和读flash是OK的,现在卡在烧录的问题上了,烧录boot会清空rtt 烧录rtt会清空boot,如果想看boot 只烧录boo他就可以看到串口1打印日志,如果像切换串口0,里面有介绍文档
@tangloong
用大佬xboot做的xfel可以识别nand的 https://whycan.com/t_7323.html
你是否尝试过 xfel 写nand flash 的 boot和rtthread.bin
我的boot添加了nand flash 驱动,可以读取nand flash了,现在有个奇怪的问题是boot 和 RTT 不能同时写
写了boot在写rtt 0-1M的空间会被擦除,如果在写一次boot 1M后的空间被擦除了,搞得只能在flash存一个bin
用xfel刷写spinand倒是能引导,xboot里面也有spinand的启动函数和自拷贝函数。单从xboot引导我倒是成功了,就是触摸一直用不了
终于成功了 估计是读取spi不稳定的原因 多次出现 Magic error 也就是头部的几个地址数据不正确 只有2857740885 这个是正常的 复位几次蔡成功
我估计需要把spi的频率调低才行 现在是100M
Init OK
Boot to SPI mode
4294967295
Magic error
Init OK
Boot to SPI mode
4294967295
Magic error
Init OK
Boot to SPI mode
4294967295
Magic error
Init OK
Boot to SPI mode
4294967295
Magic error
Init OK
Boot to SPI mode
4294967295
Magic error
Init OK
Boot to SPI mode
2857740885
Copy Flash offset 64 to RAM 0x8000000 size:2505724
Copy Flash Ok!
Goto 0x80000000 ...
锟斤拷'锟絠nitialize rti_board_start:0 done
initialize rt_hw_spi_init:0 done
initialize rt_hw_wdt_initwatchdog_init
:0 done
\ | /
- RT - Thread Operating System
/ | \ 4.0.3 build May 17 2023
2006 - 2020 Copyright by rt-thread team
do components initialization.
initialize rti_board_end:0 done
initialize rt_hw_spi_flash_with_sfud_init[32m[I/SFUD] Find a Winbond flash chip. Size is 16777216 bytes.[0m
[32m[I/SFUD] gd25qxx flash device is initialize success.[0m
[32m[I/SFUD] Probe SPI flash gd25qxx by SPI device spi00 success.[0m
:0 done
initialize dfs_init:0 done
initialize rt_mmcsd_core_init:0 done
initialize rt_hw_lcd_init:0 done
initialize rt_hw_gpio_init:0 done
initialize rt_hw_i2c_init[32m[I/I2C] I2C bus [i2c0] registered[0m
:0 done
initialize gt9xx_driver_registeri2c test failed attempt 1: 200i2c test failed attempt 2: 200[TP] gt9xx_probe goodix_i2c_test! error
:0 done
initialize rt_work_sys_workqueue_init:0 done
initialize clock_time_system_init:0 done
initialize pthread_system_init:0 done
initialize libc_system_init:0 done
initialize sal_init[32m[I/sal.skt] Socket Abstraction Layer initialize success.[0m
:0 done
initialize cplusplus_system_init:0 done
initialize rt_i2c_core_init:0 done
initialize tina_sdio_init:0 done
initialize main_page_initclk_divider_set_rate 29491216 198000000 0clk_divider_set_rate -2147483648 198000000 0:0 done
initialize finsh_system_init:0 done
periph_get_pll_clk:600000000
cpu_get_clk:408000000
ahb_get_clk:200000000
apb_get_clk:100000000
msh />initialize rti_board_start:0 done
initialize rt_hw_spi_init:0 done
initialize rt_hw_wdt_initwatchdog_init
:0 done
\ | /
- RT - Thread Operating System
/ | \ 4.0.3 build May 17 2023
2006 - 2020 Copyright by rt-thread team
do components initialization.
initialize rti_board_end:0 done
initialize rt_hw_spi_flash_with_sfud_init[32m[I/SFUD] Find a Winbond flash chip. Size is 16777216 bytes.[0m
[32m[I/SFUD] gd25qxx flash device is initialize success.[0m
[32m[I/SFUD] Probe SPI flash gd25qxx by SPI device spi00 success.[0m
:0 done
initialize dfs_init:0 done
initialize rt_mmcsd_core_init:0 done
initialize rt_hw_lcd_init:0 done
initialize rt_hw_gpio_init:0 done
initialize rt_hw_i2c_init[32m[I/I2C] I2C bus [i2c0] registered[0m
:0 done
initialize gt9xx_driver_registeri2c test failed attempt 1: 200i2c test failed attempt 2: 200[TP] gt9xx_probe goodix_i2c_test! error
:0 done
initialize rt_work_sys_workqueue_init:0 done
initialize clock_time_system_init:0 done
initialize pthread_system_init:0 done
initialize libc_system_init:0 done
initialize sal_init[32m[I/sal.skt] Socket Abstraction Layer initialize success.[0m
:0 done
initialize cplusplus_system_init:0 done
initialize rt_i2c_core_init:0 done
initialize tina_sdio_init:0 done
initialize main_page_initclk_divider_set_rate 29491216 198000000 0clk_divider_set_rate -2147483648 198000000 0:0 done
initialize finsh_system_init:0 done
periph_get_pll_clk:600000000
cpu_get_clk:408000000
ahb_get_clk:200000000
apb_get_clk:100000000
msh />
Lvgl8.2,一样的问题,大家有解决吗,709691151@qq.com
这里放开定义:启用竖屏
https://gitee.com/kasira/f1c200s_rtt_lvgl830/blob/master/applications/lv_conf.h
//#define LV_VERTICAL_DISPLAY // 定义竖屏显示 但是软件转换影响性能 最好能找到竖屏
// 这里配置 sw_rotate 和 rotated
https://gitee.com/kasira/f1c200s_rtt_lvgl830/blob/master/applications/lv_port_disp.c
#if defined LV_VERTICAL_DISPLAY
disp_drv.sw_rotate = 1; // add for rotation
disp_drv.rotated = LV_DISP_ROT_90; // add for rotation
#endif
如果显示不全的话 使用 LV_DISP_ROT_270 这个可以显示全 或者修改 338行
if (area->x2 < 0 || area->y2 < 0 || area->x1 > hres - 1 || area->y1 > vres - 1){
lv_disp_flush_ready(disp_drv);
return;
}
将x y 调换一下
我是调成功了的
楼主能分享下工程代码吗
@tangloong
大佬,你贴的百度云链接里面的固件触摸可以用吗?我在ram运行以后触摸点不起来,用的GT911,和你是同款板子
https://gitee.com/kasira/f1c200s_rtt_lvgl830 我把我的工程 提交到gitee了,编译的bin文件我一并提交了,你可以直接使用burn里面的bat 执行烧录
串口信息会打印触摸的坐标
@adigita
我发现不是boot 和 应用不行,原来是sunxi-fel 不认识板子上的1G flash
ubuntu18@ubuntu:~/Workspace/F1C200S/RTOS/f1c100s_rt-thread/tools/sunxi-tools$ ./sunxi-fel spiflash-info
ERROR: You don't have permission to access Allwinner USB FEL device
ubuntu18@ubuntu:~/Workspace/F1C200S/RTOS/f1c100s_rt-thread/tools/sunxi-tools$ sudo ./sunxi-fel spiflash-info
Manufacturer: Unknown (00h), model: C8h, size: 131072 bytes.
ubuntu18@ubuntu:~/Workspace/F1C200S/RTOS/f1c100s_rt-thread/tools/sunxi-tools$ sudo ./sunxi-fel spiflash-info
Manufacturer: Unknown (00h), model: EFh, size: 1024 bytes.
ubuntu18@ubuntu:~/Workspace/F1C200S/RTOS/f1c100s_rt-thread/tools/sunxi-tools$
我试了两块板子 都是1G的 读出来的容量都不对
正常人家读16MFlash 是这样的
如果MPi-R板背面是Winbond的W25Q128(16MB nor flash),那么就要用fel刷机。
查看芯片信息sunxi-fel ver
AWUSBFEX soc=00001663(F1C100s) 00000001 ver=0001 44 08 scratchpad=00007e00 00000000 00000000
显示spiflash的信息sunxi-fel spiflash-info
Manufacturer: Winbond (EFh), model: 40h, size: 16777216 bytes.
大佬 ,我手头也有同样的开发板 ,贴的也是nandflash,有办法通过nandflash启动RTT的生成的BIN么?我看坑网里大佬们分享的有基于Linux的支持nand的方法
试一下这个帖子的方法吧
https://whycan.com/p_89372.html#p89372
下载的工具我上传到网盘里了,有兴趣可以研究一下,反正我没成功 链接:https://pan.baidu.com/s/1H4btWD7jokvOQWa7nmcFhQ
提取码:hoke
链接: https://pan.baidu.com/s/1QVp65GaXa-v_Rmq_EEg2AQ 提取码: qvjq 复制这段内容后打开百度网盘手机App,操作更方便哦
这个是我做的一个烧录ram的 你双击bat就可以烧录了 前提是装好驱动啥的 rtt.bin 不一定显示 我也不知道是啥时候的版本了
楼主能否详细讲解一下,如何在main.c里面添加一个LVGL自带的demo程序(或者最简单的GUI程序)吗?我只会单片机裸机开发,不懂RT系统。。。
我可以根据你讲解的demo例程,依葫芦画瓢的学习一下。
谢谢
想要跑一个完整的 LVGL显示出来 还是很多工作要做的 包括跟F1C200S的显示驱动配置,LVGL flush数据到显示缓冲区等 这些都完成后再main.c 或者自建文件都可以,例如我写的例子:
#include "rtthread.h"
#include "drv_clock.h"
#include <lvgl.h>
#include "drv_touch.h"
#include "lv_port_disp.h"
int main(int argc, char **argv)
{
rt_kprintf("periph_get_pll_clk:%d\n", periph_get_pll_clk());
rt_kprintf("cpu_get_clk:%d\n", cpu_get_clk());
rt_kprintf("ahb_get_clk:%d\n", ahb_get_clk());
rt_kprintf("apb_get_clk:%d\n", apb_get_clk());
return 0;
}
// lvgl 测试控件
void lv_border_style_test(){
static lv_style_t style;
lv_style_init(&style); // 初始化样式
lv_style_reset(&style); // 重置样式
lv_style_set_radius(&style, 10); // 设置样式圆角弧度
lv_style_set_bg_opa(&style, LV_OPA_COVER); // 设置样式背景的透明度,不透明
lv_style_set_bg_color(&style, lv_palette_lighten(LV_PALETTE_RED, 1)); // 设置样式的背景色为淡红色
lv_style_set_border_color(&style, lv_color_black()); // 设置样式边框颜色为黑色
lv_style_set_border_width(&style, 5); // 设置边框宽度
lv_style_set_border_opa(&style, LV_OPA_50); // 设置边框透明度
// 设置边框范围顶部、底部、右边、左边
lv_style_set_border_side(&style, LV_BORDER_SIDE_TOP | LV_BORDER_SIDE_BOTTOM | LV_BORDER_SIDE_RIGHT | LV_BORDER_SIDE_LEFT);
lv_obj_t * obj = lv_obj_create(lv_scr_act()); // 基于屏幕创建对象
if (obj != NULL){
lv_obj_add_style(obj, &style, 0); // 给对象添加样式
lv_obj_set_size(obj, 200, 200);
lv_obj_center(obj); // 对象居中显示
}
}
//任务内容
static void lvgl_thread(void *parameter){
lv_init(); //LVGL 初始化
lv_port_disp_init(); //LVGL 显示初始化 需要去做配置
//lv_demo_widgets();
lv_border_style_test(); // 运行demo
rt_kprintf("\n ui_init \n");
while (1){
lv_task_handler(); //周期性调用事务处理器
rt_thread_mdelay(1);
}
}
// 初始化创建一个任务
static int lvgl_demo_init(void){
rt_thread_t tid;
tid = rt_thread_create("LVGL", lvgl_thread, RT_NULL, 4096,10, 10); //创建一个任务
if (tid == RT_NULL){
rt_kprintf("Fail to create 'LVGL' thread\n");
}
rt_thread_startup(tid);// 启动任务
return 0;
}
INIT_APP_EXPORT(lvgl_demo_init); //应用自动初始化 可以放在任意文件下 RTT 上电后会按顺序加载
编译烧录 串口打印一下内容就成功了 lvgl_demo_init 出现这个表示加载了demo ui_init 表示执行到了
[09:15:33.547]收←◆initialize rti_board_start:0 done
initialize rt_hw_spi_init:0 done
\ | /
- RT - Thread Operating System
/ | \ 4.1.0 build Apr 26 2023 08:59:55
2006 - 2022 Copyright by RT-Thread team
do components initialization.
initialize rti_board_end:0 done
initialize rt_mmcsd_core_init:0 done
initialize dfs_init:0 done
initialize rt_hw_spi_flash_with_sfud_init[33m[W/SFUD] [SFUD] Warning: The OS tick(100) is less than 1000. So the flash write will take more time.[0m
[32m[I/SFUD] Warning: Read SFDP parameter header information failed. The gd25qxx is not support JEDEC SFDP.[0m
[32m[I/SFUD] Warning: This flash device is not found or not support.[0m
[32m[I/SFUD] Error: gd25qxx flash device is initialize fail.[0m
[31m[E/SFUD] ERROR: SPI flash probe failed by SPI device spi00.[0m
:1 done
initialize rt_hw_lcd_init:0 done
initialize rt_hw_gpio_init:0 done
initialize elm_init:0 done
initialize lvgl_thread_init:0 done
initialize finsh_system_init:0 done
initialize tina_sdio_init:0 done
initialize lvgl_demo_init:0 done
periph_get_pll_clk:600000000
cpu_get_clk:408000000
ahb_get_clk:200000000
apb_get_clk:100000000
clk_divider_set_rate 29491216 198000000 0clk_divider_set_rate 2147024424 198000000 0
ui_init
[09:15:33.814]收←◆msh />
[09:15:34.157]收←◆[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 8 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 5 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 55 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
[31m[E/MMC] [err]:0x00000100, RTO[0m
[31m[E/MMC] mmc cmd 1 err[0m
显示效果
Schematic_F1C200S_2023-04-25.pdf
原理图
摆好元器件了 准备开始连连看了
[09:02:29.387]收
\ | /
- RT - Thread Operating System
/ | \ 4.1.0 build Apr 13 2023 04:35:43
2006 - 2022 Copyright by RT-Thread team
[33m[W/SFUD] [SFUD] Warning: The OS tick(100) is less than 1000. So the flash write will take more time.[0m
[32m[I/SFUD] Warning: Read SFDP parameter header information failed. The gd25qxx is not support JEDEC SFDP.[0m
[32m[I/SFUD] Warning: This flash device is not found or not support.[0m
[32m[I/SFUD] Error: gd25qxx flash device is initialize fail.[0m
[31m[E/SFUD] ERROR: SPI flash probe failed by SPI device spi00.[0m
periph_get_pll_clk:600000000
cpu_get_clk:408000000
ahb_get_clk:200000000
apb_get_clk:100000000
msh />(dev != RT_NULL) assertion failed at function:rt_dev
当编译烧录 后是这样的话 就证明成功了
接下来 说说我改的配置 rtconfig.h
添加
#define RT_DEBUG_INIT 1 //开启debug模式时:该宏定义为0时表示关闭打印组件初始化信息,定义为1时表示启用
#define RT_DEBUG_THREAD 0 //开启debug模式时:该宏定义为0时表示关闭打印线程切换信息,定义为1时表示启用
#define TINA_USING_LCD // 开启使用LCD 初始化fb
#define LV_MEM_DYNAMIC
#define LV_HOR_RES 1024 // 屏幕尺寸
#define LV_VER_RES 600 // 屏幕尺寸
#define LV_DPI 50
#define TINA_USING_UART1 // 因为我开发板用的串口1 而系统默认的串口0 所以我需要加
修改
#define RT_CONSOLE_DEVICE_NAME "uart1" // 因为我开发板用的串口1 而系统默认的串口0 所以我需要改
//#define TINA_USING_SPI1 // 这个是因为我的开发板 开了这个不能启动 但是调了好久 才发现要屏蔽他 其他开发板不知道要不要改