山西太原RK3399瑞芯微开发板按键驱动源程序

        RK3399的CPU采用 big.LITTLE大小核架构,双Cortex-A72大核+四Cortex-A53小核结构,对整数、浮点、内存等作了大幅优化,在整体性能、功耗及核心面积三个方面都具革命性提升。 RK3399的GPU采用 四核ARM新一代高端图像处理器Mali-T860,集成更多带宽压缩技术:如智能迭加、ASTC、本地像素存储等,还支持更多的图形和计算接口,总体性能比上一代提升45%。
      友坚科技最新研发的 RK3399开发板,搭建了最新 android7.1 系统,4G DDR3内存,32G EMMC 存诸,搭配8.4寸高清IPS屏。RK3399开发板主板尺寸为:155*104mm,设计有非常丰富的接口,板载3路TTL UART,2路USB2.0接口,一路USB3.0接口,WIFI/BT二合一,HDMI OUT 、HDMI INT、Type C、4G、IR、以太网等;可扩展模块包括 4G模块、Camera(1300万、500万)等应用类功能模块。
山西太原RK3399瑞芯微开发板按键驱动源程序_第1张图片
按键驱动源程序
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME
#define BUTTON_MAJOR
"custom-buttons" //定义按键设备名
232 //定义按键主设备号
static struct key_info {
int irq_no;
unsigned int gpio_port;
int key_no;
} key_info_tab[4] = { //按键所使用的 CPU 资源
{ IRQ_EINT1, GPIO_F1, 1 },
{ IRQ_EINT2, GPIO_F2, 2 },
{ IRQ_EINT3, GPIO_F3, 3 },
{ IRQ_EINT7, GPIO_F7, 4 },
};
static int ready = 0;
static int key_value = 0;
static DECLARE_WAIT_QUEUE_HEAD(buttons_wait);
//声明、初始化等待队列 buttons_wait
static void buttons_irq(int irq, void *dev_id, struct pt_regs * reg)//中断处理程序
{
struct key_info *k;
int i;
int found = 0;
int up;
int flags;
for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++){
k = key_info_tab + i;
if (k->irq_no == irq) {
found = 1;
break;
}
}
if (!found) {
printk("bad irq %d in button\n", irq);
return;
}
save_flags(fla gs);
cli(); //禁用 所有中断
set_gpio_mode_user(k->gpio_port, GPIO_MODE_IN);
up = read_gpio_bit(k->gpio_port );
set_external_irq(k->irq_no, EXT_BOTH_EDGES, GPIO_PULLUP_DIS);
restore_flags(flags );
if (up) {
key_value = k->key_no + 0x80;
} else {
key_value = k->key_no;
}
ready = 1;
wake_up_interruptible(&buttons_wait);
}
//唤醒 buttons_wait 等待对列中的进程
static int request_irqs(void){
//申请系统中断,中断方式为双边延触发,即在上升沿和下降沿均发生中断
struct key_info *k;
int i;
for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++){
k = key_info_tab + i;
set_external_irq(k->irq_no, EXT_BOTH_EDGES, GPIO_PULLUP_DIS); // 双边触发
if (request_irq(k->irq_no, &buttons_irq, SA_INTERRUPT, DEVICE_NAME, &buttons_irq)){
//0 表示成功,负值表示出错
return -1;
}
}
return 0;
}
static void free_irqs(void)
{
//释放中断
struct key_info *k;
int i;
for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++){
k = key_info_tab + i;
fr ee _irq(k->irq_no, but tons_irq);
}
}
static int ma trix4_button s_read(struct file * file, char * buffer, size_t count, loff_t *ppos )
{
static int key;
int f lags;
int repeat;
if (!ready)
return -EAGAIN;
if (count != sizeof key_value)
return -EINVA L;
save_flags(flags );
if (key !=
key_value){ key =
key_value; repeat
= 0;
//*file_operations 的"读"指针函数实现
}
else{
repeat = 1;
}
restore_flags(flags);
if (repeat){
return -EAGAIN;
}
copy_to_user(buffer, &key, sizeof key); //使用 copy_to_user 把键值送到用户空间
ready = 0;
return sizeof key_value;
}
static unsigned int matrix4_buttons_select(struct file *file, struct poll_table_struct *wait){
if (ready)
return 1; //POLLIN,设备可以无阻塞读
poll_wait(file, &buttons_wait, wa it); //把当前进程放入一个等待对列
return 0;
//使进程调用 poll 或 select 系统调用时,阻塞直到 buttons_wait 等待队列唤醒
}
static int matrix4_buttons_ioctl(struct inode *inode, struct file *file, unsigned int cmd ,
unsigned long arg){
switch (cmd){
default:
return -EINVAL;
}
}
static struct file_operations matrix4_buttons_fops = {
owner: THIS_MODULE,
ioctl: matrix4_butto ns_ioctl,
poll: matrix4_buttons_select,
/*po ll 方法是 poll 和 select 这两个系统调用的后端实现,是在用户空间程序执行 poll 或 select 系统调
用时被调用,这两个系统调用可用来查询设备是否可读或可写,或是否处理某种特殊状态。这两个系统调用
是可阻塞的,直至设备变为可读或可写状态为止*/
read: matrix4_buttons_read,
};
static devfs_handle_t devfs_handle;
static int init matrix4_buttons_init(void){ //按键初始化
int ret;
ready = 0;
ret = register_chrdev(BUTTON_MAJOR, DEVICE_NAME, &matrix4_buttons_fops);//注册按键设备
if (ret < 0){
printk(DEVICE_NAME " can't register major number\n");
return ret;
}
ret = request_irqs();
if (ret){
//请求中断
unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME);
printk(DEVICE_NAME " can't request irqs\n");
return ret;
}
devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT,
BUTTON_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR, &matrix4_buttons_fops, NULL);
//使用 devfs 进行注册
return 0;
}
static void exit
matrix4_buttons_exit(void){ devfs_unregis
ter(devfs_handl e) ; free_irqs();
unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME);
}
modu le_init(matrix4_buttons_init);
modu le_exit(matrix4_buttons_exit);
MODU LE_LICENSE("GPL");


      山西太原RK3399瑞芯微开发板按键驱动源程序友坚科技专注于三星、瑞芯微、飞思卡尔平台产品的研发,是 三星、瑞芯微、飞思卡尔在中国最具实力的方案公司之一。公司研发、生产的平板、开发板,连续多年销量稳居第一。公司定位于中高端产品的研发,具有多年的嵌入式产品研发经验;基于A15-Exynos5260、A53_S5P6818、A9-S5P4418、A9-Exynos 4412、A8-S5PV210、ARM11-S3C6410、ARM9-S3C2416 、RK3188、RK3288、 RK3399、IMX6Q等处理器,开发了系列化产品,为客户提供了全面的产品选择及专业化的 量身定制MID解决方案

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31471824/viewspace-2146940/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31471824/viewspace-2146940/

你可能感兴趣的:(山西太原RK3399瑞芯微开发板按键驱动源程序)