arm linux驱动程序和应用程序之间的一些问题

我的驱动程序:#defineDEV_NAME"my_led"#defineDEV_MAJOR242#defineLED_ON1#defineLED_OFF0structc... 我的驱动程序:
#define DEV_NAME "my_led"
#define DEV_MAJOR 242
#define LED_ON 1
#define LED_OFF 0

struct cdev dev;

static int leds_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
if (arg > 4)
{
return -EINVAL;
}

switch(cmd)
{
case LED_ON:
s3c2410_gpio_setpin(led_table[arg], 0);
return 0;

case LED_OFF:
s3c2410_gpio_setpin(led_table[arg], 1);
return 0;

default:
return -EINVAL;
}
}

static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.ioctl = leds_ioctl,
};

static int __init leds_module_init(void)
{
int i,value_return;

struct class *myclass=class_create(THIS_MODULE,"my_led_driver");

value_return= register_chrdev_region(MKDEV(DEV_MAJOR, 0),1, DEV_NAME);

if ( value_return< 0 )
{
printk(DEV_NAME "can't init \n");
return ( value_return );
}

cdev_init(&dev, &dev_fops);
dev.owner = THIS_MODULE;
cdev_add(&dev, MKDEV(DEV_MAJOR, 0), 1);

for (i = 0; i < 4; i++)
{
s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
s3c2410_gpio_setpin(led_table[i], 1);
}

device_create(myclass,NULL,MKDEV(DEV_MAJOR, 0),NULL,"my_led");

printk(DEV_NAME" module is installed !\n");
return 0;
}

static void __exit leds_module_exit(void)
{
cdev_del(&dev);
unregister_chrdev_region(MKDEV(DEV_MAJOR, 0),1);
printk(DEV_NAME" module was removed!\n");
}

module_init(leds_module_init);
module_exit(leds_module_exit);

应用程序如下:
void main(void)
{
int fd;
unsigned int cmd=1;
//unsigned long ar.g=0;
fd = open("/dev/mtd2", O_RDWR);
printf("fd=%d\n",fd);

if (fd < 0)
{
perror("can't open device leds");
exit(1);
}

ioctl(fd,cmd,0);
ioctl(fd,cmd,1);
ioctl(fd,cmd,2);
ioctl(fd,cmd,3);

close(fd);
//return 0;
}

驱动程序在arm板上加载后能够产生设备文件:
crw-rw---- 1 root root 242, 0 Mar 4 16:05 my_led

但我运行应用程序led没任何反应(原本是想让4盏灯全亮的),我学嵌入式不久,有没有人能帮忙看看是哪里出了问题,设备文件能够自动创建,应该应用程序出问题的可能性大点吧,还有就是关于open函数的问题,它的返回值fd是设备描述符?我把fd打印出来了,发现fd=3,而且每次都是,我试过打开其他设备文件也是3?会不会这里出问题了。 字数限制,头文件没列出来,其中led_table []是IO的定义,led_cfg_table []是IO口的输入输出配置。
展开
 我来答
匿名用户
2011-04-01
展开全部
个人的见解:
1、驱动算是底层的东西,它加载后在用户层也就是文件系统中会生成一个设备文件,一般在/dev目录下。
2、应用程序就是看名字就是应用层的,它就是利用上面所说的设备文件跟底层联系的。所以应用层开发只需对设备文件进行操作就行了。
3、QT的话,其实是属于应用层的,具体就baidu一下QT移植与开发。
另外,团IDC网上有许多产品团购,便宜有口碑
追问
大哥,你答非所问吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
handsoul
2011-04-01 · TA获得超过955个赞
知道小有建树答主
回答量:500
采纳率:0%
帮助的人:755万
展开全部
我不知道你用的那个版本的kernel,但是据我所知,ioctl的cmd参数的定义,不是你那么简单的....

需要用到ioctl的命令字定义的几个宏定义...

自己定义是没有用的,因为ioctl需要知道你的命令是io读还是io写..

比如在我的程序里面我这样定义命令字...

你自己查一下_IOW,_IO这两个宏...

#include <linux/ioctl.h>//使用下面的宏

#define DEVICE_NAME "/dev/test_device"
#define TEST_MAGIC_NUM 'k'
#define PORT_SET _IOW(TEST_MAGIC_NUM,1,int)
#define PORT_GET _IO(TEST_MAGIC_NUM,2)
#define PORT_LOCK _IO(TEST_MAGIC_NUM,3)

你的应用程序中,也应该把这样定义的命令字给包含进去...这两个个宏的意义是,不要和系统已经使用ioctl的cmd重复...因为ioctl接口并不是仅仅给你使用的.你自己写的命令字会把系统原有的给覆盖...
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
langqiong261
2011-04-01 · TA获得超过1161个赞
知道小有建树答主
回答量:1175
采纳率:0%
帮助的人:1191万
展开全部
查看驱动部分管脚配置是不是和ARM板上一致。GPIO口,要查开发板电路
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式