zoukankan      html  css  js  c++  java
  • 读取按键值驱动

    #include <linux/module.h>

    #include <linux/kernel.h>

    #include <linux/fs.h>

    #include <linux/init.h>

    #include <linux/delay.h>

    #include <asm/uaccess.h>

    #include <asm/irq.h>

    #include <asm/io.h>

    #include <asm/arch/regs-gpio.h>

    #include <asm/hardware.h>

    static  struct  class *seconddrv_class;

    static struct class_device *seconddrv_class_dev;

    volatile   unsigned  long  *gpfcon;

    volatile   unsigned  long  *gpfdat;

    volatile   unsigned  long  *gpgcon;

    volatile   unsigned  long  *gpgdat;

    static  int second_drv_open(struct  inode  *inode,  struct  file  *file ) {

    /*配置GPF0,2为输入引脚

    */ *

    gpgcon &=~((0x3<< (0*2 )) | (0x3<<(2*2)));

    /*配置GPF3,11为输入引脚 */

    *gpfcon &=~((0x3<< (3*2 )) | (0x3<<(11*2)));

    return 0;

    }

    ssize_t  second_drv_read (struct file *file, char __user *buf, size_t  size, loff_t *ppos) {

    /*返回四个引脚的电平 */

    unsigned  char key_vals[4];

    int  regval;

    if (size  !=  sizeof(key_vals))  

    return -EINVAL;

    /*读取GPF0,2*/

    regval= *gpfdat;

    key_vals [0]= ( regval & (1<<0) )  ?  1:0;

    key_vals [1]= ( regval & (1<<2) )  ?  1:0;

    /*读取GPF3,11*/

    regval= *gpgdat;

    key_vals [2]= ( regval & (1<<3) )  ?  1:0;

    key_vals [3]= ( regval & (1<<11) )  ?  1:0;

    copy_to_user(buf,  key_vals , sizeof(key_vals));

    return sizeof(key_vals);

    }

    static  struct  file_operations  second_drv_fops= {

        .owner=THIS_MODULE,    

     .open = second_drv_open,          

      .read=  second_drv_read, };

    int major;

    static  int  second_drv_init() {

    major=register_chrdev (0,  "second_drv",  & second_drv_fops);

    seconddrv_class = class_create(THIS_MODULE, "seconddrv");  

    /*if (IS_ERR(firstdrv_class))   

    return PTR_ERR(firstdrv_class);*/

    seconddrv_class_dev= class_device_create(seconddrv_class, NULL, MKDEV(major, 0), NULL, "buttons");

    /*if (unlikely(IS_ERR(firstdrv_class_dev)))    

    return PTR_ERR(firstdrv_class_dev);*/

    gpfcon =(volatile unsigned long * )ioremap(0x56000050,16);             

    gpfdat=gpfcon+1;

    gpgcon =(volatile unsigned long * )ioremap(0x56000060,16);             

    gpgdat=gpgcon+1;

    return 0;

    }

    static  void  second_drv_exit() {

    unregister_chrdev ( major,  "second_drv");

    class_device_unregister(seconddrv_class_dev);    

    class_destroy(seconddrv_class);  

    iounmap(gpfcon);  

    iounmap(gpgcon);

    return 0;

    }

    module_init(second_drv_init);

    module_exit(second_drv_exit);

    MODULE_LICENSE("GPL");

  • 相关阅读:
    成长型思维
    Spring Boot 入门详细分析
    我们为什么要学习 Spring Boot
    躲不掉的 lambda 表达式
    Java 并发工具包 | J.U.C
    Java 并发编程整体介绍 | 内含超多干货
    彻底搞懂单例模式如何安全的实现
    atomic 包、synchronized | Java 中线程安全
    AD在更新PCB的时候,每次封装都会改变位置?
    1206封装电容在物料可靠性设计比较低
  • 原文地址:https://www.cnblogs.com/kingqinwang/p/5150312.html
Copyright © 2011-2022 走看看