📄 gpioctl.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 + -