热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:记录为Linux配置spi屏幕(st7735s)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了记录为Linux配置spi屏幕(st7735s)相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了记录为Linux配置spi屏幕(st7735s)相关的知识,希望对你有一定的参考价值。






Linux配置spi屏幕(st7735s,使用我的板子需要增加底板)

ps:st7735s可用st7735r的驱动(但是我打算使用7789v的驱动来修改)参考老哥 的文章:https://www.bilibili.com/read/cv9947785


1.修改fb_st7789v.c文件

该文件在:linux-5.10/drivers/staging/fbtft


1.1 修改init_display函数:

static int init_display(struct fbtft_par *par)
{
par->fbtftops.reset(par);//硬复位
mdelay(50);
write_reg(par,0x11);//软复位
mdelay(100);
//下面添加初始化函数write_reg 参数分别为:结构体指针,写命令,写数据....(后都为数据)
//ST7735s Frame Rate
write_reg(par,0xB1,0x05,0x3c,0x3c);
write_reg(par,0xB2,0x05,0x3c,0x3c);
write_reg(par,0xB3,0x05,0x3c,0x3c,0x05,0x3c,0x3c);


write_reg(par,0xB4,0x03); //Column inversion

//ST7735s Power Sequence
write_reg(par,0xC0,0x28,0x08,0x04);
write_reg(par,0xC1,0xc0);
write_reg(par,0xC2,0x0d,0x00);

write_reg(par,0xC3,0x8d,0x2a); //VCOM

write_reg(par,0xc4,0x8d,0xee); //MX, MY, RGB mode
write_reg(par,0xc5,0x1a);
write_reg(par,0x36,0xc0);
//ST7735s Gamma Sequence
write_reg(par,0xe0,0x04,0x22,0x07,0x0a,0x2e,0x30,0x25,0x2a,0x28,0x26,0x2e,0x3a,0x00,0x01,0x03,0x13);
write_reg(par,0xe1,0x04,0x16,0x06,0x0d,0x2d,0x26,0x23,0x27,0x27,0x25,0x2d,0x3b,0x00,0x01,0x04,0x13);

write_reg(par,0x3A,0x05); //65k mode

write_reg(par,0x29);//Display on
mdelay(100);
return 0;
}

1.2 修改struct fbtft_display display

修改屏幕高宽:

static struct fbtft_display display = {
.regwidth = 8,
.width = 128,//屏幕宽度
.height = 160,//屏幕高度
.gamma_num = 2,
.gamma_len = 14,
.gamma = HSD20_IPS_GAMMA,
.fbtftops = {
.init_display = init_display,
.set_var = set_var,
.set_gamma = set_gamma,
.blank = blank,
},
};

若使用st77335s需将set_gamma函数的for循环注释掉


2.修改fbtft-core.c文件(更新驱动的gpio申请函数):

修改以下几个函数:

