设备树配置
&spi1 {
clock-frequency = <100000000>;
pinctrl-0 = <&spi1_pins_a &spi1_pins_b>;
pinctrl-1 = <&spi1_pins_c>;
pinctrl-names = "default", "sleep";
spi_slave_mode = <0>;
spi_dbi_enable = <0>;
spi1_cs_number = <1>;
spi1_cs_bitmap = <1>;
status = "okay";
spi_board1@0 {
device_type = "spi_board1";//"spi_dbi";
compatible = "rohm,dh2228fv";
spi-max-frequency = <0x5f5e100>;
reg = <0x0>;
spi-rx-bus-width = <0x4>;
spi-tx-bus-width = <0x4>;
status = "disabled";
};
st77916@0{
//compatible = "rohm,dh2228fv"; /* 兼容性字符串,指定使用的设备驱动程序 */ 、、用则个会生成spidev1.0
compatible = "sitronix,st77916";//这个也是跟着他配置的,在spidev.c里也添加了
[ins]
/*
static const struct of_device_id spidev_dt_ids[] = {
{ .compatible = "rohm,dh2228fv" },
{ .compatible = "lineartechnology,ltc2488" },
{ .compatible = "sitronix,st77916" },
{},
};
*/
[/ins]
//compatible = "lineartechnology,ltc2488";
reg = <0>;
status = "okay";
spi-max-frequency = <32000000>;
fps = <33>; /* 每秒帧数 (Frames Per Second),这里设置为33帧*/
rotate = <0>;
buswidth = <8>; /* 总线宽度,这里设定为4位 */
//dc-gpios = <&pio 3 1 GPIO_ACTIVE_HIGH>; /* 数据/命令引脚,指向第3组GPIO的第1个引脚,活动高电平 */
reset-gpios = <&pio 3 8 GPIO_ACTIVE_HIGH>; /* 复位引脚,指向第3组GPIO的第8个引脚,活动高电平 */
led-gpios = <&pio 3 20 GPIO_ACTIVE_HIGH>; /* LED引脚,指向第3组GPIO的第20个引脚,活动高电平 */
debug = <0x0>;
};
};
通过make kernel_menuconfig 配置了
Device Drivers --->SPI support -》SUNXI SPI Controller (不配置这个会报错,make不成功)
-》User mode SPI device driver support(之前配置spi设备时,配置的)
Device Drivers --->Graphics support ---> Frame buffer Devices ---><*> Support for frame buffer devices --->(就只配置了这个,要不然下面的不会出现)
Device Drivers ---> [*] Staging drivers ---><*> Support for small TFT LCD display modules(第二个配置了才会出现) ---> <*> FB driver for the ST77916 LCD Controller 和 <*> Module to for adding FBTFT devices
然后我只想lvgl例程就卡在了sunxifb_init()这里打不开/dev/fb0(报错没有这个文件),我的dev下根本没有fb0,有一个spidev1.0,用spidev1.0报错 no a tty
问题应该就是没有生成fb0,需要哪些配置吗?
离线
离线
我就是参考的这个帖子,配置的设备树和内核,因为我的v851s不支持我需要的屏驱(我需要自己添加屏驱),所以后面的修改我没修改,暂时复制了fb_st7789v改了一下为我的屏驱了,但是就是生成不了,dev/fb0;
离线
那就添加自己的屏驱动 修改makefile kconfig文件 以便可以选中。按照操作步骤仔细对比代码。还有 没有生成fb0 一定是配置问题!内核根本无法加载设备。后续不用测试。无法加载设备的原因有很多。常见引脚冲突 引脚注册错误,驱动指向错误。驱动未编译进内核,驱动编译了 但是是编译成模块,启动后未加载驱动模块。以及驱动初始化代码不正确,返回错误值,等等,请仔细检查启动日志,可以尝试添加printf 来确认驱动加载执行。
最近编辑记录 lovexulu (2024-10-10 18:20:04)
离线
spi1_pins_a: spi1@0 {
allwinner,pins = "PD2", "PD3", "PD4","PD5", "PD6";
allwinner,pname = "spi1_sclk", "spi1_mosi", "spi1_miso", "spi1_hold", "spi1_wp";
allwinner,function = "spi1";
allwinner,muxsel = <6>;
allwinner,drive = <1>;
allwinner,pull = <0>;
};
spi1_pins_b: spi1@1 {
allwinner,pins = "PD1"; //"PF25";
allwinner,pname = "spi1_cs0";
allwinner,function = "spi1";
allwinner,muxsel = <6>;
allwinner,drive = <1>;
allwinner,pull = <1>; // only CS should be pulled up
};
spi1_pins_c: spi1@2 {
allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6";
allwinner,function = "io_disabled";
allwinner,muxsel = <0x7>;
allwinner,drive = <1>;
allwinner,pull = <0>;
};
&spi1 {
clock-frequency = <100000000>;
pinctrl-0 = <&spi1_pins_a &spi1_pins_b>;
pinctrl-1 = <&spi1_pins_c>;
pinctrl-names = "default", "sleep";
spi_slave_mode = <0>;
spi_dbi_enable = <0>;
spi1_cs_number = <1>;
spi1_cs_bitmap = <1>;
status = "okay";
spi_board1@0 {
device_type = "spi_board1";//"spi_dbi";
compatible = "rohm,dh2228fv";
spi-max-frequency = <0x5f5e100>;
reg = <0x0>;
spi-rx-bus-width = <0x4>;
spi-tx-bus-width = <0x4>;
status = "disabled";
};
st77916@0{
//compatible = "rohm,dh2228fv"; /* 兼容性字符串,指定使用的设备驱动程序 */
compatible = "sitronix,st77916";
//compatible = "lineartechnology,ltc2488";
reg = <0>;
status = "okay";
spi-max-frequency = <32000000>;
fps = <30>; /* 每秒帧数 (Frames Per Second),这里设置为33帧*/
rotate = <0>;
buswidth = <8>; /* 总线宽度,这里设定为4位 */
//dc-gpios = <&pio 3 1 GPIO_ACTIVE_HIGH>; /* 数据/命令引脚,指向第3组GPIO的第1个引脚,活动高电平 */
reset-gpios = <&pio 3 8 GPIO_ACTIVE_HIGH>; /* 复位引脚,指向第3组GPIO的第8个引脚,活动高电平 */
led-gpios = <&pio 3 20 GPIO_ACTIVE_HIGH>; /* LED引脚,指向第3组GPIO的第20个引脚,活动高电平 */
debug = <0x0>;
};
};
Device Drivers --->
Graphics support --->
Frame buffer Devices --->
<*> Support for frame buffer devices
Console display driver support --->
[*] Framebuffer Console support
[*] Map the console to the primary display device
[*] Staging drivers --->
<*> Support for small TFT LCD display modules --->
<*> FB driver for the ST7789V LCD Controller
但我的kenel_menuconfig里面没有(Console display driver support --->)选项,所以下面那两个我也没法配置了。但是我在kennel_menuconfig里面用“?”查找可以找到 Framebuffer Console support Map the console to the primary display device,并且在它提示是kconfig里也看到了,就是我选不了,我查了一下,这两项是: Framebuffer控制台支持 将控制台映射到主显示设备,还是很重要的的。是不是就是因为我没配置这两项,所以才生成不了fb0啊!
离线
请你仔细对比帖子中的设备树写法,你这是打算使用 dbi模式驱动,但原sdk的主设备树中未配置相关参数。请理解设备树每个配置项的含义。给你个建议,先不要着急修改设备树,你就照搬就好,如果能生成fb0 是否证明你修改的错误呢?
最近编辑记录 lovexulu (2024-10-10 18:50:50)
离线
还有 请按照帖子修改驱动代码,因为v851s的sdk linux内核版本4.9 fbtft驱动结构体有变动。
离线
好的,好的,我按照你说的再试一下。
还有就是我配置好spi后,spidev.c就编译成spide.o了,编译过程有显示,注册spidev函数执行了,顺利生成dev/spidev1.0了。
但是我在这配好spi和framebuffer后,fbtft-core.c都没被编译,肯定生不成fb0。
我再试试。
离线
是因为你compatible = "sitronix,st77916";指向错误。借你个chatgpt3.5 它能帮你解https://39rh47.aitianhu1.top/#/chat/1728471009371决一下问题。
离线
[ 0.168292] 11111111111111111111111111111111111.
[ 0.168298] 解析设备树里的sitronix,st7735r start.
[ 0.168307] fbtft_of_value: regwidth = 16
[ 0.168311] fbtft_of_value: buswidth = 8
[ 0.168316] fbtft_of_value: debug = 1
[ 0.168319] fbtft_of_value: rotate = 0
[ 0.168323] fbtft_of_value: fps = 30
[ 0.168328] 解析设备树里的sitronix,st7735r over.
[ 0.168587] 注册 fb_info star.
[ 0.168591] fbtft_register_framebuffer00000000000.
[ 0.168595] 987987987987.
[ 0.168597] 8888888888888888888.
[ 0.168599] 777777777777777777.
[ 0.168646] OF: /soc@03000000/spi@04026000/st77916@0: arguments longer than p
roperty
[ 0.168657] fb_st77916 spi1.0: failed to get 'reset-gpios' from DT
[ 0.168660] fbtft_register_framebuffer11111111
[ 0.168662] fbtft_register_framebuffer err
[ 0.168664] 注册 fb_info over.
[ 0.178790] fb_st77916: probe of spi1.0 failed with error -22
这是我的启动日志:可以看到我的fbtft-core.此文件已经执行了,去注册framebuffer,最终生成fb0(怎么感觉还行是spi1.0啊)
[ 0.168646] /soc@03000000/spi@04026000/st77916@0: arguments longer than p
roperty
[ 0.168657] fb_st77916 spi1.0: failed to get 'reset-gpios' from DT这两行是日志报的错误,其他一下是我printk打印判断是什么引起的错误(还没找到)
最终我判断应该是我设备树://dc-gpios = <&pio 3 6 GPIO_ACTIVE_HIGH>;
reset-gpios = <&pio 3 8 GPIO_ACTIVE_HIGH>;
led-gpios = <&pio 3 20 GPIO_ACTIVE_HIGH>;
reset-gpios的参数错了(AI也是这样说的)
参考https://whycan.com/viewtopic.php?pid=63255#p63255
你这不是gpios设备树参数太多咩。报错了呗, 你用的sdk应该和他们用的不同,具体gpios的配置情况可以参考已有的例子,如果没有的话可以找下
Documentation\devicetree\bindings 下面对设备树描述的txt看例子怎么使用设备树。就拿贴子上晕哥说的那个buildroot-tiny200 这个的来说,你看你这句
gpios = <&pio 5 5 GPIO_ACTIVE_LOW>; 你这个应该就是这个sdk里面设备树写法。这个&pio中的pio你可以在suniv-f1c100s.dtsi这里找到pio的配置,其中就有compatible = "allwinner,suniv-f1c100s-pinctrl"这个。然后你在Documentation\devicetree\bindings这里面搜索"allwinner,suniv-f1c100s-pinctrl"你就可以打开allwinner,sunxi-pinctrl.txt。这里面就说明了每个参数是什么,并且有一个demo示例。不同的SDK是略有不同的。我知道的tina就不同。
根据这个帖子,我是设备树里的gpios参数太多了,让我到Documentation\devicetree\bindings下面找到设备树参数说明,还有例程。
未通过find . -name "bindings"查找到“Documentation”这个文件夹大写的只有两个路径
./lichee/linux-4.9/modules/gpu/mali-midgard/kernel_mode/driver/Documentation/devicetree/bindings
在这个路径下有: bindings/arm/mali-midgard.txt
bindings/arm/memory_group_manager.txt
bindings/arm/smc-protected-mode-switcher.txt
bindings/power/mali-opp.txt
5个文件
./lichee/linux-4.9/modules/gpu/mali-bifrost/driver/Documentation/devicetree/bindings
在这个路径下有: bindings/arm/mali-midgard.txt
bindings/arm/smc-protected-mode-switcher.txt
bindings/power/mali-opp.txt
3个文件
我都打开看了一下没有我需要的关于spi设备树配置的。是不是我找错了啊?
并且我在我 .dtsi文件下(设备树的)找到spi1: spi@04026000 {compatible = "allwinner,sun8i-spi"; ......}我用grep搜索一下allwinner,sun8i-spi并没有什么收获。
离线
fbtft-core.c文件
static int fbtft_request_one_gpio(struct fbtft_par *par,
const char *name, int index, int *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)) {
printk(KERN_INFO "of_find_property 11111111111 over.\n");
gpio = of_get_named_gpio_flags(node, name, index, &of_flags);
printk(KERN_INFO "of_get_named_gpio_flags 11111111111 over.\n");
if (gpio == -ENOENT)
return 0;
if (gpio == -EPROBE_DEFER)
return gpio;
if (gpio < 0) {
dev_err(dev,
"failed to get '%s' from DT\n", name);
return gpio;
}
.
.
.
.
.
}
現在我找到打印的位置了,
gpio = of_get_named_gpio_flags(node, name, index, &of_flags);
這一步打印了“OF: /soc@03000000/spi@04026000/st77916@0: arguments longer than property”
接着就执行到:if (gpio < 0) {
dev_err(dev,
"failed to get '%s' from DT\n", name);
return gpio;
}
但是我还是判断不了是什么引起的错误,难受。。。
希望大家帮我看一下,万分感谢。
离线
第一:按你所说,你并不了解设备树,也不理解设备树,但不妨碍照搬,我这里解释一下你的疑惑,设备树gpio的注册格式 是看linux内核版本的。原厂的sdk内核是4.9版本,因此需要“许多参数”,与原帖子里面是一样的并没有错误。linux4.9以后的版本gpio注册格式就是你写的这样的了。
第二:你能看到gpio注册错误的提示说明离正确驱动不远了。但是吧,我就不理解了你注释掉DC引脚的申请是为啥,spi屏如果没有了DC引脚怎么初始化呢?可能计算机也不能理解这个做法,因此报错了?还有 reset-gpios 等等 这些引脚的名字 其实是可以自己定义的,但是要跟驱动里面获取引脚信息的引脚名字定义相同。你要改名字 也要先找到 引用这些引脚的代码看一下定义的名字。只要名字统一 就可以正确使用。但不建议修改代码中定义的名字。
note:原帖中的修改是可行的,除非你没有按照原帖做以至于没有fb0,最好先打通通路,再说修改,别路不通就改,还不知道为啥改。
离线
噢 还有一件事!必须关闭uboot的disp2 否则你调到天荒地老也不行。
离线
首先我通过cboot跳转到uboot下,在make menuconfig 关闭了 Device Drivers --->
Graphics support --->
[ ] DISP Driver Support(sunxi-disp2) ----
tina-fastboot-v85x/lichee/brandy-2.0/u-boot-2018/configs/sun8iw21p1_fastboot_defconfig(这是我找到的uboot的配置文件)把#CONFIG_DISP2_SUNXI=y(注销了,或者说处于“#”注销下),这应该就是把uboot下的disp2关闭了吧。
[color]在fbtft-core.c文件的fbtft_request_gpios_dt函数下有匹配的名字(有一些列这个函数fbtft_request_one_gpio(par, "reset-gpios", 0, &par->gpio.reset);)"reset-gpios","dc-gpios","cs-gpios","wr-gpios"等等[/color]
[color]我把"dc-gpios"注销掉是因为我的原理图里面没有dc功能的,比较特殊的是有一个LCD_TE,接的是PD7,应该是cs1;其他就是rst;clk;hold;wp;miso;mosi;cs0;pwm10[/color]
情况1:
我配置成这样reset-gpios = <&pio PD 8 1 1 2 1>;
我的终端(xshell)最终打印[ 1.007643] Function entered at [<c013bed1>] from [<c2843b38>]
[ 1.014185] Code: bad PC value
[ 1.017607] ---[ end trace 1c5cdc983d9f73cb ]---
[ 1.022782] Fixing recursive fault but reboot is needed!
然后就死了。
情况2:
我配置成这样dc-gpios = <&pio 3 6 GPIO_ACTIVE_HIGH>; (帖子里我猜他把wp那个引脚配置成dc了,所以我也是,PD6)
reset-gpios = <&pio 3 8 GPIO_ACTIVE_HIGH>;
led-gpios = <&pio 3 20 GPIO_ACTIVE_HIGH>;
我的终端(xshell)(dmesg | less)日志打印OF: /soc@03000000/spi@04026000/st77916@0: arguments longer than property 和 fb_st77916 spi1.0: failed to get 'reset-gpios' from DT
我这边基本已经和那个帖子里的内容保持一致了,因为硬件不同,有一些差异。
有两个大的差异就是1:我的是reset-gpios = <&pio 3 8 GPIO_ACTIVE_HIGH>;
他的是reset-gpios = <&pio PD 4 1 1 2 1>;
2:他的是struct gpio_config gpio_of_flags;其他的是根据这个结构体改的。
我的fbtft-core.c没改,因为我把enum of_gpio_flags of_flags;改成struct gpio_config gpio_of_flags;后,在make就报错找不到struct gpio_config gpio_of_flags,我跳转到gpio_config 的定义下,在/tina-fastboot-v85x--danmuok/lichee/linux-4.9/drivers/media/dvb-frontends/tda1004x.h这个文件下。
我现在也有点迷茫了。。。
离线
希望lovexulu再帮小弟看一下,非常感谢。麻烦你了。
离线
那个帖子就是我发的。。。是晕哥喊我来帮你解决这个问题。首先你对spi屏了解稍微有点欠缺,dc引脚是必不可少的,我当时帖子里使用wp是因为当时那一组spi引脚是分配给spi nand的。改用屏的时候就没有改名字。wp确实就是dc脚,spi屏与nand不同,不能缺少dc引脚,除非你是使用9bit模式驱动,但这更复杂,因此 你还是配置dc引脚,厂家给的手册上会写rs等等,你仔细查看手册,控制写入命令/数据的那个脚就是dc脚,没有是无法初始化屏的,初始化进程必须检测有没有这些硬件,如果没有就会返回报错,报错位置大概率是gpio问题!te引脚是个好东西,但是它不是必须的 它是处理撕裂问题的最佳选手。因此 可以不配置te引脚,cs引脚 也不是必须的,它可以在屏端直接对地10K电阻 保持活动状态,但spi引脚注册必须有cs引脚 因此 这个脚必须注册 用不用就看你了。reset-gpios = <&pio PD 4 1 1 2 1> 采用这种写法是正确的,不用考虑。还有就是 你想生成fb0 事实上 跟你接不接屏没多大关系,只要代码中 设备树中描述完整且正确 就会有fb0 因此 你可以先完全抛开 屏的实际硬件,先将设备树关于硬件描述的部分补全,驱动随便指向一个 st7789 之类的驱动程序 ,生成了fb0 代表显示通路已经打通,下一步就是 配置硬件实际连接,保证硬件无误后,就是测试驱动代码的下发。。即修改驱动程序代码。添加debug打印。这部分就很好做了。
总结就是 你想驱动spi屏,需要整理清楚步骤,逐步进行,不可能一步到位。尤其是缺乏基本概念常识情况下,还希望你能按部就班,一步一步来。
离线