nano-pc-t1 4412 显示驱动分析

1. 和其它内核代码类似。

     显示驱动的分析都是由 drivers/video/fbmem.c开始,fbmem.c是显示驱动的抽象,实际只是一个框架性的东西。

     fbmem_init 中实现了一个字符设备驱动,并创建了class,但是没有生成设备文件。

    这个字符设备驱动的file_operations里面的函数,实质上都是从struct fb_info *registered_fb[FB_MAX]   这个

    fb_info的结构体数组中去调用 fb_ops 这个结构体中函数指针。数组下标为次设备号。那么这个结构体是如何赋值的

     呢?

    fbmem.c里定义 register_framebuffer这个函数。真正的显示设备都是调用这个函数来给registered_fb这个数组赋值,

   然后再去创建设备文件。


2.  我们搜索register_framebuffer这个文件,有如下几处:

     drivers/gpu/drm/drm_fb_helper.c

     drivers/video/s3c-fb.c


3. 我们先来看看s3c-fb.c

    这个文件注册了一个平台总线设备驱动程序,在其probe函数中调用 register_framebuffer。

    那么这个驱动的probe的函数什么时候调用呢?

    接下来我们看一下内核中实现平台总线驱动代码,注意,平台总线驱动是内核实现的。


4. drivers/base/platform.c

    主要看platform_match这个函数,也就是平台总线设备驱动和平台总线设备是如何匹配的,知道了匹配规则,我们

    就知道如何去需找对应的平台设备了。

    先看这句话

    if (pdrv->id_table)
        return platform_match_id(pdrv->id_table, pdev) != NULL;

   return (strcmp(pdev->name, drv->name) == 0);

    如何平台总线设备驱动中有id_table的话,那么调用platform_match_id这个函数。

   我们再看一下platform_match_id函数做个什么。

   while (id->name[0]) {
        if (strcmp(pdev->name, id->name) == 0) {
            pdev->id_entry = id;
            return id;
        }
        id++;
    }

    很显然,就是拿平台总线设备的name去挨个比较平台总线设备驱动的id_table,匹配成功测返回id。

    如果没有匹配成功,则再去比较平台总线设备的名称和平台总线驱动的名称。也就是

   return (strcmp(pdev->name, drv->name) == 0);  这句。

   一旦匹配成功,那么内核会自动调用平台总线设备驱动的probe函数。


5.  那么接下来,我们就看看s3c-fb.c这个文件里实现的平台总线设备驱动程序的name和id_table

    static struct platform_driver s3c_fb_driver = {
    .probe        = s3c_fb_probe,
    .remove        = s3c_fb_remove,
    .id_table    = s3c_fb_driver_ids,
    .driver        = {
        .name    = "s3c-fb",
        .owner    = THIS_MODULE,
        .pm    = &s3cfb_pm_ops,
    },
};

static struct platform_device_id s3c_fb_driver_ids[] = {
    {
        .name        = "s3c-fb",
        .driver_data    = (unsigned long)&s3c_fb_data_64xx,
    }, {
        .name        = "s5pc100-fb",
        .driver_data    = (unsigned long)&s3c_fb_data_s5pc100,
    }, {
        .name        = "s5pv210-fb",
        .driver_data    = (unsigned long)&s3c_fb_data_s5pv210,
    }, {
        .name        = "exynos4-fb",
        .driver_data    = (unsigned long)&s3c_fb_data_exynos4,
    }, {
        .name        = "exynos5-fb",
        .driver_data    = (unsigned long)&s3c_fb_data_exynos5,
    }, {
        .name        = "s3c2443-fb",
        .driver_data    = (unsigned long)&s3c_fb_data_s3c2443,
    }, {
        .name        = "s5p64x0-fb",
        .driver_data    = (unsigned long)&s3c_fb_data_s5p64x0,
    },
    {},
};

  有了第4点的分析,我们可以搜索上面红字部分来查找对应的平台总线设备了。


6.  搜索"s3c-fb",找到了

   arch/arm/plat-samsung/devs.c这个文件

    搜索"exynos4-fb",找到了

    arch/arm/mach-exynos/common.c

      其它name,我们应该不用理会,都是其它soc名称。


   在devs.c里定义了

   struct platform_device s3c_device_fb = {
    .name        = "s3c-fb",
    .id        = -1,
    .num_resources    = ARRAY_SIZE(s3c_fb_resource),
    .resource    = s3c_fb_resource,
    .dev        = {
        .dma_mask        = &samsung_device_dma_mask,
        .coherent_dma_mask    = DMA_BIT_MASK(32),
    },
}; 

   在common.c里是这句 s5p_fb_setname(0,"exynos4-fb");

   展开实际是这样s5p_device_fimd0.name = name;

   struct platform_device s5p_device_fimd0 = {
    .name        = "s5p-fb",    这块被改为了 "exynos4-fb"
    .id        = 0,
    .num_resources    = ARRAY_SIZE(s5p_fimd0_resource),
    .resource    = s5p_fimd0_resource,
    .dev        = {
        .dma_mask        = &samsung_device_dma_mask,
        .coherent_dma_mask    = DMA_BIT_MASK(32),
    },
};

    从以上分析,实际定义了两个设备,"s3c-fb","exynos4-fb"。


7. 现在,找到了,平台总线的设备和驱动后,我们要做的主要事情就是去修改lcd的各种参数,主要是fb_info结构体

    的fb_var_screeninfo结构体,这里面记录了lcd的主要9个参数。

   行前肩,行后肩,行同步信号脉宽,帧前肩,帧后肩,帧同步信号脉宽,像素时钟频率,x轴像素点,y轴像素点。

    分析了s3c_fb.c文件后,发现是这句来赋值,fb_videomode_to_var(&fbinfo->var, &initmode);

    经过再次分析后,实际数据是来源于平台总线设备中,pd = pdev->dev.platform_data;


8.  那么我们再次回到devs.c这个文件,因为上面两个平台总线设备均定义在次文件中。

    但是查看s3c_device_fb和s5p_device_fimd0这两个平台设备结构体后,没有发现platform_data。那么一定是后面

   专门有赋值的地方。查找后,发现

   void __init s3c_fb_set_platdata(struct s3c_fb_platdata *pd)
{
    s3c_set_platdata(pd, sizeof(struct s3c_fb_platdata),
             &s3c_device_fb);
}

void __init s5p_fimd0_set_platdata(struct s3c_fb_platdata *pd)
{
    s3c_set_platdata(pd, sizeof(struct s3c_fb_platdata),
             &s5p_device_fimd0);
}

   经过搜索发现,s5p_fimd0_set_platdata在 下面文件中调用,

  arch/arm/mach-exynos/mach-nanopc-t1.c

   arch/arm/mach-exynos/mach-smdk4x12.c  这个文件应该没用

   s3c_fb_set_platdata没有被任何地方调用,那么s3c_device_fb这个设备应该没有用处,我认为应该去掉。


9. 接下来我们主要分析s5p_device_fimd0这个设备。

    在mach-nano-t1.c 这句 两句

    nanopc_fb_init_pdata(&nanopc_fb_pdata);

    s5p_fimd0_set_platdata(&nanopc_fb_pdata);

    实际真正的数据是在nanopc_fb_pdata中,并且在nanopc_fb_init_pdata中得到的值

    再看nanopc_fb_init_pdata这个函数,发现以下几句

    lcd = tiny4412_get_lcd();

     mode->left_margin    = lcd->timing.h_bp;
    mode->right_margin    = lcd->timing.h_fp;
    mode->upper_margin    = lcd->timing.v_bp;
    mode->lower_margin    = lcd->timing.v_fp;
    mode->hsync_len        = lcd->timing.h_sw;
    mode->vsync_len        = lcd->timing.v_sw;
    mode->xres            = lcd->width;
    mode->yres            = lcd->height;

    数据实际来源于tiny4412_get_lcd()。

    tiny4412_get_lcd定义在

    arch/arm/mach-exynos/tiny4412-lcds.c

     到此,我们终于找到各种屏的参数定义,并且还有hdmi参数的定义。

   
    待续

   

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql中索引约束有哪些_Mysql中索引和约束的示例语句