static int fbtft_request_one_gpio(struct fbtft_par *par,
const char *name, int index,
struct gpio_desc **gpiop)
{
struct device *dev = par->info->device;
struct device_node *node = dev->of_node;
int gpio, flags, ret = 0;
enum of_gpio_flags of_flags;
if (of_find_property(node, name, NULL)) {
gpio = of_get_named_gpio_flags(node, name, index, &of_flags);
if (gpio == -ENOENT)
return 0;
if (gpio == -EPROBE_DEFER)
return gpio;
if (gpio < 0) {
dev_err(dev,
"failed to get &#39;%s&#39; from DT\\n", name);
return gpio;
}
//active low translates to initially low
flags &#61; (of_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT_INIT_LOW :
GPIOF_OUT_INIT_HIGH;
ret &#61; devm_gpio_request_one(dev, gpio, flags,
dev->driver->name);
if (ret) {
dev_err(dev,
"gpio_request_one(&#39;%s&#39;&#61;%d) failed with %d\\n",
name, gpio, ret);
return ret;
}
*gpiop &#61; gpio_to_desc(gpio);
fbtft_par_dbg(DEBUG_REQUEST_GPios, par, "%s: &#39;%s&#39; &#61; GPIO%d\\n",
__func__, name, gpio);
}
return ret;
}
static int fbtft_request_gpios(struct fbtft_par *par)
{
int i;
int ret;
ret &#61; fbtft_request_one_gpio(par, "reset-gpios", 0, &par->gpio.reset);
if (ret)
return ret;
ret &#61; fbtft_request_one_gpio(par, "dc-gpios", 0, &par->gpio.dc);
if (ret)
return ret;
ret &#61; fbtft_request_one_gpio(par, "rd-gpios", 0, &par->gpio.rd);
if (ret)
return ret;
ret &#61; fbtft_request_one_gpio(par, "wr-gpios", 0, &par->gpio.wr);
if (ret)
return ret;
ret &#61; fbtft_request_one_gpio(par, "cs-gpios", 0, &par->gpio.cs);
if (ret)
return ret;
ret &#61; fbtft_request_one_gpio(par, "latch-gpios", 0, &par->gpio.latch);
if (ret)
return ret;
for (i &#61; 0; i < 16; i&#43;&#43;) {
ret &#61; fbtft_request_one_gpio(par, "db-gpios", i,
&par->gpio.db[i]);
if (ret)
return ret;
ret &#61; fbtft_request_one_gpio(par, "led-gpios", i,
&par->gpio.led[i]);
if (ret)
return ret;
ret &#61; fbtft_request_one_gpio(par, "aux-gpios", i,
&par->gpio.aux[i]);
if (ret)
return ret;
}
return 0;
}
static void fbtft_reset(struct fbtft_par *par)
{
if (!par->gpio.reset)
return;
fbtft_par_dbg(DEBUG_RESET, par, "%s()\\n", __func__);
gpiod_set_value_cansleep(par->gpio.reset, 1);
msleep(10);
gpiod_set_value_cansleep(par->gpio.reset, 0);
msleep(200);
gpiod_set_value_cansleep(par->gpio.reset, 1);
msleep(10);
}

3.修改设备树&#xff1a;

添加 linux-5.10/arch/arm/boot/dts设备节点如下&#xff1a;

&spi0 {
status &#61;"okay";
st7789v&#64;0 {
status &#61;"okay";
compatible &#61; "sitronix,st7789v";
reg &#61; <0>;
spi-max-frequency &#61;<48000000>; //SPI时钟50M
rotate &#61;<90>; //屏幕旋转90度
spi-cpol;
spi-cpha;
rgb; //颜色格式RGB
fps &#61;<30>; //刷新30帧率
buswidth &#61;<8>; //总线宽度8
dc-gpios &#61;<&pio 1 6 GPIO_ACTIVE_LOW>; //GPIOB6
reset-gpios&#61;<&pio 1 5 GPIO_ACTIVE_LOW>; //GPIOB5 暂时测试后面dc板子会改成pb4
debug &#61;<0>; //不开启调试
};

3.配置linux内核&#xff1a;

make ARCH&#61;arm menuconfig

配置如下&#xff1a;
在这里插入图片描述
在这里插入图片描述


ps:7735s也可直接修改fbtft-core.c文件&#xff0c;然后设备树的st7789v全改为st7783r&#xff0c;内核配置时选中ST7735R即可按照后面做。


4.编译内核&#xff1a;

编译内核:
make ARCH&#61;arm CROSS_COMPILE&#61;arm-linux-gnueabihf- -j16
make ARCH&#61;arm CROSS_COMPILE&#61;arm-linux-gnueabihf- -j16 INSTALL_MOD_PATH&#61;out modules
make ARCH&#61;arm CROSS_COMPILE&#61;arm-linux-gnueabihf- -j16 INSTALL_MOD_PATH&#61;out modules_install
编译设备树&#xff1a; make ARCH&#61;arm CROSS_COMPILE&#61;arm-linux-gnueabihf- dtbs

将编译的内核zImage 和dtb文件替换tf卡内的文件即可。也可参考我的一片烧录的文章。


5.启动开发板

使用&#xff1a;

cat /dev/urandom > /dev/fb0

看是否屏幕出现雪花点。&#xff08;如果有就说明驱动上了&#xff09;


6.添加控制台输出&#xff1a;

修改u-boot的bootargs参数进入u-boot时按任意键进入boot命令&#xff0c;输入&#xff1a;

setenv bootargs "console&#61;tty0 console&#61;ttyS0,115200 panic&#61;5 rootwait root&#61;/dev/mmcblk0p2 earlyprintk rw vt.global_cursor_default&#61;0"
saveenv

下一篇文章为使用板子播放BADAPPLE,有屏幕的地方就有BADAPPLE。






推荐阅读
author-avatar
灵123456妞子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有