关于驱动程序和应用程序之间的问题,求解

发布于 2022-09-30 18:32:55 字数 6831 浏览 15 评论 0

我的驱动程序如下:
#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

原来搞错了,返回的fd只是文件描述符,这是不是随机分配的?怎么每次都是3,有没有人能帮忙啊,刚开始学,找不出问题来。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文