外键查询一个表的主键是哪些表的外键SELECTTABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAMEFROMINFORMATION_SCHEMA.KEY_COLUMN_USAGEWHERETABLE_SCHEMA mydbnameAND REFERENCED_TABLE_NAME 表名;导出所有外键语句SELECTCONCAT(ALTER …

taskkill无法终止进程 拒绝访问_解决删除文件时,提示无法删除的问题

有时我们想删除某个程序文件夹,或是卸载后残留的一些 .dll 等后缀的文件,却一直提示 “运行中” 、 “权限不足” ,甚至用第三方的强力删除功能都无法删除。这时我们可以用系统自带的命令行功能,使用几个简单的小命令就可以彻底删…

javascript删除数组里的对象

Array.prototype.del function(value) {//删除数组中指定的元素&#xff0c;返回新数组function hasValue(array, value) {for(var i 0; i < array.length; i) {if (value array[i]) {return i;}}return -1;}var position hasValue(this, value);var temp new Array ;i…

擦窗机器人测试标准_擦窗机器人,我选择玻妞的三个理由!

很多人都喜欢高层&#xff0c;一览无遗&#xff0c;广阔风景&#xff01;可现实是无论什么高层湖景都会被窗户上日积月累的灰尘遮挡的严严实实&#xff0c;每次擦窗都累到怀&#xff01;疑&#xff01;人&#xff01;生&#xff01;于是一年又一年&#xff0c;你想要的风景始终…

Oracle客户端与java_Oracle 谈 JavaFX 及 Java 客户端技术的未来

原标题&#xff1a;Oracle 谈 JavaFX 及 Java 客户端技术的未来据 Oracle 博客称&#xff0c;从 JDK 11 开始&#xff0c;Oracle 将从 JDK 中删除 JavaFX&#xff0c;但在 2022 年之前&#xff0c;Oracle 还会继续为 JDK 8 中的 JavaFX 提供商业支持。2011 年&#xff0c;JavaF…

基于Passthru的NDIS开发的个人理解

基于Passthru的NDIS开发的个人理解 这几天对NDIS的学习&#xff0c;基本思路是&#xff1a;首先熟悉理论知识→然后下载一个例子进行研究→最后例子自己模仿扩展→最最后尝试自己写一个新的。 Passthru是微软NDIS自己写的一个框架驱动&#xff0c;NDIS开发者可以在此框架上进行…

Conversion to Dalvik format failed with error 1

如题&#xff0c;解决办法是将工程中的 Android Private Libraries移除即可

char类型包括数字吗java_Java char 与 Character

1. java中char类型占2个字节、16位能够存放汉子&#xff0c;字母和数字占一个字节&#xff0c;一个字节8位&#xff0c;中文占2个字节&#xff0c;16位&#xff1b;java2. char类型赋值编码char a’a’; //任意单个字符&#xff0c;加单引号。char a’中’;//任意单个中文字&am…

HDOJ 4253 Two Famous Companies 二分+MST

题目意思&#xff1a;给出n个点&#xff0c;m条边&#xff0c;边分为两种&#xff0c;一种是A公司的&#xff0c;一种是B公司的。边上有权值&#xff0c; 问用n-1条边把n个点连起来的最小费用是多少&#xff0c;其中A公司的边刚好有k条。题目保证有解。 题解&#xff1a;题目意…

低代码开发平台_低代码开发平台测评——伙伴云

​本次测评的产品严格来说不算低代码开发平台&#xff0c;它自己给自己的定位更多是全流程数据生产力平台。不过它依然具备应用搭建的关键要素&#xff0c;而且在数据管理方面还比较出彩&#xff0c;所以不能放过它——伙伴云&#xff0c;这款由Discuz&#xff01;主创团队操刀…

java 返回js_如何基于java或js获取URL返回状态码

这篇文章主要介绍了如何基于java或js获取URL返回状态码,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参fgLAeaGAH考下描述&#xff1a;使用java或者js访问某个网站&#xff0c;返回状态码1.java实现// 用getResponse…

Linux 信号signal处理函数

alarm&#xff08;设置信号传送闹钟&#xff09; 相关函数 signal&#xff0c;sleep 表头文件 #include<unistd.h> 定义函数 unsigned int alarm(unsigned int seconds); 函数说明 alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数se…

我的开发环境配置经验

我的开发环境配置经验 http://chinasf.cnblogs.com/archive/2010/01/07/1640960.html本人做开发&#xff0c;偶尔重装下系统&#xff0c;比如换电脑了&#xff1b;或者是visual studio 该升级了&#xff0c;或者是系统坏掉了&#xff1b;每次装好后&#xff0c;我都会做备份&am…

python database ioerror_python – IOError:[Errno 2]没有这样的文件或...

我试图在我的MySQL数据库的表的路径中添加所有种子文件的一些信息,但似乎我有一些PATH问题.你可以看到有完整的路径,它甚至检测到“charlie.torrent”,所以我真的不明白是什么问题.这是我的代码&#xff1a;#!/usr/bin/env python# -*- coding: utf-8 -*-import mysql.connecto…

A20修改串口设备文件

目标&#xff1a;将uart2的设备文件修改为ttyS6&#xff0c;反之亦然 将uart1的设备文件修改为ttyS5&#xff0c;反之亦然 修改“drivers/tty/tty_io.c"文件 找到tty_line_name(driver,index,name)这行&#xff0c;这行是用来生成设备文件的名称。 在这行前加上一下几句…

php 返回数组 键名,php array_keys 返回数组的键名

array_keys返回数组中部分的或所有的键名说明array array_keys ( array $array [, mixed $search_value [, bool $strict false ]] )array_keys() 返回 $array 数组中的数字或者字符串的键名。如果指定了可选参数 search_value&#xff0c;则只返回该值的键名。否则 $array 数…

C#中ref与out区别

static void Main(string[] args){//out testint a, b;//out使用前&#xff0c;变量可以不赋值outTest(out a, out b);Console.WriteLine("a{0};b{1}", a, b);int c 11, d 22;outTest(out c, out d);Console.WriteLine("c{0};d{1}", c, d);//ref testint…

安装好了python环境后如何打开_教你如何安装Python环境

欢迎同学们来到Python编程世界。人生苦短&#xff0c;Python是岸。01 初见PythonPython编程语言是荷兰人Guido van Rossum在1990年代开发出来的。Gudio拥数学和计算机双硕士学位&#xff0c;但他更喜欢计算机。当时Gudio觉得现有的编程语言无法做到既实用又能够轻松编程&#x…

A20串口驱动分析

串口驱动的整体框架实际上和显示驱动类似 驱动程序是一个字符设备&#xff0c;驱动的实质内容都是在一个平台总线设备驱动程序里 1. 串口驱动的分析&#xff0c;从"drivers/tty/serial/8250/8250.c"开始 serial8250_init为入口函数&#xff0c;从这个函数一路分析下…

php vo 遍历,thinkPHP简单遍历数组方法分析

thinkPHP简单遍历数组方法分析文章主要介绍了thinkPHP简单遍历数组方法,结合实例形式分析了thinkPHP使用volist标签遍历数组的技巧,并对比分析了织梦cms的arclist标签加强对thinkPHP数组遍历的理解,需要的朋友可以参考下。本文实例分析了thinkPHP简单遍历数组方法。分享给大家供…