【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:liufei191010@126.com】
由于项目需要一款小的3*2的矩阵键盘,所以选用一款数码管驱动及键盘控制芯片 CH455 ,该芯片其实实际能支持到最大7*8的矩阵键盘以及4个数码管,在这里我们只是用到了他的键盘驱动功能,该芯片的使用框架图如下:
在项目实际应用中,芯片的实际电路设计原理如下:
在驱动软件的设计上,我们采用io模拟iic通信,外加中断的方式搞定该芯片。通过芯片的datasheet,我们可以清除的看到该芯片的通信时序如下:
根据以上的时序,我们在linux下实现该芯片的驱动,代码如下:
//ch455.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/platform_device.h>
#include <linux/poll.h>
#include <linux/leds.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/types.h>
#include <mach/gpio.h>
#include <plat/mux.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
typedef unsigned char UINT8;
typedef unsigned short UINT16;
#define STATUS_SUCCESS 0
#define STATUS_FAILURE -1
// 读取按键代码命令
#define CH455_GET_KEY 0x0700 // 获取按键,返回按键代码
// CH455接口定义
#define CH455_I2C_ADDR 0x40 // CH455的地址
#define CH455_I2C_MASK 0x3E // CH455的高字节命令掩码
static struct class *ch455iic_class;
static struct device *ch455iic_class_dev;
static int major;
static unsigned char TxBuf[24] = {0};
static unsigned char RxBuf[24] = {0};
//iic
#define SCL GPIO_TO_PIN(1,14)
#define SCL_OUT gpio_direction_output(SCL, 1)
#define SCL_L gpio_set_value(SCL, 0)
#define SCL_H gpio_set_value(SCL, 1)
#define SDA GPIO_TO_PIN(2,1)
//#define SDA GPIO_TO_PIN(2,13)
#define SDA_OUT gpio_direction_output(SDA, 1)
#define SDA_IN gpio_direction_input(SDA)
#define CH455_SDA_IN gpio_get_value(SDA)
#define SDA_L gpio_set_value(SDA, 0)
#def