关于驱动程序和应用程序之间的问题,求解
我的驱动程序如下:
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
MODULE_LICENSE("GPL");
#define DEV_NAME "my_led"
#define DEV_MAJOR 242
#define LED_ON 1
#define LED_OFF 0
struct cdev dev;
static unsigned long led_table [] =
{
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB7,
S3C2410_GPB8,
};
static unsigned int led_cfg_table [] =
{
S3C2410_GPB5_OUTP,
S3C2410_GPB6_OUTP,
S3C2410_GPB7_OUTP,
S3C2410_GPB8_OUTP,
};
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);
应用程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
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,这是为什么?会不会这里出问题了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
原来搞错了,返回的fd只是文件描述符,这是不是随机分配的?怎么每次都是3,有没有人能帮忙啊,刚开始学,找不出问题来。