v3s点RGB屏 40pin 800x480,不一样的点屏,不通过chosen。

打印 上一主题 下一主题

主题 1022|帖子 1022|积分 3066

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、背景、目的、简介。

一样平常来说,通过uboot将屏幕参数传给kernel,是通过修改装备树。
uboot和kernel都必要屏幕点亮。uboot偏重于表现一张图片。而kernel则多是动画。
在这里,我先是找到了一个裸机点屏的代码。将其编译成静态库后,给uboot来调用。而不是通过荔枝派已经适配好了的uboot。
这样做,只必要将uboot初始化好了的内存地址传给内核就好了,固然还包罗屏幕大小等信息,因为已经提前知道,以是在内核中写死了。然后利于simple-framebuffer,将内容映射为屏幕。然后有了fb0,就可以骚操纵了。
二、问题:

但是在实际操纵过程中遇到了些问题。比如说将内存地址传给kernel后,内核必要将该物理地址转为虚拟地址。使用ioremap后,不能功,会出错,但还是会表现注册framebuffer成功。
以及成功后,有表现fb0,但是屏幕上有条纹,显着不是fb所指内存中的内容。假如正常的话,uboot已经配置了tcon,tcon将fb里面的数据(先经过了de和mixer处置惩罚),主动发送到屏幕上。应该看到random的内容,这内容应该是.text或是全黑屏。但是,实际上是uboot表现的内容会慢慢消失。猜测是tcon被关闭了。
三、解决:

为什么uboot传参后的屏幕表现正常呢?为什么我修改simplefb_probe后,kernel起动时报错?下面的内容全部在/drivers/video/fbdev/simplefb.c中进行。
其实必要修改的不是simplefb_probe这个函数,而是simplefb_parse_dt,这个函数。
99行 simplefb_parse_dt修改为:

  1. static int simplefb_parse_dt(struct platform_device *pdev,
  2.                            struct simplefb_params *params)
  3. {
  4.         struct device_node *np = pdev->dev.of_node;
  5.         int ret;
  6.         const char *format;
  7.         int i;
  8.         //ret = of_property_read_u32(np, "width", &params->width);
  9.         ret = 0;
  10.         params->width        = 800;
  11.         if (ret) {
  12.                 dev_err(&pdev->dev, "Can't parse width property\n");
  13.                 return ret;
  14.         }
  15.         //ret = of_property_read_u32(np, "height", &params->height);
  16.         ret        = 0;
  17.         params->height        = 480;
  18.         if (ret) {
  19.                 dev_err(&pdev->dev, "Can't parse height property\n");
  20.                 return ret;
  21.         }
  22.         //ret = of_property_read_u32(np, "stride", &params->stride);
  23.         ret        = 0;
  24.         params->stride        = 3200;
  25.         if (ret) {
  26.                 dev_err(&pdev->dev, "Can't parse stride property\n");
  27.                 return ret;
  28.         }
  29.         //ret = of_property_read_string(np, "format", &format);
  30.         ret        = 0;
  31.        
  32.         if (ret) {
  33.                 dev_err(&pdev->dev, "Can't parse format property\n");
  34.                 return ret;
  35.         }
  36.         params->format = NULL;
  37.         for (i = 0; i < ARRAY_SIZE(simplefb_formats); i++) {
  38.                 //if (strcmp(format, simplefb_formats[i].name))
  39.                 if (strcmp("x8r8g8b8", simplefb_formats[i].name))
  40.                         continue;
  41.                 params->format = &simplefb_formats[i];
  42.                 break;
  43.         }
  44.         if (!params->format) {
  45.                 dev_err(&pdev->dev, "Invalid format value\n");
  46.                 return -EINVAL;
  47.         }
  48.         return 0;
  49. }
复制代码

还必要修改装备树:

通过网盘分享的文件:v3s_mini_dts.tar
链接: https://pan.baidu.com/s/1gJZEUVp4DVJMtSWjHNpzpA?pwd=wqvc 提取码: wqvc 
--来自百度网盘超等会员v3的分享
  1. /{
  2.     panel: panel {
  3.                 #address-cells = <1>;
  4.                 #size-cells = <0>;
  5.                 compatible = "urt,umsh-8596md-t", "simple-panel";
  6.                 port@0 {
  7.                         reg = <0>;
  8.                         //backlight = <&backlight>;
  9.                         #address-cells = <1>;
  10.                         #size-cells = <0>;
  11.                         panel_input: endpoint@0 {
  12.                                 reg = <0>;
  13.                                 remote-endpoint = <&tcon0_out_lcd>;
  14.                         };
  15.                 };
  16.         };
  17. }
  18. &tcon0_out {
  19.         tcon0_out_lcd: endpoint@0 {
  20.                 reg = <0>;
  21.                 remote-endpoint = <&panel_input>;
  22.         };
  23. };
  24. chosen {
  25.                 #address-cells = <1>;
  26.                 #size-cells = <1>;
  27.                 ranges;
  28.                 simplefb_lcd: framebuffer@0 {
  29.                         compatible = "allwinner,simple-framebuffer",
  30.                                      "simple-framebuffer";
  31.                         allwinner,pipeline = "de0-lcd0";
  32.                         clocks = <&ccu CLK_BUS_TCON0>, <&display_clocks 0>,
  33.                                  <&display_clocks 6>, <&ccu CLK_TCON0>;
  34.                         status = "disabled";
  35.                 };
  36.         };
复制代码

四、其它问题

还遇到过什么问题吧,比如,使用mplayer播放视频,但是只表现第一帧,然后报错,说无法得到第2个缓存。这个问题是,只使用了 compatible = "urt,umsh-8596md-t", "simple-panel";这是一个drm,但是simple-framebuffer没有配置好,不能用导致。将simple-framebuffer配置好就可以了。

五、uboot传参,对kernel装备树还是有影响的:

比如我将fdt_simplefb里的设置修改,本来表现装备是在chosen里的,但是被我改成了在/节点下。

那么问题又来了,framebuffer的地址也是uboot传入的,修改其值,会有影响吗?
经过测试,@其它数值,没有什么变化。

六、实物实拍:

好想做个小电视呀,微缩模型放城堡里..._哔哩哔哩_bilibili


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表