📄 drvkb.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 + -