前天写了ARM9的LED和按键的裸机程序,今天把它用驱动实现。但是真的不好写,搞了一个晚上,不过真算OK啦。
我的这个驱动,实现的功能就是提供一个菜单给你选择,只要在总端输入数字选着LED运行模式就可以。
并且我用KI按键,实现了可以返回菜单另选另一种模式的功能。最后一个,就是应用层序是一个死循环,我还提供一个选择,退出死循环。但是另选模式后,要执行完本次才执行重选的模式。图如下:
1.进入主菜单:
2.有六种模式:选着相应模式就可运行:
3.由于是死循环,所以必须要通过按键1来返回主菜单,在选着其他模式。
4.选着7键来推出菜单,但是退出时得运行本次才退出,如下:
驱动程序如下:
//头文件
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/fs.h>
#include<linux/errno.h>
#include<mach/regs-gpio.h>
#include <mach/hardware.h>
#include<linux/io.h>
#include<asm/uaccess.h>
#define GPIO_LED_MAJOR 97
#define LED_1_ON 1
#define LED_2_ON 2
#define LED_3_ON 3
#define LED_4_ON 4
#define LED_OFF 5
#define KEY_READ 6
#define ctl_GPIO_LED1 1
int GPIO_open(struct inode *inode, struct file *file)
{
printk("Open successfully!\n\n");
//初始化引脚,GPB输出GPF7输入
__raw_writel(__raw_readl(S3C2410_GPBCON)|(1<<(2*5))|(1<<(2*6))|(1<<(2*7))|(1<<(2*8)),S3C2410_GPBCON);
__raw_writel(__raw_readl(S3C2410_GPBDAT)|(0xf<<5),S3C2410_GPBDAT);
__raw_writel(__raw_readl(S3C2410_GPFCON)&~(3<<(2*7)),S3C2410_GPFCON);
printk("Initialization of LED and Button!\n\n");
return 0;
}
int GPIO_release(struct inode *inode, struct file *filp)
{
printk("Close successfully!\n\n");