一些驱动代码的迷惑.
小弟刚看驱动.C语言不是很熟,比较生疏,
看完了misc设备的LED驱动能理解70%
但是恰恰好有个问题非常不懂.
static unsigned long led_out[]={
S3C2410_GPIO_OUTP,
S3C2410_GPIO_OUTP,
S3C2410_GPIO_OUTP,
S3C2410_GPIO_OUTP,
}
这里看到文件头式里将S3C2410_GPIO_OUTP定义为
#S3C2410_GPIO_OUTP (0x10<<0);
这里就不明白了,为什么要位移0位?有什么意义?
还有,看了很多函数都是位移,不明白这些位移对驱动有着什么实际的意义?
第二个问题是,在定义LED引脚时用的是无符号int,而定义寄存器用的是无符号long.
这里为什么要这样区分?定义引脚是否可以用ungisned long?
第三个问题是看到PWM(蜂鸣器)驱动时.
一来就看到了有个复合型定义:static struct semaphore lock;
然而在剩下的驱动就没有再看到semaphore的定义了,lock也没有赋值.就是说没有初始化.
那么这句话的赋值或者是定义在哪里?
PWM驱动:http://blog.csdn.net/garby2004/archive/2009/09/28/4604039.aspx
这些问题还请前辈们帮忙指导下.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
确实很困惑,我用source insight也没有挖出来
但是我看到
http://blog.csdn.net/garby2004/archive/2009/09/28/4604039.aspx
并没有定义#include<asm/semaphore.h>这个文件头.
其他两个问题大概的理解了.
但是最后一个问题还是不懂.
1、那是标准C的惯用方法。我也是猜测的,因为那是一条宏的定义。保证扩展后的宏更容易执行吧。
2、arm中规定,I/O操作中端口类型是unsigned int。寄存器是映射到内存,是unsigned long。虽然它们没有什么区别。
3、semaphore的定义位于#include<asm/semaphore.h>当中。
2)32位的cpu上,long和int字长是一样的。
3)init_MUTEX(&lock); 这里初始化了
位移0位应该没什么特殊意义吧,貌似更多的写成(1<< 4),对于GPIO来说比较形象的指出是第几个引脚吧。