免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1771 | 回复: 1
打印 上一主题 下一主题

关于驱动程序和应用程序之间的问题,求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-31 19:54 |只看该作者 |倒序浏览
我的驱动程序如下:
#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,这是为什么?会不会这里出问题了。

论坛徽章:
0
2 [报告]
发表于 2011-04-01 09:13 |只看该作者
原来搞错了,返回的fd只是文件描述符,这是不是随机分配的?怎么每次都是3,有没有人能帮忙啊,刚开始学,找不出问题来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP