shao890813 发表于 2012-4-16 17:40:52

tq6410的LED灯驱动加载以后测试程序不能通过

本帖最后由 shao890813 于 2012-12-17 09:26 编辑

          各位好,谢谢大家的关注,写的有点多,希望大家可以耐心的看下去,这两天在做TQ6410开发板的led灯驱动(Tq6410_leds.c是led的驱动程序,路径是内核源码的linu-3.0-rc6/drives/char/tq6410_leds.c),驱动用模块加载的方式加载到开发板上以后,测试程序不能通过,下面是我做的整个过程,内核是linu-3.0-rc6版本,交叉编译器是用4.6.0。
一.      在编译内核时,我把led驱动配置选项选成模块编译,在编译并成功将内核烧写到TQ6410开发板以后;

二.      用make modules编译leds的驱动,得到了tq6410_leds.ko文件;


三.      用nfs文件系统将tq6410_leds.ko文件放到开发板的/mn/usr/bin/目录下,用insmod命令加载成功;

# cd /mnt/usr/bin
# insmod tq6410_leds.ko
TQ6410 LEDs driver successfully probed
# lsmod
Module                  SizeUsed by    Not tainted
tq6410_leds             10540
rt3070sta             5666200
libertas_sdio         76300
libertas               455101 libertas_sdio
rt73usb                198540
rt2x00usb               76221 rt73usb
rt2x00lib            269562 rt73usb,rt2x00usb
zd1211rw               468290
mac80211            1846753 rt2x00usb,rt2x00lib,zd1211rw
cfg80211            1370554 libertas,rt2x00lib,zd1211rw,mac80211
同时我对比了一下开发板上的/dev/目录下加载前后确实是多了一个tq6410_leds设备,这里我列出来了一些设备(只是一部分)
crw-rw----    1 root   root       10, 126 Aug 18 06:50 s3c-g2d
crw-rw----    1 root   root      116,33 Aug 18 06:50 timer
crw-rw----    1 root   root       10,60 Aug 18 06:50 tq6410-adc
crw-rw----    1 root   root       10,59 Aug 18 06:50 tq6410-angle
crw-rw----    1 root   root       10,61 Aug 18 06:50 tq6410-backlight
crw-rw----    1 root   root       10,62 Aug 18 06:50 tq6410-beep
crw-rw----    1 root   root       10,57 Aug 18 06:50 tq6410-button
crw-rw----    1 root   root       10,52 Aug 18 06:55 tq6410-leds
crw-rw----    1 root   root       10,58 Aug 18 06:50 tq6410-shutdown
crw-rw----    1 root   root      5,   0 Aug 18 06:50 tty
crw-rw----    1 root   root      4,   0 Aug 18 06:50 tty0
crw-rw----    1 root   root      4,   1 Aug 18 06:50 tty1

      但这里我发现一个问题,加载前后用cat /proc/devices/没有发现tq6410-leds,只有一个主设备号一样是10的misc杂项。这个问题我还是可以退一步理解,可能是因为主设备号为10的有很多,在/proc/devices这个里面看到的只是主设备号不一样的,所以我想在这里顺便问一下,我能用什么方式看到这里面所有的设备呢?(问题1)


# cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
14 sound
21 sg
29 fb
81 video4linux
89 i2c
90 mtd
108 ppp
116 alsa
128 ptm
136 pts
166 ttyACM
180 usb
188 ttyUSB
189 usb_device
204 ttySAC
250 ttySDIO
251 ubi0
252 xz_dec_test
253 bsg

四. 下面是我按照韦东山Linux视频第1期第12课第二节字符设备之LED 驱动编写的一个最简单的测试程序led_test.c,用arm-linux-gcc编译成功了led_test执行文件。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

Int main (int argc, char **argv)
{
      Int fd;
Int val = 1;
Fd = open(“/dev/tq6410_leds”,O_RDWR);
If (fd<0)
                Printf (“can`t open!\n”);
Else
                Printf (“hello!tq6410_leds!\n”);
Write (fd, &val, 4);
Return 0;
}
五.      将led_test用nfs文件系统上传到开发板的/mnt/usr/bin/目录下,然后执行./led_test,下面是终端出来的结果
# ./led_test
can`t open!
这里按道理不应该显示这个结果的,leds既然加载到开发板了,fd应该是个正值才对,这里是我的第二个问题

TQ-lkp 发表于 2012-4-17 09:29:58

这里有我们提供的源码,你看下http://bbs.embedsky.net/forum.php?mod=viewthread&tid=10449&highlight=%D4%B4%C2%EB

shao890813 发表于 2012-4-18 10:00:56

明白了
/proc/devices/中的设备是通过insmod加载到内核的,它可产生一个major供mknod作为参数。
/dev/*.* 是通过mknod加上去的,格式:mknod device1 c/b major minor 如:mknod dr1 c 254 0,用户通过此设备名来访问你的驱动。
谢谢超级moderator的回复,谢谢
页: [1]
查看完整版本: tq6410的LED灯驱动加载以后测试程序不能通过