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

📄 2410io.c

📁 基于嵌入式LINUX的2410IO口驱动范例
💻 C
字号:
/************************************************/
/*               2410 2.6内核IO口驱动           */
/*                 作者:唐子超                 */
/************************************************/


#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifdef MODULE
    #define __MODULE__
#endif

#include <linux/module.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <asm/arch/hardware.h>
#include <asm/arch/regs-gpio.h>
#include <asm/uaccess.h>

#define MAJOR_NR    130                         //主设备号
#define DEVICE_NAME "switch"                        //设备名称

/********************管脚定义*****************/
#define sw1    S3C2410_GPC10
#define sw2    S3C2410_GPC11
#define sw1out S3C2410_GPC10_OUTP
#define sw2out S3C2410_GPC11_OUTP

static ssize_t io_write(struct file *filp,const char *buf,size_t count,loff_t *f_pos);
static int io_open(struct inode *inode,struct file *file);
static int io_release(struct inode *inode,struct file *file);
int io_init(void);
void io_cleanup(void);

static struct file_operations io_fops=
{
    .owner=     THIS_MODULE,
    .write=     io_write,
    .open=      io_open,
    .release=   io_release,
};

/********************打开驱动************************/
static int io_open(struct inode *inode,struct file *filp)
{
    printk(KERN_ERR "OPEN!\n");
    s3c2410_gpio_cfgpin(sw1,sw1out); //配置管脚输入输出
    s3c2410_gpio_cfgpin(sw2,sw2out);
    s3c2410_gpio_setpin(sw1,0);      //设置管脚点平
    s3c2410_gpio_setpin(sw2,0);

    //MOD_INC_USE_COUNT;
    return 0;
}                   //success
/*******************关闭驱动***************************/
static int io_release(struct inode *inode,struct file *filp)
{
    s3c2410_gpio_setpin(sw1,0);
    s3c2410_gpio_setpin(sw2,0);
    printk(KERN_ERR "RELEASE!\n");
    //MOD_DEC_USE_COUNT;
    return 0;           //close
}
/******************写数据******************************/
static ssize_t io_write(struct file *filp,const char *buf,size_t count,loff_t *f_pos)
{
    int temp;
    copy_from_user(&temp,buf,count);

    s3c2410_gpio_setpin(sw1,((temp&0x1)?1:0));
    s3c2410_gpio_setpin(sw2,(((temp>>1)&0x1)?1:0));
    return 0;
}

int io_init(void)
{
    int result;
    result = register_chrdev(MAJOR_NR, DEVICE_NAME, &io_fops);
    if (result<0)
    {
        printk(KERN_ERR DEVICE_NAME ":Unable to get major %d\n",MAJOR_NR);
        return result;
    }
    printk(KERN_ERR DEVICE_NAME":初始化成功!\n");
    return 0;
}

void io_cleanup(void)
{
    printk(KERN_ERR DEVICE_NAME":驱动关闭\n");
    unregister_chrdev(MAJOR_NR,DEVICE_NAME);
}

module_init(io_init);
module_exit(io_cleanup);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("TangZichao<tangzichao@gmail.com>");
MODULE_DESCRIPTION("io driver for sc2410");

⌨️ 快捷键说明

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