- 论坛徽章:
- 0
|
驱动的学习方法!!!请大家拍砖!!
你是想知道灯究竟是怎么亮起来的..
关键是能明白下面两段代码...
先看static ssize_t s3c2410_DbLed_write(struct file *file,const char
*buffer,size_t count,loft_t *ppos)
给你提个问题,这个函数是在什么时候使用的呢???
就是说什么时候调用的...
不知道?
正常...........................
你看过用户的测试程序没有...用户的测试程序中有个write函数.....
设备文件都有对应的fileoperation结构,在这里面定义了s3c2410_DbLed_write,当你的用户测试调用write的时候,设备驱动程序中的s3c2410_DbLed_write就会被调用..
具体是怎么从用户空间的write到内河中的s3c2410_DbLed_write是怎么传递参数的,不是几句话能说清楚的.....还需要用到了一个内河的write(不同用湖空间的write函数)函数..好象很少的书上都提到这点......
接着看,
s3c2410_DbLed_write里面有个函数
Copy_from_user(&ledstatus,buffer,sizeof(ledstatus));
可能你不是非常清楚的理解这个函数的具体实现...
但是相信你一定知道这个函数差不多能完成些什么功能吧...
对不??因为几乎所有的驱动的书上都提到了..
这个函数是在内河中使用的.从buffer中拷贝字符!!
拷贝到哪里?为什么拷贝??
先说为什么拷贝..
比如说,你有4个小灯,你想点亮二号灯.你得通知驱动程序吧...
你就可以把2这个数字放在buffer.
从函数的参数中可以看出,buffer拷贝到ledstatus中了.
为什么不能在用的时候直接使用呢??
要是你不清楚内河空间和拥护空间这两个概念的话.这个问题问的相当有水平了.
对,就是这两个空间在作怪,让你不能直接使用.
放在ledstatus中之后,怎么使用的呢??
到这里只要你能都想清楚,,80%以上的工作都应该完成了..
虽然我们还没有看到关键的操作硬件的代码..
看下一个函数,Updateled();!!
这个函数的作用是更新led灯!!!!!!!!!!!!!!!!!!!从函数名上就可以看出来...
怎么更新的呢?
漫漫看...
看到if (ledstatus & (1 <<i) )没有??
这时候知道从用户状态传过来的信息怎么用的了吧...
??
别告诉我还不明白!!!会吐血的...
里面又调用了一个函数 write_gpio_bit(LED,1);
说了那么多,,,其实真正和硬件打交道的就是这个函数...
怎么打交道的呢???....
我也没看到你在哪里实现的这个函数...哈哈
但是肯定是要有的.......
Updateled();
static void Updateled(void) //更新LED。
{
int i;
for (i=0;i<NumberOfLed;i++){
if (ledstatus & (1 <<i) )
write_gpio_bit(LED,1);
else
write_gpio_bit(LED,0);
}
}
static ssize_t s3c2410_DbLed_write(struct file *file,const char
*buffer,size_t count,loft_t *ppos)
{
Copy_from_user(&ledstatus,buffer,sizeof(ledstatus));
Updateled();
DPRINTK(“write: led= 0x %x, count=%d \n“, ledstatus,count);
Return sizeof(ledstatus);
}
很多人都说ldd写的非常好..
个人在看那书的时候感觉不到有什么收获...
云里雾里啊...
不过等现在翻翻字符设备那个单元,发现写的还是很有道理的..
但是如果基础非常差的话(像我)是非常不适合看这本书的.....呵呵...可能有人不同意...
大家没有发现这本书里面把知识点讲解的太散了吗??
没有一定的基础很难把散的知识点融会成一体的...
可能是自己比较笨,很难理解大师们的智慧吧...
有没有什么好的书呢???可能有吧.至少本人还没看到适合自己的.....
驱动的书籍,是不是先整个简单的驱动代码从头到尾给大家分析一下,然后在从特殊过度到一般,讲解驱动中的函数.....???这样比较好呢???
请大家拍砖...
如果有必要请斑竹从新发个帖子,大家讨论下驱动的学习心得............... |
|