llseek:
-EINVAL非法(无效)参数
当前位置 file->f_pos
SEEK_END pcdevp->data_len
定义的位置要在你的位置范围内唔
怎么处理 :最后要做个保存 file->f_pos =...
怎么驱动LED灯:看原理图,如果想让LED灯亮就收早相应的端口上输出相应的电平如果是led灯别一端接地,那就使其这端高电平,如果接的是三极管则要考虑三极管的导通,反之则。。。
编程使CPU得相应管脚设为输出管脚
控制该管脚输出高电平或低电平
阅读CPU手册设置相应寄存器如:CPC1CON GPC1DAT GPC1PUD
在linux下控制相应的GPIO管脚,有两种方式
1)直接操作相应的寄存器
2)通过内核提供的GPIO操作库函数
在用户空间采用两种方式控制LED的亮、灭
1)、dev/led0 dev/led1 ....
Cdev0 cdev1....
Fd0 =open(“/dev/led0”,O_RDWE)
Ioctl(fd,cmd,data);
Ioctl(fd0,1,0)
....
2) /dec/led/
cdev
Fd0 =open(“/dev/led0”,O_RDWE)
Ioctl(fd,cmd,data);
Ioctl(fd0,1,0)或ioctl(fd0,1,1)
....
包含头文件
#include<asm/gpio.h>
#include<plat/gpio-cfg.h>
Cdev到底在驱动程序中起到什么作用?桥梁作用?
用户空间 内核空间
Open xxx_open
*gpio申请
gpio_request(,);
gpio_free(unsigned gpio)
内核的调试
Printk
Printk会将信息打印到console或者/var/log/message文件中
在开发驱动时,往往会加入大量的printk 用于辅助调式
在发布驱动时,应该去掉加入大量printk语句
代码请看: http://songmao.blog.51cto.com/11700139/1876798
使用procfs文件系统
文件系统procfs也常常被用于内核向用户带出信息,设备驱动程序中可以使用它
输出调试信息
具体操作参考前面文件系统和设备文件系统中关于procfs文件系统介绍
Oops
详解请看: http://songmao.blog.51cto.com/11700139/1877971
Kgdb
内核奔溃值
<8f0000b8>
代码崩溃在内核还是在xxx.ko文件代码中
Cat /proc/kallsyms > 1.txt
代码崩溃在xxx。C文件的哪个函数中
arm-linux-objump -D vmlinux >3.txt
如Xxxx_open
push{r4,r5,r6,r7,fp,ip,lr,pc}
F3997b80 0000000 f34eldf4 ....
chrdev_open->xxx_open
push{r4,r5,r6,r7,fp,ip,lr,pc}
......
调式core文件
ulimit -a
Ulimit -c unlimited
gdb a.out -c core
详解请看:http://songmao.blog.51cto.com/11700139/1877998
本文出自 “毛散人” 博客,请务必保留此出处http://songmao.blog.51cto.com/11700139/1878001
原文地址:http://songmao.blog.51cto.com/11700139/1878001