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

📄 drvkb.c~

📁 一个以s3c2410为核心的ARM板键盘驱动程序的例子
💻 C~
字号:
#define	__KERNEL__
#define	  MODULE
#include <linux/module.h>
#include <linux/version.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <asm/uaccess.h>
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/interrupt.h>
#include <linux/ptrace.h>
#include <linux/ioport.h>
#include <linux/in.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/string.h>
#include <asm/bitops.h>
#include <asm/io.h>
#include <linux/errno.h>
#include <linux/tqueue.h>
#include <linux/wait.h>
#include <asm/irq.h>
#include <asm/arch/hardware.h>
#include <asm/arch/irqs.h>
#include <linux/devfs_fs_kernel.h>
#include "CharDriver.h"
int charDriver_open(struct inode * inode, struct file * filp);
int charDriver_release(struct inode * inode, struct file * filp);
ssize_t charDriver_read(struct file * filp, char * buf, size_t count, loff_t * l);
ssize_t charDriver_write(struct file * filp,const char * buf,size_t count,loff_t * l);
struct file_operations charDriver_fops = {
	open:           charDriver_open,
	release:        charDriver_release,
	read:           charDriver_read,
	write:	        charDriver_write,
};


int charDriver_open(struct inode * inode, struct file * filp)
{
	gpioc_base=ioremap_nocache(GPIOC,GPIOLEN); //get virtual address
	BWSCON=((BWSCON&(0xfffff0ff))|(0x0));
	BANKCON2=0x7ff0;
//键盘时钟初始化
	GPECON = (GPECON)&(0x0fffffff);
	GPEUP  = (GPECON)&(0xffff3fff);
	GPECON = (GPECON)|(0xa0000000);
	GPEUP  = (GPECON)|(0x0000c000);
	CLKCON = (CLKCON)& (0xfffeffff);
	CLKCON = (CLKCON)| (0x00010000);
	__REG(0x54000000) = 0x4f;
	__REG(0x54000004) = 0xf0;
//	IICCON = 0x4f; 
//	IICSTAT = 0xf0; 
	MOD_INC_USE_COUNT;
	return 0;
}

int charDriver_release(struct inode * inode,struct file * filp)
{
	iounmap(gpioc_base);
	MOD_DEC_USE_COUNT;
	return 0;
}

ssize_t charDriver_read(struct file * filp, char * buf, size_t count, loff_t * l)
{
	unsigned char i,j;
	if(count>2)return 1;//error
	if(count==2){
		keyIntFlag=0;
		while(!keyIntFlag){}
		*buf=*(gpioc_base+count);
		keyIntFlag=0;
	}else{
		*buf=*(gpioc_base+count);
	}
	return 0;
}

ssize_t charDriver_write(struct file * filp, const char * buf, size_t count, loff_t * l)
{
        if(count>2)return 1;//error
	copy_from_user(&charPar,buf,1);
	*(gpioc_base+count)=charPar;
	return 0;
       
}
void key_irq_handler(int irq,void *dev_id,struct pt_regs *regs){
	disable_irq(2);
	keyIntFlag=1;
	enable_irq(2);
}
int init_module(void){	
	unsigned int result = 0;
	result = register_chrdev(CHARDRIVER_MAJOR, CHARDRIVER_NAME, &charDriver_fops);
	if (result < 0){
		unregister_chrdev(CHARDRIVER_MAJOR,CHARDRIVER_NAME);
	  	return result;
	}else{
		if(set_external_irq(2,2,1)){
			return -1;
		}
		if(request_irq(
    				2,  
				key_irq_handler,  
				SA_INTERRUPT,
				"key_irq_handler", 
				NULL)
		){
			printk(KERN_INFO "key:canot get assign irq 2\n");
			return -1;
		}
	}
	return 0;
}

void cleanup_module(void)
{
	disable_irq(2);
	free_irq(2,NULL);
  	unregister_chrdev(250,CHARDRIVER_NAME);
	return;
}

⌨️ 快捷键说明

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