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应该是个正值才对,这里是我的第二个问题
这里有我们提供的源码,你看下http://bbs.embedsky.net/forum.php?mod=viewthread&tid=10449&highlight=%D4%B4%C2%EB 明白了
/proc/devices/中的设备是通过insmod加载到内核的,它可产生一个major供mknod作为参数。
/dev/*.* 是通过mknod加上去的,格式:mknod device1 c/b major minor 如:mknod dr1 c 254 0,用户通过此设备名来访问你的驱动。
谢谢超级moderator的回复,谢谢
页:
[1]