⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpioctl.c

📁 这是我学习驱动开发的第一个小程序. 控制LED灯的开和关. 共有两个文件 gpioctl.c 是驱动程序, main.c是LInux下的测试程序.
💻 C
字号:
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

#include <asm-arm/arch-at91rm9200/gpio.h>

MODULE_LICENSE("GPL");

#define DEVICE_MAJOR 244
#define DEVICE_NAME "gpioc"

#define GPIO_CMD0 0
#define GPIO_CONFIG 1
#define GPIO_IOCTL 2

#define GPIO_HIGH 1
#define GPIO_LOW 0

//#define GPIO_LINE_RS485 AT91_PIN_PB8
//#define GPIO_LINE_RS485 AT91_PIN_PA31
#define GPIO_LINE_RS485 AT91_PIN_PD23

// Pudn.com

typedef char gpioc_dev_t;
static gpioc_dev_t gpioc_devices[247];

static int gpioc_open(struct inode *inode, struct file *file)
{
    int minor;
    minor = MINOR(inode->i_rdev);
    gpioc_devices[minor]++;
    
    return 0;   /* succes */
}

static int gpioc_close(struct inode *inode, struct file *file)
{
    int minor;
    minor = MINOR(inode->i_rdev);
    
    if(gpioc_devices[minor])
        gpioc_devices[minor]--;
        
    return 0;   /* succes */
}

static int gpioc_ioctl(struct inode *inode, struct file *file, unsigned int command, unsigned long arg)
{
    int minor;
    minor = MINOR(inode->i_rdev);
    printk(KERN_ERR"kernel gpioc_ioctl() => cmd=%d, arg=%ld\n", command, arg);
    
    switch(command)
    {
    	case GPIO_CMD0:
	    break;
	case GPIO_CONFIG:
	    if(arg==0)
	        at91_set_gpio_output(GPIO_LINE_RS485, GPIO_LOW);
	    else
	        at91_set_gpio_input(GPIO_LINE_RS485, 0);
	    break;
	    
	case GPIO_IOCTL:
	    if(arg==0)
	        at91_set_gpio_value(GPIO_LINE_RS485, 0);
        else
	        at91_set_gpio_value(GPIO_LINE_RS485, 1);
	    break;
	    
	case 3://HIGH
	    at91_set_gpio_output(GPIO_LINE_RS485, 1);
	    at91_set_gpio_value(GPIO_LINE_RS485, 1);
	    break;
	    
	case 4://LOW
	    at91_set_gpio_output(GPIO_LINE_RS485, 0);
	    at91_set_gpio_value(GPIO_LINE_RS485, 0);
	    break;
	    
    }
    return 0;
}

static ssize_t gpioc_write( struct file *file, const char *buf, size_t count, loff_t *ppos)
{
    printk(KERN_ERR"gpioc_write()\n");
    return 0;
}


static struct file_operations gpioc_fops = 
{
    .owner = THIS_MODULE,
    .open = gpioc_open,
    .ioctl = gpioc_ioctl,
    .release = gpioc_close,
    .write = gpioc_write,
};

static int gpioc_init(void)
{
    int ret;
    ret = register_chrdev(DEVICE_MAJOR, DEVICE_NAME, &gpioc_fops);
    printk(KERN_ERR"register gpioc:%d\n", ret);
    
    return 0;
}

static void gpioc_exit(void)
{
    int ret;
    ret = unregister_chrdev(DEVICE_MAJOR, DEVICE_NAME);
    printk(KERN_ERR"unregister gpioc:%d\n", ret);
}

module_init(gpioc_init);
module_exit(gpioc_exit);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -