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

📄 gpio.c

📁 arm linux s3c2410 led驱动例程
💻 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 + -