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

代码崩溃在xxxC文件的哪个函数中

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