# 点屏之SPI屏 ili9488
ili9488常用于480x320高清小屏应用。支持8080 8/16并行总线,3/4线SPI接口。
驱动手册在此下载:https://pan.baidu.com/s/1pLZchuF
这里以4线SPI驱动讲解。
## 设备树修改
~~~
&spi0 {
status = "okay";
ili9488@0 {
compatible = "ilitek,ili9488";
reg = <0>;
spi-max-frequency = <50000000>;
rotate = <270>;
fps = <30>;
buswidth = <8>;
regwidth = <8>;
reset-gpios = <&pio 1 7 GPIO_ACTIVE_LOW>;
dc-gpios = <&pio 1 5 GPIO_ACTIVE_LOW>;
debug = <0>;
};
};
~~~
## 代码修改
因为ili9486手册内容类似9488,所以拷贝一份命名为fb_ili9488.c,并在Kconfig和Makefile中增加对应项目。
编译后下载,开机,发现全屏间隔显示灰度条纹,且执行fbv命令显示内容无任何改变。
![](https://box.kancloud.cn/1088f9b941217b2544d6267fa8b513cc_766x1024.jpg)
这说明9488还是不兼容9486。
通过对初始化命令的调试发现,是0x3a指令的问题。
虽然寄存器列表中有16bit命令,但是实际上是不支持的。
切换到18bit指令:
![](https://box.kancloud.cn/8bc3e422513d93bfb5256e8e4d6c70e2_1920x1436.jpg)
可见可以看到图像内容,且显示区域只有2/3高度,推测是cpu端以16bit输出,屏幕以18bit(补全后为3byte 24bit)解析导致。
查看fbtft-core.c代码,发现确实只实现了16bit 565的方法。
所以我们需要增加666的显示方法。
### 新增666显示
#### 初始化序列
~~~
static const s16 default_init_sequence[] = {
/* Interface Mode Control */
-1, 0xb0, 0x0,
-1, MIPI_DCS_EXIT_SLEEP_MODE,
-2, 250,
/* Interface Pixel Format */
-1, MIPI_DCS_SET_PIXEL_FORMAT, 0x66,
/* Power Control 3 */
-1, 0xC2, 0x44,
/* VCOM Control 1 */
-1, 0xC5, 0x00, 0x00, 0x00, 0x00,
-1, MIPI_DCS_EXIT_SLEEP_MODE,
-1, MIPI_DCS_SET_DISPLAY_ON,
/* end marker */
-3
};
~~~
#### fbtft-core
fbtft_framebuffer_alloc
这个函数只为RGB565编写,所以需要修改
这里只考虑了bpp=8和16的情况
~~~
vmem_size = display->width * display->height * bpp / 8;
info->fix.line_length = width * bpp / 8;
~~~
修改为
~~~
int byteperpix = ( bpp + 7 ) / 8;
vmem_size = display->width * display->height * byteperpix;
info->fix.line_length = width * byteperpix;
~~~
同时在9488的文件里也加上bpp信息为24bit。 (因为fb只支持8,16,24,32)
下面这段只考虑了565排序,
~~~
/* RGB565 */
info->var.red.offset = 11;
info->var.red.length = 5;
info->var.green.offset = 5;
info->var.green.length = 6;
info->var.blue.offset = 0;
info->var.blue.length = 5;
info->var.transp.offset = 0;
info->var.transp.length = 0;
~~~
幸好后面可以使用自己的驱动覆盖:
~~~
fbtft_merge_fbtftops(&par->fbtftops, &display->fbtftops);
~~~
所以在9488文件中修改set_var:
注意这里的var只影响mplayer等软件的颜色。
fbv等软件的颜色受dts里的bgr影响。
~~~
par->info->var.red.offset = 16;
par->info->var.red.length = 8;
par->info->var.green.offset = 8;
par->info->var.green.length = 8;
par->info->var.blue.offset = 0;
par->info->var.blue.length = 8;
~~~
#### 增加write_vmem方法
~~~
/* 18/24 bit pixel over 8-bit databus */
int fbtft_write_vmem24_bus8(struct fbtft_par *par, size_t offset, size_t len)
{
u8 *vmem8;
u8 *txbuf8 = par->txbuf.buf;
size_t remain;
size_t to_copy;
size_t tx_array_size;
int i;
int ret = 0;
size_t startbyte_size = 0;
fbtft_par_dbg(DEBUG_WRITE_VMEM, par, "%s(offset=%zu, len=%zu)\n",
__func__, offset, len);
remain = len / 3;
vmem8 = (u8 *)(par->info->screen_buffer + offset);
if (par->gpio.dc != -1)
gpio_set_value(par->gpio.dc, 1);
/* non buffered write */
if (!par->txbuf.buf)
return par->fbtftops.write(par, vmem8, len);
/* buffered write, /4*4 to faster */
tx_array_size = par->txbuf.len / 3 / 4 *4;
if (par->startbyte) {
txbuf8 = par->txbuf.buf + 1;
tx_array_size -= 1;
*(u8 *)(par->txbuf.buf) = par->startbyte | 0x2;
startbyte_size = 1;
}
while (remain) {
to_copy = min(tx_array_size, remain);
dev_dbg(par->info->device, " to_copy=%zu, remain=%zu\n",
to_copy, remain - to_copy);
for (i = 0; i < to_copy/4; i++)
{ //faster copy
*(u32*)(txbuf8+i*12) = *(u32*)(vmem8+i*12);
*(u32*)(txbuf8+4+i*12) = *(u32*)(vmem8+4+i*12);
*(u32*)(txbuf8+8+i*12) = *(u32*)(vmem8+8+i*12);
}
for(i = to_copy/4*4; i < to_copy; i++)
{
txbuf8[i*3] = vmem8[i*3];
txbuf8[i*3+1] = vmem8[i*3+1];
txbuf8[i*3+2] = vmem8[i*3+2];
}
vmem8 = vmem8 + to_copy*3;
ret = par->fbtftops.write(par, par->txbuf.buf,
startbyte_size + to_copy * 3);
if (ret < 0)
return ret;
remain -= to_copy;
}
return ret;
}
EXPORT_SYMBOL(fbtft_write_vmem24_bus8);
~~~
然后在9488的文件里修改为:
~~~
static struct fbtft_display display = {
.regwidth = 8,
.width = WIDTH,
.height = HEIGHT,
.bpp = BPP,
.init_sequence = default_init_sequence,
.fbtftops = {
.set_addr_win = set_addr_win,
.set_var = set_var,
.write_vmem = fbtft_write_vmem24_bus8,
},
};
~~~
## 编译运行
显示效果如下:
![](https://box.kancloud.cn/b8d7b7ab59bc6b0bea9a06b29c27b048_1024x766.jpg)
播放视频效果如下:
http://v.youku.com/v_show/id_XMzM5OTAyNjY5Mg==.html
视频中使用50MHz spi时钟,会显卡顿和撕裂。
实测60MHz以上时钟可以流畅播放,但是由于杜邦线过长,会出现水波纹,如果在实际产品中使用较短走线和地包围,应该没有问题。
- 前言
- 荔枝派TODO任务领取
- linux使用小贴士
- 入门篇
- 板卡介绍
- 开箱指南
- 烧录启动系统
- 联网方法
- 镜像使用
- 镜像说明
- buildroot系统使用
- debian系统使用
- 外设操作
- 外设操作概览
- 低速外设
- GPIO
- GPIO模拟低速接口
- UART
- PWM
- I2C
- SPI
- 高速接口
- SDIO
- USB
- EtherNet
- DVP CSI
- MIPI CSI
- 模拟外设
- CODEC
- LRADC
- 常见设备驱动
- USB摄像头
- USB 3G/4G 网卡
- 舵机
- 开发篇
- UBOOT适配
- UBOOT编译
- UBOOT配置
- UBOOT配置屏幕分辨率
- UBOOT配置SPI启动
- Linux内核开发
- Linux内核编译
- BSP Linux内核编译.md
- Linux内核选项
- 外设驱动与设备树
- RTL8723BS驱动
- 根文件系统定制
- buildroot定制系统
- buildroot添加软件包
- openwrt定制系统
- emdebian定制系统
- camdriod开发
- camdriod编译
- 主线Uboot引导Camdriod
- 系统镜像打包
- XBOOT适配
- 荔枝运行XBOOT
- 应用篇
- 游戏机-基于EmulationStation
- 游戏机-gnuboy
- 语音识别-科大讯飞云
- GUI-QT5
- 语音识别-离线关键词识别
- 路由器-Lichee Zero
- 投稿文章
- 荔枝派Zero开箱指南
- Zero i2c oled使用指南
- zero SPI LCD使用指南
- Zero u-boot编译和使用指南
- TF WiFi使用方法
- Zero Ethernet使用指南
- Zero 移植Qt5.4.1
- ZeroSpiNorFlash启动系统制作指南
- Visio-uboot-sunxi流程
- lichee 编译踩坑记录(ilichee ZERO)
- lichee_zero_外设GPIO接口
- TF WIFI 小白编
- 从零开始LicheePi Zero的开发
- 认识Zero的硬件
- 搭建Zero的开发环境
- 主线Uboot
- 主线kernel
- BSP kernel
- BSP内核启动
- bsp内核的摄像头使用
- BSP内核中的保留内存
- uboot启动BSP内核常见错误
- BSP内核 FBTFT移植
- BSP内核启动错误及警告解决
- buildroot 根文件系统
- emdebian 根文件系统
- SPI Flash 系统编译
- sunxi-fel增加对16M 以上flash的支持
- overlayfs的使用
- jffs2系统挂载不上的常见原因
- JFFS2 文件系统简介
- uboot对spi flash的识别
- bsp内核的SPI flash启动
- Docker开发环境
- Docker 命令速查
- 基础ubuntu系统配置
- docker离线镜像
- Zero系统烧录
- dd镜像烧录
- 分区镜像烧录
- SPI Flash系统烧录
- 一键镜像烧录
- Zero外设把玩
- I2C操作
- PWM输出
- CODEC的使用
- 以太网使用指南
- GPIO操作
- 文件IO方式
- C语言接口(mmap)
- Python操作GPIO
- pinctrl-sunxi介绍
- UART操作
- 点屏
- 点屏之RGB屏
- 点屏之SPI屏 ili9341
- 点屏之SPI OLED
- 点屏之I2C OLED
- 点屏之SPI屏 ili9488
- 点屏之MCU屏
- 点屏之触摸屏驱动
- 点屏之simple-framebuffer
- 点屏之屏幕时序
- 时钟控制器CCM
- 摄像头
- BSP DVP摄像头
- BSP MIPI 摄像头
- 主线DVP摄像头
- 主线 MIPI摄像头
- SPI 操作
- 应用层开发
- 开机自启动
- Segment Fault调试
- Zero通过OTG共享PC网络
- USB摄像头使用
- 基于QT的GUI开发
- 移植tslib
- 移植QT5.9.1
- 移植QT4.8.7
- QtCreator使用
- Qt5.x移植到Qt4.8
- Qt字体相关
- Qt移植总结
- Qt裁剪
- Qt去除鼠标指针显示
- zero_imager使用
- 驱动开发
- 设备树简介
- GPU/DRM 显示驱动
- sys下设备树查看
- atmel触摸屏驱动分析
- atmel触摸屏中断改轮询
- uboot下gpio操作
- helloworld驱动编译演示
- FBTFT分析
- 内核模块静态加载的顺序
- SPI驱动分析
- SPI 驱动编写
- Uboot开发
- 开机logo
- 看门狗的使用
- 关于系统reboot
- 内核printk等级设置