TI AM335x kernel 4.4.12 LCD display 时钟翻转记录

因为公司硬件上已经确定LCD 转LVDS 转换芯片上确认以上升沿时钟为基准,所以只能在软件上调整相关东西。

入口在:

drivers/gpu/drm/tilcdc/tilcdc_drv.c入口函数:
module_init(tilcdc_drm_init);
出口函数:
module_exit(tilcdc_drm_fini);   722 static int __init tilcdc_drm_init(void)
723 {
724     DBG("init");
725     tilcdc_tfp410_init();
726     tilcdc_panel_init();   ---> 这里面有关监视器的初始化----------
727     return platform_driver_register(&tilcdc_platform_driver); |
728 }                                                             |                   |                   |
drivers/gpu/drm/tilcdc/tilcdc_panel.c                             ||
452 int __init tilcdc_panel_init(void)  <--------------------------
453 {
454     return platform_driver_register(&panel_driver);
455 }                                         |----------                                      |
437 static struct of_device_id panel_of_match[] = {     |
438         { .compatible = "ti,tilcdc,panel", },       |
439         { },                                        |
440 };                                                  |
441                                                     |
442 struct platform_driver panel_driver = { <------------
443     .probe = panel_probe,
444     .remove = panel_remove,
445     .driver = {
446         .owner = THIS_MODULE,
447         .name = "panel",
448         .of_match_table = panel_of_match,
449     },
450 };  
根据panel_of_match[].compatible = "ti,tilcdc,panel", 找到设备树相应内容。
arch/arm/boot/dts/am335x-chenfl.dts47     panel {48         compatible = "ti,tilcdc,panel";49         status = "okay";50         pinctrl-names = "default";51         pinctrl-0 = <&lcd_pins_s0>;52         panel-info {53             ac-bias           = <255>;54             ac-bias-intrpt    = <0>;55             dma-burst-sz      = <16>;56             bpp               = <16>;57             fdd               = <0x80>;58             sync-edge         = <0>;59             sync-ctrl         = <1>;60             raster-order      = <0>;61             fifo-th           = <0>;62             invert-pxl-clk    = <1>;63         };64 65         display-timings {66             native-mode = <&timing0>;67             timing0: 800x480 {68                 clock-frequency = <33260000>;69                 hactive = <800>;70                 vactive = <480>;71                 hfront-porch = <39>;72                 hback-porch = <39>;73                 hsync-len = <47>;74                 vback-porch = <29>;75                 vfront-porch = <13>;76                 vsync-len = <2>;77                 hsync-active = <1>;78                 vsync-active = <1>;79             };80         };81     };
确定平台设备与平台驱动已经相互匹配之后,我们可以直接跟踪驱动的probe
回到drivers/gpu/drm/tilcdc/tilcdc_panel.c
看到:442 struct platform_driver panel_driver = {
443     .probe = panel_probe,
444     .remove = panel_remove,
445     .driver = {
446         .owner = THIS_MODULE,
447         .name = "panel",
448         .of_match_table = panel_of_match,
449     },
450 };  panel_probe:
341 static int panel_probe(struct platform_device *pdev)
342 {
343     struct device_node *bl_node, *node = pdev->dev.of_node;
344     struct panel_module *panel_mod;
345     struct tilcdc_module *mod;
346     struct pinctrl *pinctrl;
347     int ret;
348     /* 如果没有设备树数据就直接跳出来 */
349     /* bail out early if no DT data: */
350     if (!node) {
351         dev_err(&pdev->dev, "device-tree data is missing\n");
352         return -ENXIO;
353     }
354
355     panel_mod = devm_kzalloc(&pdev->dev, sizeof(*panel_mod), GFP_KERNEL);
356     if (!panel_mod)
357         return -ENOMEM;
358
359     bl_node = of_parse_phandle(node, "backlight", 0);
360     if (bl_node) {
361         panel_mod->backlight = of_find_backlight_by_node(bl_node);
362         of_node_put(bl_node);
363
364         if (!panel_mod->backlight)
365             return -EPROBE_DEFER;
366
367         dev_info(&pdev->dev, "found backlight\n");
368     }
369
370     panel_mod->enable_gpio = devm_gpiod_get_optional(&pdev->dev, "enable",
371                              GPIOD_OUT_LOW);
372     if (IS_ERR(panel_mod->enable_gpio)) {
373         ret = PTR_ERR(panel_mod->enable_gpio);
374         dev_err(&pdev->dev, "failed to request enable GPIO\n");
375         goto fail_backlight;
376     }
377
378     if (panel_mod->enable_gpio)
379         dev_info(&pdev->dev, "found enable GPIO\n");
380
381     mod = &panel_mod->base;
382     pdev->dev.platform_data = mod;
383
384     tilcdc_module_init(mod, "panel", &panel_module_ops);
385
386     pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
387     if (IS_ERR(pinctrl))
388         dev_warn(&pdev->dev, "pins are not configured\n");
389     /*  对应时序的设置,和设备树中的display-timings 有关   */
390     panel_mod->timings = of_get_display_timings(node);
391     if (!panel_mod->timings) {
392         dev_err(&pdev->dev, "could not get panel timings\n");
393         ret = -EINVAL;
394         goto fail_free;
395     }
396      /*  对应的相关信息设置,跟panel-info 这个节点有关  */
397     panel_mod->info = of_get_panel_info(node);
398     if (!panel_mod->info) {
399         dev_err(&pdev->dev, "could not get panel info\n");
400         ret = -EINVAL;
401         goto fail_timings;
402     }
403
404     mod->preferred_bpp = panel_mod->info->bpp;
405
406     return 0;
407
408 fail_timings:
409     display_timings_release(panel_mod->timings);
410
411 fail_free:
412     tilcdc_module_cleanup(mod);
413
414 fail_backlight:
415     if (panel_mod->backlight)
416         put_device(&panel_mod->backlight->dev);
417     return ret;
418 }                                                                               /*  这是上面的 of_get_panel_info 传进来的 */
292 static struct tilcdc_panel_info *of_get_panel_info(struct device_node *np)
293 {
294     struct device_node *info_np;
295     struct tilcdc_panel_info *info;
296     int ret = 0;
297
298     if (!np) {
299         pr_err("%s: no devicenode given\n", __func__);
300         return NULL;
301     }
302
303     info_np = of_get_child_by_name(np, "panel-info");
304     if (!info_np) {
305         pr_err("%s: could not find panel-info node\n", __func__);
306         return NULL;
307     }
308
309     info = kzalloc(sizeof(*info), GFP_KERNEL);
310     if (!info) {
311         pr_err("%s: allocation failed\n", __func__);
312         of_node_put(info_np);
313         return NULL;
314     }
315     /*  这里我们可以看到,如果一个出错,ret 就会为真,这是上面的设备树的必需选项的配对  */
316     ret |= of_property_read_u32(info_np, "ac-bias", &info->ac_bias);
317     ret |= of_property_read_u32(info_np, "ac-bias-intrpt", &info->ac_bias_intrpt);
318     ret |= of_property_read_u32(info_np, "dma-burst-sz", &info->dma_burst_sz);
319     ret |= of_property_read_u32(info_np, "bpp", &info->bpp);
320     ret |= of_property_read_u32(info_np, "fdd", &info->fdd);
321     ret |= of_property_read_u32(info_np, "sync-edge", &info->sync_edge);
322     ret |= of_property_read_u32(info_np, "sync-ctrl", &info->sync_ctrl);
323     ret |= of_property_read_u32(info_np, "raster-order", &info->raster_order);
324     ret |= of_property_read_u32(info_np, "fifo-th", &info->fifo_th);
325
326     /* optional: */ /*  这是可选选项,下面第二个则是时钟反转的选项。在设备中添加一个选项即可。 */
327     info->tft_alt_mode      = of_property_read_bool(info_np, "tft-alt-mode");
328     info->invert_pxl_clk    = of_property_read_bool(info_np, "invert-pxl-clk");
329
330     if (ret) {
331         pr_err("%s: error reading panel-info properties\n", __func__);
332         kfree(info);
333         of_node_put(info_np);
334         return NULL;
335     }
336     of_node_put(info_np);
337
338     return info;
339 }   /*  设备树修改 */47     panel {                                                                     48         compatible = "ti,tilcdc,panel";                                         49         status = "okay";                                                        50         pinctrl-names = "default";                                              51         pinctrl-0 = <&lcd_pins_s0>;                                             52         panel-info {                                                            53             ac-bias           = <255>;                                          54             ac-bias-intrpt    = <0>;                                            55             dma-burst-sz      = <16>;                                           56             bpp               = <16>;                                           57             fdd               = <0x80>;                                         58             sync-edge         = <0>;                                            59             sync-ctrl         = <1>;                                            60             raster-order      = <0>;                                            61             fifo-th           = <0>;                                            62             invert-pxl-clk    = <1>;    /* 添加这个选项设置为1 */                                        63         };重新编译设备树,重新启动,看效果。

AM335x kernel4.4.12 LCD 时钟翻转设置记录相关推荐

  1. jquery模拟LCD 时钟

    查看效果网址:http://keleyi.com/keleyi/phtml/jqtexiao/24.htm 以下是HTML文件源代码: 1 <!DOCTYPE html PUBLIC " ...

  2. bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...

    bootloader功能介绍 初始化开发板上主要硬件(时钟,内存,硬盘), 把操作系统从硬盘拷贝到内存,然后让cpu跳转到内存中执行操作系统. boot阶段 1.关闭影响CPU正常执行的外设 -关闭看 ...

  3. 时钟翻转事件_开发人员和时钟翻转

    时钟翻转事件 Let's party like it's 1999! 让我们狂欢吧,就像1999年一样! You have probably written programs with a bug r ...

  4. 在Ubuntu 12.04 桌面上设置启动器(快捷方式)

    在Ubuntu 12.04 桌面上设置启动器(快捷方式)过程讲解: 如下图所示,Eclipse 和 SQLDeveloper 都可以直接双击打开,这些应用程序的启动器都在 /usr/share/app ...

  5. HDLBits 系列(19) 12小时时钟的Verilog设计

    目录 背景 原题复现 审题 我的设计 设计解释 欢迎加入 背景 这篇博客设计一个12小时的时钟,通过例化4bit BCD码计数器来设计,如果你给予的时钟周期是1s,则能够当做时钟来用哦. 原题复现 原 ...

  6. 跨时钟域设置set_false_path的问题

    问题: 请教下:两个异步时钟域有path, 但是都经过了同步. 应该怎么约束这种异步path? 直接设置成false path 是否可以,为什么好多 ip的这种path 都通过set max dela ...

  7. STM32系统时钟默认设置

    "我们一直都说STM32有一个非常复杂的时钟系统,然而在原子或者野火的例程中,只要涉及到时钟,我们却只能看到类似的库函数调用,如RCC_APB2PeriphClockCmd(RCC_APB2 ...

  8. Java黑皮书课后题第3章:*3.30(当前时间)修改编程练习题2.8,以12小时时钟制显示小时数

    *3.30(当前时间)修改编程练习题2.8,以12小时时钟制显示小时数 题目 题目概述 运行示例 编程练习题2.8 破题 代码 题目 题目概述 *3.30(当前时间)修改编程练习题2.8,以12小时时 ...

  9. OPPO 12系统 无TalkBack设置 功能锁定 手撕

    OPPO 12系统 无TalkBack设置 功能锁定 手撕 群 662823771

最新文章

  1. AI传教士和野人渡河问题-实验报告
  2. 用Python对XML读取和处理
  3. 检索数据_10_通过多条件组合返回数据
  4. ckeditor和ckfinder的使用
  5. vsftpd 的配置项目
  6. sublime text 3安装及使用
  7. 可以无限增加iPhone 的图标吗?
  8. MySQL各个版本区别
  9. 深度学习笔记(1) 深度学习简介
  10. matlab如果不想立即在,科学计算与MATLAB 1.5
  11. 9.Memcached 介绍
  12. 2012年度IT博客大赛50强报道:张开涛
  13. 8位数码管动态显示字符
  14. 基于STM32F1的HMC5883L电子罗盘驱动——妈妈从此再也不担心我迷路了
  15. cad计算机绘图基础知识,CAD 计算机绘图基础课件.ppt
  16. 网页设计-动态雪花背景源码
  17. 通过虚拟机搭建个人NAS
  18. 卡通可爱的门户网站登录表单页面
  19. 知识点索引:幂函数性质
  20. Python3一篇学会“图像处理”的基本操作

热门文章

  1. houseparty不流畅_重新设计Houseparty –用户体验案例研究
  2. 视觉测试_视觉设计流行测验
  3. Git 内部原理图解——对象、分支以及如何从零开始建仓库
  4. SaltStack的salt-ssh使用及LAMP状态设计部署
  5. leetcode53 Maximum Subarray 最大连续子数组
  6. 通过iscsi配置在aix上挂载存储设备
  7. @action 注解
  8. 怎么快速了解自己的MySQL服务器?
  9. Android UI设计系统-android selector 开始自定义样式
  10. nginx+tomcat8+memcached实现session共享具体操作