/*-----------------------------------------------------------------------------
FILE : dev_gpio.c
DESCRIPTION : Control GPIO F Port, GPG5, GPG11 Port of S3C2440.
-------------------------------------------------------------------------------*/
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/wait.h>
#include <linux/ioport.h>
#include <linux/slab.h> // kmalloc()
#include <linux/poll.h> // poll
#include <linux/proc_fs.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <linux/delay.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/ioctl.h>
#include <asm/unistd.h>
#include <asm/gpio.h>
#include <asm/delay.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include "dev_gpio.h"
#define ON 1
#define OFF 0
static int usage = 0;
static int showmsg = 0;
static int major = GPIO_MAJOR_DEF;
static int int_flag = 0;
static void hw_gpio_init( void )
{
// IRQT_FALLING, IRQT_RISING, IRQT_LOW, IRQT_HIGH^M
gpio_direction_input( S3C2410_GPG5 );
set_irq_type( IRQ_EINT13, IRQT_RISING );
s3c2410_gpio_pullup( S3C2410_GPG5, 1 );
gpio_direction_input( S3C2410_GPG11 );
s3c2410_gpio_pullup( S3C2410_GPG11, 1 );
gpio_direction_output( S3C2410_GPF0, 1 );
gpio_direction_output( S3C2410_GPF1, 1 );
gpio_direction_output( S3C2410_GPF2, 1 );
gpio_direction_output( S3C2410_GPF3, 1 );
gpio_direction_output( S3C2410_GPF4, 1 );
gpio_direction_output( S3C2410_GPF5, 1 );
gpio_direction_output( S3C2410_GPF6, 1 );
gpio_direction_output( S3C2410_GPF7, 1 );
}
static irqreturn_t gpio_btn_interrupt(int irq, void *dev_id)
{
printk("\n--> %s) Rising edge triggered interrupt irq [%d]", __FUNCTION__, irq);
if( int_flag == 0 )
{
s3c2410_gpio_setpin(S3C2410_GPF4, 0);
int_flag = 1;
}
else
{
s3c2410_gpio_setpin(S3C2410_GPF4, 1);
int_flag = 0;
}
return IRQ_HANDLED;
}
static ssize_t gpio_read(struct file *filp, char *buf, size_t count, loff_t *ppos)
{
unsigned char cc;
int idx;
int rtn = -1;
cc = ( gpio_get_value( S3C2410_GPG11 ) >> 11 );
for (idx=0; idx<200; idx++)
{
rtn = -1;
}
if ( cc == ( gpio_get_value( S3C2410_GPG11 ) >> 11 ) )
{
put_user( cc, buf );
}
return 1;
}
void set_gpio_f( char gpnr, unsigned char val )
{
switch( gpnr )
{
case 0 : gpio_set_value( S3C2410_GPF0, val ); break;
case 1 : gpio_set_value( S3C2410_GPF1, val ); break;
case 2 : gpio_set_value( S3C2410_GPF2, val ); break;
case 3 : gpio_set_value( S3C2410_GPF3, val ); break;
case 4 : gpio_set_value( S3C2410_GPF4, val ); break;
case 5 : gpio_set_value( S3C2410_GPF5, val ); break;
case 6 : gpio_set_value( S3C2410_GPF6, val ); break;
case 7 : gpio_set_value( S3C2410_GPF7, val ); break;
default : break;
}
}
static int gpio_ioctl( struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg )
{
if( _IOC_TYPE( cmd ) != GPIO_IOCTL_MAGIC ) return -EINVAL;
if( _IOC_NR ( cmd ) >= GPIO_IOCTL_MAGIC ) return -EINVAL;
switch (cmd)
{
case IOCTL_GPIO_SET : set_gpio_f( arg, 1 ); return 0;
case IOCTL_GPIO_CLR : set_gpio_f( arg, 0 ); return 0;
}
return -EINVAL;
}
static int gpio_open( struct inode *inode, struct file *filp )
{
usage ++;
if (showmsg) printk(" %s OPEN (%d)\n", DEV_NAME, usage );
return 0;
}
static int gpio_release( struct inode *inode, struct file *filp)
{
usage --;
if (showmsg) printk(" %s CLOSE\n", DEV_NAME );
return 0;
}
static struct file_operations gpio_fops =
{
open : gpio_open,
release : gpio_release,
read : gpio_read,
ioctl : gpio_ioctl,
};
static __init int gpio_init( void )
{
int ret;
major &= 0xff;
if( !register_chrdev( major, DEV_NAME, &gpio_fops ) )
{
printk("\n register device %s OK (major=%d)\n\n", DEV_NAME, major );
}
else
{
printk("\n unable to get major %d for %s \n\n", major, DEV_NAME );
return -EBUSY;
}
hw_gpio_init();
ret = request_irq( IRQ_EINT13, gpio_btn_interrupt, SA_INTERRUPT, "EINT-TEST", NULL );
if(ret)
{
printk( " %s : unable to get IRQ %d\n", DEV_NAME, IRQ_EINT13 );
goto fail;
}
return 0;
fail:
free_irq(IRQ_EINT13, NULL);
return ret;
}
static __exit void gpio_exit( void )
{
unregister_chrdev( major, DEV_NAME );
free_irq(IRQ_EINT13, NULL);
printk("\n unregister %s OK\n\n", DEV_NAME );
}
module_init(gpio_init);
module_exit(gpio_exit);
module_param(major, int, 0);
module_param(showmsg, int, 0);
MODULE_LICENSE("GPL");
/* end */
s3c2440-gpio.rar_linux gpio_s3c2440_s3c2440 gpio_scan
版权申诉
113 浏览量
2022-09-22
22:02:08
上传
评论
收藏 18KB RAR 举报
JaniceLu
- 粉丝: 78
- 资源: 1万+
最新资源
- 二叉树7-1-1.cpp
- android 9.0 原生模拟器 签名文件
- 技术面试最后反问面试官的话 校招面试非技术问题有哪些 非技术问题如何回答.png
- NB-IOT-BC26全网通模块Altium+ CADENCE +PADS三种格式(原理图SCH+PCB封装库)文件.zip
- 基于微信小程序开发的校园失物招领系统源码毕业设计(优质项目源码).zip
- 词向量是一种将自然语言中的单词转换为数值向量的技术,它能够捕捉词义和上下文信息
- nmap与masscan的简单使用
- MyBatis动态SQL.pdf
- 基于stm32单片机protues仿真的温湿度控制系统设计(仿真图、源代码)
- 词向量:自然语言处理的基石
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