Chinaunix

标题: 有关Linux LCD驱动源码的疑惑 [打印本页]

作者: 星闪夜空    时间: 2013-01-16 19:16
标题: 有关Linux LCD驱动源码的疑惑
    这一个多星期主要在搞Linux LCD驱动,期间对内核源码中的drivers/video/s3c2410fb.c文件产生了一些疑惑如下:

   首先请看如下的两张图片
   
   
   
   

    接下来就是我的疑问了:modify_gpio(S3C2410_GPCUP,  mach_info->gpcup,  mach_info->gpcup_mask);中的S3C2410_GPCUP是物理地址啊?怎么能够直接访问呢?不是应该先向操作系统申请,然后再进行虚实地址映射后才可以使用吗?
   不知道我的分析错在哪里了,希望大家能够帮助我解决这个问题。


   
作者: 摆钟12点    时间: 2013-01-19 18:31
LZ确定S3C2410_GPCUP是物理地址?
作者: 星闪夜空    时间: 2013-01-19 18:48
嗯,确定,请看我从内核中拷贝的代码:
#define S3C2410_GPCUP           S3C2410_GPIOREG(0x2

#define S3C2410_GPIOREG(x) ((S3C24XX_PA_GPIO + (x)))

#define S3C24XX_PA_GPIO     S3C2410_PA_GPIO

#define S3C2410_PA_GPIO           (0x56000000)

从中可以看出S3C2410_GPCUP为0x56000028 与S3C2440芯片手册上的一样,为物理地址。
作者: wibnmo    时间: 2013-01-22 10:55
readl/writel用的都是虚拟地址, 你代码可能跟的不对
作者: fedorayang    时间: 2013-01-22 13:06
驱动是最底层了,直接对硬件进行操作,不需要向操作系统申请。我是这样理解的,前段时间调试网卡驱动,也是这样的,驱动直接对寄存器操作,没有进行虚拟地址转换,其他模块也是如此吧
作者: 睡不死    时间: 2013-02-24 00:39
回复 5# fedorayang


        。。。访问外设的寄存器一般都通过其它的通信方式去访问的,readl/writel是不行的,你看看读写该寄存器的函数实现是什么就知道了
作者: 星闪夜空    时间: 2013-02-25 09:02
回复 4# wibnmo
     感谢你的帮助,不好意思啊,在家没有网,所以到现在才回复。我的代码是从Linux内核源码中拷贝来的,并且单独复制出来修改编译成模块,所以代码跟的没有问题。


   
作者: 星闪夜空    时间: 2013-02-25 09:19
回复 5# fedorayang
    感谢你的帮助,因为在家里没有网,所以到现在才回复。
   现在来说说我的看法。首先,我认为应该先向操作系统申请物理地址。打个比喻,假定物理存在一座房子(相当于物理地址),你(相当于驱动)在不向房管局(相当于操作系统)申请并获得批准的情况下,可以住进去吗?当然可以!但是你不要忘了,此时房管局并不知道你住了该房子,在房管局的信息系统中显示的是该房子没有住人,所以当我(相当于另一个驱动)向房管局提出申请要住你现在的房子的时候,会得到批准,于是我就会与你分享同一间房子(相当于两个驱动同时操控同一个硬件),这是不允许出现的情况。
   其次,物理地址应该虚实地址映射后才可以使用。因为Linux操作系统下都必须使用虚拟地址才能对内存进行合法访问。


   
作者: 星闪夜空    时间: 2013-02-25 09:27
回复 6# 睡不死
    readl/writel是使用I/O内存地址空间与硬件进行通信的内核老API,现在还在使用。


   
作者: xmayyang    时间: 2013-03-16 09:43
是否LCD子系统在mem子系统之前初始化的?内存管理任务还没启来,所以不能使用虚拟地址?
我猜的,呵呵
作者: leon_yu    时间: 2013-05-21 18:12
你把代码再跟一遍,S3C2410_GPCUP是物理地址???
作者: 星闪夜空    时间: 2013-05-24 21:31
回复 11# leon_yu

    谢谢你的提醒,不过我可以肯定S3C2410_GPCUP是物理地址,我查看的是Linux2.6.22的源代码,详细请见3楼。


   
作者: Yan_2013    时间: 2013-05-27 11:33

#define S3C2410_GPIOREG(x) ((x) + S3C24XX_VA_GPIO)

特意去看了下kernel源码,发现同学你确实找错了!!已经转换为va了
作者: 星闪夜空    时间: 2013-06-08 19:29
回复 13# Yan_2013
    非常感谢你的解答,我又去找了一遍,确实是我错了!!!S3C2410_GPCUP是虚拟地址。
   
作者: xifanlover    时间: 2013-06-26 15:18
我说的不一定对,仅供参考:
    一些寄存器什么的,基本都是片内RAM,所以,你直接可以用物理地址操作。但是举个例子,u盘,他有自己的存储空间,你往他的空间里写东西,如果直接用物理地址就不行了。需要把u盘的地址空间映射到虚拟地址,再对这虚拟地址空间操作,才是合理的。
希望大神们给点专业的意见。
作者: linuxforfun    时间: 2013-09-16 22:51
那个S3C2410_GPCUP不是物理地址,源代码贴错了
作者: 星闪夜空    时间: 2013-09-17 07:30
回复 16# linuxforfun

嗯,你说的很对,确实贴错了,谢谢!!!
   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2