研究了好几天,终于驱动成功了,一堆问题,发个帖子来记录下
spi:使用linux提供的GPIO-based bitbanging SPI Master ,然后在dts文件里添加spi节点
tft:使用的是fbtft提供的屏幕驱动,挂在上面生成的模拟spi下面
还存在很多问题,但暂时是可以将屏幕初始化了,可以参考一下
离线
如果不考虑移植性,可以不用设备树,现在正好也在研究linux的屏幕驱动,想用tft的并口方式驱动,提高帧率
离线
首先是gpio模拟spi,在linux的
Device Drivers --->
[*] SPI support --->
<*> GPIO-based bitbanging SPI Master
这里开启,然后在设备树的根节点下添加节点
spi2:spi2{
compatible = "spi-gpio";
#address-cells = <0x1>;
#size-cells = <0>;
//ranges;
gpio-miso = <&pio 3 3 1>;
gpio-mosi = <&pio 3 4 1>;
gpio-sck = <&pio 3 5 1>;
cs-gpios = <&pio 3 6 1>;
num-chipselects = <1>;
pinctrl-names = "default";
pinctrl-0 = <&spi2_pins_a>;
spidev2 {
status="disable";
#address-cells = <1>;
#size-cells = <0>;
compatible = "rohm,dh2228fv";
spi-max-frequency = <20000000>;
reg = <0>;
};
};
这里添加了一个测试设备,可以用tools/spi里面的测试文件进行测试spi是否配置成功
其中pinctrl是这么配置的
&pio{
spi2_pins_a: spi2-pins-pc {
pins = "PD3", "PD4", "PD5", "PD6";
function = "gpio_out";
bias-pull-up;
};
};
只在spi2那里面设置引脚是并不能直接使用的,虽然能在系统中找到设备,但是连接miso和mosi后操作spi发送信息并不会收到任何信息,gpio的表现为没有配置,没有任何变化
离线
最后是fbtft的设置:
内核配置
Device Drivers --->
[*] Staging driverst --->
<*> Support for small TFT LCD display modules --->
<*> FB driver for the ST7789V LCD Controller
<*> Generic ....
<*> Module .....
把这些都编译进内核,修改dts文件,添加st7789的节点(参考的荔枝派 zero的点屏之SPI屏)
根节点下/
spi2:spi2{
compatible = "spi-gpio";
#address-cells = <0x1>;
#size-cells = <0>;
//ranges;
gpio-miso = <&pio 3 3 1>;
gpio-mosi = <&pio 3 4 1>;
gpio-sck = <&pio 3 5 1>;
cs-gpios = <&pio 3 6 1>;
num-chipselects = <1>;
pinctrl-names = "default";
pinctrl-0 = <&spi2_pins_a>;
spidev2 {
status="disable";
#address-cells = <1>;
#size-cells = <0>;
compatible = "rohm,dh2228fv";
spi-max-frequency = <20000000>;
reg = <0>;
};
st7789 {
compatible = "sitronix,st7789v";
reg = <0>;
spi-max-frequency = <50000000>;
rotate = <270>;
bgr;
width=<240>;
height=<240>;
fps = <30>;
buswidth = <9>;
reset-gpios = <&pio 3 0 GPIO_ACTIVE_LOW>;
//dc-gpios = <&pio 1 5 GPIO_ACTIVE_LOW>;
debug = <0>;
};
pio节点里
&pio{
spi2_pins_a: spi2-pins-pc {
pins = "PD3", "PD4", "PD5", "PD6";
function = "gpio_out";
bias-pull-up;
};
};
可以看这个修改屏幕的一些参数FBTFT devices tree
烧录进去后屏幕会在内核启动时初始化为白色,启动日志中有fb相关的启动
离线
才学linux几天,驱动还不怎么会写,还在看
最近编辑记录 lignin (2020-08-02 22:19:45)
离线
不用GPIO去模拟,太慢了, 可以用硬件SPI, 通过GPIO片选CS#就行, 本站有参考资料.
离线
开始是因为屏是用9位spi,而f1c100s不支持9位,就没想着去用硬件spi,画板子就直接就近找的引脚,为了方便我就用了模拟spi,不用再跳线
离线
然后在fbtft的源码里发现可以用8位的spi去模拟,这才明白,下一版就会接到硬件spi上
离线
好好研究一下,学习学习咯,spi去模拟
离线
哪里买来的手表屏,圆的还是方的
离线
然后在fbtft的源码里发现可以用8位的spi去模拟,这才明白,下一版就会接到硬件spi上
按上面这个配置,驱动9bit st7789成功了吗?
离线
成功了,现在是成功初始化,显示白色,但是我不会让它显示其他东西,还在学
按上面这个配置,驱动9bit st7789成功了吗?
离线
板上就一个flash和SD卡插口,不过这个对我这种第一次画的人有很大的借鉴意义,感谢大佬
离线
接MCU的屏会方便一些吧
离线
没直接插那座子的屏幕。等之后有了在调那边的接口
离线
请问根据不同的屏厂,是不是只需要修改fb_st7789.c文件里面的init_display这个屏幕初始化和fbtft_display display 这里面的lcd参数?
离线
没直接插那座子的屏幕。等之后有了在调那边的接口?
离线
@lignin
不是很明白,实际上SPI不是有四根线吗,SCK、MOSI、CS三根线可以设置为输出模式,但是实际上MISO不是应该设置为输入模式吗?
离线