• 大小: 7KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-15
  • 语言: 其他
  • 标签: 海思3531  gpio  

资源简介

根据海思3531 datasheet写的gpio操作的例子,已经用于实际产品,运行稳定

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include “hi_gpio.h“

#define  GPIO_1_base_ADDR  0x20160000
#define  GPIO_6_base_ADDR  0x201b0000
#define  GPIO_10_base_ADDR 0x201f0000

#define  GPIO_DIR_base   (groupbase+0x400)
#define  GPIO_INTR_MASK  (groupbase+0x410)
#define  GPIO_DATA_base   data_reg_base


#define WRITE_REG(Addr Value) ((*(volatile unsigned int *)(Addr)) = (Value))
#define READ_REG(Addr)         (*(volatile unsigned int *)(Addr))

//static DECLARE_MUTEX(gpio_sem);

static unsigned int groupbase=-1;
static unsigned int data_reg_base=0;
static unsigned int gpio1_base_addr_virtual=0;
static unsigned int gpio6_base_addr_virtual=0;
static unsigned int gpio7_base_addr_virtual=0;
static unsigned int gpio10_base_addr_virtual=0;

static void gpio_calculate_data_groupbase(unsigned int groupnum unsigned int bitnum)
{
    switch(groupnum)
    {
case 1: 
     groupbase =gpio1_base_addr_virtual;
     break;
case 6: 
     groupbase =gpio6_base_addr_virtual;
     break;
case 7: 
     groupbase =gpio7_base_addr_virtual;
     break;
case 10: 
     groupbase =gpio10_base_addr_virtual;
     break;
default:
     break;
    }

    //printk(“groupbase:%x !\n“groupbase);
    data_reg_base=groupbase+(1<<(bitnum+2));
    printk(“data_reg_base:%#x !\n“data_reg_base);
}



static int gpio_open(struct inode *inode struct file *filp)
{
   return 0;
}

static int gpio_release(struct inode *inode struct file *filp)
{
return 0;
}


static int gpio_ioctl(struct file *file unsigned int cmd unsigned long arg)
{
unsigned char __user *argp = (unsigned char __user *)arg;
    gpio_groupbit_info group_bit_info;
    unsigned int reg_tmp=0;

    copy_from_user(&group_bit_infoargp sizeof(gpio_groupbit_info));
printk(“[driver]-debug:gpio_ioctlcmd=%#x\n“cmd);
printk(“[driver]-debug:gpio%d_%d=%d\n“group_bit_info.groupnumbergroup_bit_info.bitnumbergroup_bit_info.value);

   if(((group_bit_info.groupnumber != 1) && (group_bit_info.groupnumber != 6)
  &&(group_bit_info.groupnumber != 10)&&(group_bit_info.groupnumber != 7)) ||(group_bit_info.bitnumber>7))
    {
printk(“[driver]:group number:%d or bitnum:%d beyond extent!\n“group_bit_info.groupnumbergroup_bit_info.bitnumber);
return -1;
    }

    gpio_calculate_data_groupbase(group_bit_info.groupnumbergroup_bit_info.bitnumber);

    switch(cmd)
    {
        case GPIO_SET_DIR:
{
    reg_tmp=READ_REG(GPIO_DIR_base);

    if(group_bit_info.value==0)
    {
reg_tmp &=~(1< WRITE_REG(GPIO_DIR_basereg_tmp);
    }
    else if(group_bit_info.value==1)
    {
reg_tmp |=(1< WRITE_REG(GPIO_DIR_basereg_tmp);
    }
    else
    {
printk(“dir beyond of extent!\n“);
/

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2015-04-02 14:03  gpio\
     文件        6824  2015-04-02 14:02  gpio\hi_gpio.c
     文件         321  2015-04-02 14:02  gpio\hi_gpio.h
     文件         345  2015-04-02 14:02  gpio\Makefile
     文件        7826  2015-04-02 14:02  gpio\test_gpio
     文件        1831  2015-04-02 14:02  gpio\test_gpio.c

评论

共有 条评论