📄 gpio.c
字号:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/version.h>
#include <linux/types.h>
#include <linux/errno.h> /* error codes */
#include <asm/uaccess.h>
#include <linux/kernel.h> /* printk() */
#include <linux/slab.h>
#include <linux/fcntl.h>
#include <linux/fs.h> /* everything... */
#include <asm/semaphore.h>
#include <asm/arch/cpu_s3c2410.h>
#include <asm/hardware.h>
#include <linux/delay.h>
#include <linux/signal.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/interrupt.h>
#include <asm/irq.h>
#include <linux/vmalloc.h>
#include <linux/config.h>
#include <linux/time.h>
#include <linux/spinlock.h>
//#include <linux/malloc.h>
#include <asm/delay.h>
#include <asm/io.h>
#include <asm-arm/arch-s3c2410/irqs.h>
#include <asm-arm/irq.h>
#include <linux/devfs_fs_kernel.h>
#include "gpio.h"
#define DEVICE_NAME "gpio"
unsigned char *dbuf;
devfs_handle_t gpio_devfs_dir;
static int major = 239; //Define device major
static void *gpbcon;
static void *gpbdat;
static void *gpbup;
static devfs_handle_t devfs_handle;
static int __init gpio_init(void);
static void __exit gpio_exit(void);
static void setio(unsigned int value) {
writel((readl(gpbdat)) | value, gpbdat);
}
static void clrio(unsigned int value) {
writel((readl(gpbdat))&(~value), gpbdat);
}
static int gpio_read(struct file *filp, char *buffer, size_t count, loff_t *ppos) {
return 0;
}
static int gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, long data) {
switch (cmd) {
case all_off:
clrio(led1);
clrio(led2);
clrio(led3);
clrio(led4);
break;
case all_on:
setio(led1);
setio(led2);
setio(led3);
setio(led4);
break;
default:
printk("led_default~");
}
return 0;
}
static int gpio_write(struct file *file, const char *buffer, size_t count, loff_t * ppos) {
return 0;
}
static int gpio_open(struct inode *inode, struct file *file) {
MOD_INC_USE_COUNT;
return 0;
}
static int gpio_release(struct inode *inode, struct file *file) {
MOD_DEC_USE_COUNT;
return 0;
}
static struct file_operations gpio_fops = {
.owner = THIS_MODULE,
.open = gpio_open,
.read = gpio_read,
.ioctl = gpio_ioctl,
.write = gpio_write,
.release = gpio_release,
};
static int __init gpio_init(void) {
int ret;
gpbcon = ioremap(0x56000010, 0x04);
gpbdat = ioremap(0x56000014, 0x04);
gpbup = ioremap(0x56000018, 0x04);
writel((readl(gpbcon)&0x3fff) | 0x154000, gpbcon); //set gpb7,8,9,10 as output,other keep
ret = register_chrdev(major, DEVICE_NAME, &gpio_fops);
if (ret < 0) {
printk("gpio register failed\n");
return ret;
}
devfs_register(gpio_devfs_dir, DEVICE_NAME, DEVFS_FL_AUTO_DEVNUM, 0, 0, S_IFCHR | S_IRUGO | S_IWUGO, &gpio_fops, NULL);
printk("gpio initialized.\n");
return 0;
}
static void __exit gpio_exit(void) {
iounmap(gpbcon);
iounmap(gpbdat);
iounmap(gpbup);
devfs_unregister(devfs_handle);
printk("gpio driver uninstalled OK\n");
}
module_init(gpio_init);
module_exit(gpio_exit);
MODULE_AUTHOR("shencai555 <shencai555@hotmail.com>");
MODULE_DESCRIPTION("gpio Driver");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -