我之前用5.2内核驱动ST7789也出现这个错误,网上没有找到相关的解答就换了4.13的内核,mark一下,回去试试
昨天调试后报下面这个错误,根据楼上大佬说的是IO没有申请成功,让我在fbtft_request_one_gpio加打印函数看看,我照做了(一定要勤动手),结果真的发现问题。
[ 1.165851] fbtft_of_value: buswidth = 8 [ 1.169818] fbtft_of_value: debug = 0 [ 1.173478] fbtft_of_value: rotate = 270 [ 1.177395] fbtft_of_value: fps = 10 [ 1.181682] @ pdata->display.buswidth = 8 [ 1.185755] @ par->gpio.dc = 0 [ 1.188882] fb_ili9341 spi0.0: Missing info about 'dc' gpio. Aborting.
fbtft_request_one_gpio加入打印函数后的代码,关键的打印函数在108行。
5 static int fbtft_request_one_gpio(struct fbtft_par *par, 76 const char *name, int index, 77 struct gpio_desc **gpiop) 78 { 79 /* 80 struct device *dev = par->info->device; 81 struct device_node *node = dev->of_node; 82 int ret = 0; 83 84 if (of_find_property(node, name, NULL)) { 85 *gpiop = devm_gpiod_get_index(dev, dev->driver->name, index, 86 GPIOD_OUT_HIGH); 87 if (IS_ERR(*gpiop)) { 88 ret = PTR_ERR(*gpiop); 89 dev_err(dev, 90 "Failed to request %s GPIO:%d\n", name, ret); 91 return ret; 92 } 93 fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' GPIO\n", 94 __func__, name); 95 } 96 97 return ret; 98 */ 99 100 struct device *dev = par->info->device; 101 struct device_node *node = dev->of_node; 102 int gpio, flags, ret = 0; 103 enum of_gpio_flags of_flags; 104 char gpio_names[32]; 106 sprintf(gpio_names, "%s-gpios", name); 108 printk("@ gpio_names = %s\n", gpio_names); 109 if (of_find_property(node, gpio_names, NULL)) { 110 gpio = of_get_named_gpio_flags(node, gpio_names, index, &of_flags); 111 printk ("@ gpio = %d | ENOENT = %d | EPROBE_DEFER = %d \n", gpio, ENOENT, EPROBE_DEFER); 112 if (gpio == -ENOENT) 113 return 0; 114 if (gpio == -EPROBE_DEFER) 115 return gpio; 116 if (gpio < 0) { 117 dev_err(dev, 118 "failed to get '%s' from DT\n", gpio_names); 119 return gpio; 120 } 121 122 //active low translates to initially low 123 flags = (of_flags & OF_GPIO_ACTIVE_LOW) ? GPIOF_OUT_INIT_LOW : 124 GPIOF_OUT_INIT_HIGH; 125 ret = devm_gpio_request_one(dev, gpio, flags, 126 dev->driver->name); 127 if (ret) { 128 dev_err(dev, 129 "gpio_request_one('%s'=%d) failed with %d\n", 130 gpio_names, gpio, ret); 131 return ret; 132 } 133 134 *gpiop = gpio_to_desc(gpio); 135 fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' = GPIO%d\n", 136 __func__, gpio_names, gpio); 137 } 138 return ret; 139 }
内核启动后输出的如下内容
[ 1.165851] fbtft_of_value: buswidth = 8 [ 1.169818] fbtft_of_value: debug = 0 [ 1.173480] fbtft_of_value: rotate = 90 [ 1.177309] fbtft_of_value: fps = 30 [ 1.181541] @ gpio_names = reset-gpios-gpios [ 1.185883] @ gpio_names = dc-gpios-gpios [ 1.189960] @ gpio_names = rd-gpios-gpios [ 1.193969] @ gpio_names = wr-gpios-gpios [ 1.197999] @ gpio_names = cs-gpios-gpios [ 1.202004] @ gpio_names = latch-gpios-gpios [ 1.206267] @ gpio_names = db-gpios-gpios [ 1.210286] @ gpio_names = led-gpios-gpios [ 1.214377] @ gpio_names = aux-gpios-gpios [ 1.218478] @ gpio_names = db-gpios-gpios [ 1.222481] @ gpio_names = led-gpios-gpios [ 1.226570] @ gpio_names = aux-gpios-gpios [ 1.230668] @ gpio_names = db-gpios-gpios [ 1.234671] @ gpio_names = led-gpios-gpios [ 1.238770] @ gpio_names = aux-gpios-gpios [ 1.242859] @ gpio_names = db-gpios-gpios [ 1.246861] @ gpio_names = led-gpios-gpios [ 1.250961] @ gpio_names = aux-gpios-gpios [ 1.255049] @ gpio_names = db-gpios-gpios [ 1.259062] @ gpio_names = led-gpios-gpios [ 1.263151] @ gpio_names = aux-gpios-gpios [ 1.267239] @ gpio_names = db-gpios-gpios [ 1.271251] @ gpio_names = led-gpios-gpios [ 1.275340] @ gpio_names = aux-gpios-gpios [ 1.279440] @ gpio_names = db-gpios-gpios [ 1.283443] @ gpio_names = led-gpios-gpios [ 1.287531] @ gpio_names = aux-gpios-gpios [ 1.291630] @ gpio_names = db-gpios-gpios [ 1.295632] @ gpio_names = led-gpios-gpios [ 1.299731] @ gpio_names = aux-gpios-gpios [ 1.303821] @ gpio_names = db-gpios-gpios [ 1.307823] @ gpio_names = led-gpios-gpios [ 1.311921] @ gpio_names = aux-gpios-gpios [ 1.316010] @ gpio_names = db-gpios-gpios [ 1.320022] @ gpio_names = led-gpios-gpios [ 1.324111] @ gpio_names = aux-gpios-gpios [ 1.328210] @ gpio_names = db-gpios-gpios [ 1.332213] @ gpio_names = led-gpios-gpios [ 1.336302] @ gpio_names = aux-gpios-gpios [ 1.340400] @ gpio_names = db-gpios-gpios [ 1.344403] @ gpio_names = led-gpios-gpios [ 1.348502] @ gpio_names = aux-gpios-gpios [ 1.352591] @ gpio_names = db-gpios-gpios [ 1.356593] @ gpio_names = led-gpios-gpios [ 1.360693] @ gpio_names = aux-gpios-gpios [ 1.364781] @ gpio_names = db-gpios-gpios [ 1.368794] @ gpio_names = led-gpios-gpios [ 1.372884] @ gpio_names = aux-gpios-gpios [ 1.376973] @ gpio_names = db-gpios-gpios [ 1.380985] @ gpio_names = led-gpios-gpios [ 1.385065] @ gpio_names = aux-gpios-gpios [ 1.389165] @ gpio_names = db-gpios-gpios [ 1.393167] @ gpio_names = led-gpios-gpios [ 1.397255] @ gpio_names = aux-gpios-gpios [ 1.401356] @ pdata->display.buswidth = 8 [ 1.405358] @ par->gpio.dc = 0 [ 1.408425] fb_ili9341 spi0.0: Missing info about 'dc' gpio. Aborting. @xkt [ 1.415483] fb_ili9341: probe of spi0.0 failed with error -22
我是输出设备树中IO口的名称,发现reset和dc引脚的名称为:reset-gpios-gpios dc-gpios-gpios。跟设备树上的节点名称不一样,所以真如楼上大佬说的,是引脚没有申请成功!所以只需要把驱动和设备树的引脚名称修改为一致就好了。有多种修改方法。
树先生 说:树先生 说:有一个相关的 https://whycan.com/viewtopic.php?id=2749
但是我按照他说的在初始化里加入了这样一句代码,还是不行
par->fbtftops.reset(par);按照这篇文章修改后能生成fb0设备,但是显示花屏不正常,原因还未找到
http://www.360doc.com/content/20/1028/21/18945873_942900893.shtml你cat一点东西到fb里,看看什么样子
我找到问题了,我用的5.2的内核,申请GPIO的时候会报错,应该是对应的申请GPIO函数在内核里没有更新。我换成4.13版本的内核就可以直接驱动了。现在我想设置ST7789VW镜像显示配合分光棱镜,但是我设置了寄存器之后发现没作用,不知道怎么回事。
九重天 说:这个是 8bit 的 spi 液晶屏吧, 右上角搜 st7789
有一个相关的 https://whycan.com/viewtopic.php?id=2749
但是我按照他说的在初始化里加入了这样一句代码,还是不行
par->fbtftops.reset(par);
按照这篇文章修改后能生成fb0设备,但是显示花屏不正常,原因还未找到
http://www.360doc.com/content/20/1028/21/18945873_942900893.shtml
这个是 8bit 的 spi 液晶屏吧, 右上角搜 st7789
有一个相关的 https://whycan.com/viewtopic.php?id=2749
但是我按照他说的在初始化里加入了这样一句代码,还是不行
par->fbtftops.reset(par);
RGB ? SPI ?
对的,就是这个显示屏 https://item.taobao.com/item.htm?id=565812505490
我看Linux5.2的内核里面好像是集成相关的驱动,并且也能在 linux-zero-5.2.y\drivers\staging\fbtft 目录下找到源码,但是我不太清楚怎么配置和驱动。
对应的menuconfig里也能找到配置,我配置了这个
Drivers > Staging drivers > Support for small TFT LCD display modules
<*> FB driver for the ST7789V LCD Controller
<*> Generic FB driver for TFT LCD displays
也在设备树添加了以下代码:
&spi0{
status = "okay";
st7789v: st7789v@0{
compatible = "sitronix,st7789v";
reg = <0>;
status = "okay";
spi-max-frequency = <96000000>;
spi-cpol;
spi-cpha;
rotate = <270>;
fps = <30>;
buswidth = <8>;
dc-gpios = <&pio 1 4 GPIO_ACTIVE_HIGH>;
reset-gpios = <&pio 1 5 GPIO_ACTIVE_HIGH>;
debug = <0x0>;
};
};
重新编译后在/dev下未能生成fb设备
我才接触V3S不久,不太熟悉,希望大佬们指点一下
我照着官方的教程在menuconfig里面选择了ST7789V,但是编译后烧录进去未生成/dev/fb0这个设备,在网上也没有找到V3S驱动ST7789V的相关教程,哪位大佬能指点一下迷津搞一个教程,感激不尽。我参考的官方教程
http://zero.lichee.pro/%E8%B4%A1%E7%8C%AE/article%203.html#lichee-pi-zero-spi-lcd
拿出来卖这个真的太恶心了