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口的输入输出配置。 展开
#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口的输入输出配置。 展开
3个回答
2011-04-01
展开全部
个人的见解:
1、驱动算是底层的东西,它加载后在用户层也就是文件系统中会生成一个设备文件,一般在/dev目录下。
2、应用程序就是看名字就是应用层的,它就是利用上面所说的设备文件跟底层联系的。所以应用层开发只需对设备文件进行操作就行了。
3、QT的话,其实是属于应用层的,具体就baidu一下QT移植与开发。
另外,团IDC网上有许多产品团购,便宜有口碑
1、驱动算是底层的东西,它加载后在用户层也就是文件系统中会生成一个设备文件,一般在/dev目录下。
2、应用程序就是看名字就是应用层的,它就是利用上面所说的设备文件跟底层联系的。所以应用层开发只需对设备文件进行操作就行了。
3、QT的话,其实是属于应用层的,具体就baidu一下QT移植与开发。
另外,团IDC网上有许多产品团购,便宜有口碑
追问
大哥,你答非所问吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我不知道你用的那个版本的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接口并不是仅仅给你使用的.你自己写的命令字会把系统原有的给覆盖...
需要用到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接口并不是仅仅给你使用的.你自己写的命令字会把系统原有的给覆盖...
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
查看驱动部分管脚配置是不是和ARM板上一致。GPIO口,要查开发板电路
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询