千古八方的博客

  • 程序开发
    • Android
    • Spring Boot
  • 数据私有化
    • NAS
    • 私有云
    • 内网穿透
    • 服务器
  • 留言
  • 搞事
进学
为学无间断,如流水行云,日进而不已也
  1. 首页
  2. Android
  3. 正文

RK3399 Android7.1系统,GPIO内核驱动开发

2022年6月28日 282点热度 0人点赞 0条评论
目录
1. 方案背景
2. 编译及驱动源码
Android 系统编译相关文章

1. 方案背景

产品使用的RK3399核心板,电路板外围电路及模块功能自定义,项目需要增加gpio控制的功能。  由于在用户空间,通过系统命令的方式控制GPIO,拉高拉低的速度响应速度比较慢,而通过内核驱动的方式较快,所以需要开发个内核驱动来控制GPIO。
注意,本文使用的是gpio68号引脚,并非控制所有引脚。

2. 编译及驱动源码

1. kernel/drivers/char/Makefile 添加gpio68.o的编译

obj-y				+= gpio68.o

2. 新建 kernel/drivers/char/gpio68.c  源码文件。

gpio68.c 源码如下:

#include <linux/module.h>               /* For module specific items */    
#include <linux/moduleparam.h>          /* For new moduleparam's */    
#include <linux/types.h>                /* For standard types (like size_t) */    
#include <linux/errno.h>                /* For the -ENODEV/... values */    
#include <linux/kernel.h>               /* For printk/panic/... */    
#include <linux/fs.h>                   /* For file operations */    
#include <linux/ioport.h>               /* For io-port access */    
#include <linux/platform_device.h>      /* For platform_driver framework */    
#include <linux/init.h>                 /* For __init/__exit/... */    
#include <linux/uaccess.h>              /* For copy_to_user/put_user/... */    
#include <linux/io.h>                   /* For inb/outb/... */    
#include <linux/gpio.h>    
#include <linux/device.h>    
#include <linux/cdev.h>    
#include <linux/slab.h>               /*kamlloc */    
#include <asm-generic/ioctl.h>    

 //ioctl   
#define CMD_FLAG  'i'    
#define gpio_PWR_ON      _IOR(CMD_FLAG,0x00000001,__u32)      
#define gpio_PWR_OFF     _IOR(CMD_FLAG,0x00000000,__u32)   
#define gpio_lp         68  

static int  major =0;    
static struct class *gpio_class;    
struct cdev_gpio {    
    struct cdev cdev;    
};     
struct cdev_gpio *gpio_dev;    

static long gpio_ioctl(struct file* filp, unsigned int cmd,unsigned long argv)    
{    
    printk(KERN_INFO "entry kernel.... \n");    
    //printk(KERN_INFO "%d\n", gpio_PWR_ON);  
    //void __iomem *ldo_mmio_base = ioremap(0xe46002e4, 4);

    switch(cmd)    
    {    
        case gpio_PWR_ON:    
        {    
            gpio_set_value(gpio_lp,1);  //   
            printk(KERN_INFO "gpio on\n");   
            //iowrite32(0x1700, ldo_mmio_base)  
            break;    
        }    
        case gpio_PWR_OFF:    
        {    
            gpio_set_value(gpio_lp,0);  
            printk(KERN_INFO "gpio off \n");  
            //iowrite32(0x1500, ldo_mmio_base);  
            break;    
        }    
        default:    
            return -EINVAL;    
    }    
    return 0;    
}    


//open    
static int gpio_open(struct inode* i_node,struct file* filp)    
{    
    //printk(KERN_INFO "open init.... \n");    
    int err = gpio_request(gpio_lp,"gpio_pwr");  
    if(err<0)    
    {    
        printk(KERN_INFO "gpio request faile \n");    
        return err;    
    }    
    gpio_direction_output(gpio_lp,1);  
    return 0;    
}    

//close    
static int  gpio_close(struct inode* i_node,struct file* filp)    
{    
    printk(KERN_INFO "close init \n"); 
    gpio_free(gpio_lp);   
    return 0;    
}    

/* file operations */    
struct file_operations fops={    
    .owner  = THIS_MODULE,    
    .open   = gpio_open,    
    .unlocked_ioctl = gpio_ioctl,   
    .release = gpio_close,    
};    

static int __init gpio_init(void)    
{    
    //printk(KERN_INFO "init .... \n");    
    dev_t dev_no;    
    int result,err;    
    err = alloc_chrdev_region(&dev_no,0,1,"my_gpio"); //dynamic request device number    
    if(err<0)    
    {    
        printk(KERN_INFO "ERROR\n");    
        return err;    
    }    
    major = MAJOR(dev_no);    
    gpio_dev = kmalloc(sizeof(struct cdev_gpio),GFP_KERNEL);    
    if(!gpio_dev)    
    {    
        result = -ENOMEM;    
        goto fail_malloc;    
    }    
    memset(gpio_dev,0,sizeof(*gpio_dev));    

    cdev_init(&gpio_dev->cdev,&fops);     
    gpio_dev->cdev.owner = THIS_MODULE;    
    result = cdev_add(&gpio_dev->cdev,dev_no,1);     
    if(result <0)    
    {   printk(KERN_INFO "error\n");    
        goto fail_add;    
    }    
    gpio_class = class_create(THIS_MODULE,"mtgpio68");  //in sys/class create sysfs file    
    device_create(gpio_class,NULL,MKDEV(major,0),NULL,"gpio68"); //dynamic create device file  /dev/mygpio    
    return 0;    
fail_add:    
    kfree(gpio_dev);    
fail_malloc:    
    unregister_chrdev_region(dev_no,1);    
    return result;    

}    

static void __exit gpio_exit(void)    
{    
    dev_t dev_no=MKDEV(major,0);    

    unregister_chrdev_region(dev_no,1);    
    cdev_del(&gpio_dev->cdev);    
    kfree(gpio_dev);    
    device_destroy(gpio_class,dev_no);    
    class_destroy(gpio_class);    
    printk(KERN_INFO "exit........ \n");    
}    
module_init(gpio_init);    
module_exit(gpio_exit);    
MODULE_AUTHOR("");    
MODULE_DESCRIPTION("control_gpio68");    
MODULE_LICENSE("GPL");   

 

 

 

Android 系统编译相关文章

  • RK3399 Android7.1系统,GPIO控制详解
  • RK3399 Android7.1系统,GPIO内核驱动开发
  • ubuntu 18.04 LTS 上编译 RK3399 Android 7.1 遇到的错误及解决方法
标签: Android系统编译
最后更新:2022年6月28日

千古八方

物格而后知至,知至而后意诚,意诚而后心正

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

千古八方

物格而后知至,知至而后意诚,意诚而后心正

最新 热点 随机
最新 热点 随机
火狐下远离内容农场的方法! 中国城市生活成本查询 Debian11 系统备份与灾备盘制作 Debian logwatch 自定义配置文件,根据规则忽略掉某些日志内容 Ampache 5.0 报错 The root Ampache folder has changed to ./public socat 正反向传输文件
win10 上蓝牙耳机无声音,几十秒后自动断开 自建NAS,是否有必要定时开关机? Nextcloud 使用occ命令清理文件版本 Android widget - 支持显示距离的雷达扫描控件 CashFlow - 流水账App NAS 文件共享协议Samba、WebDAV、NFS、FTP 对比
分类
  • Android
  • Linux
  • NAS
  • Spring Boot
  • Windows
  • 内网穿透
  • 回忆
  • 基于NEAT的瞎几把寻思算法笔记
  • 散篇
  • 普通人的致富之路在哪里
  • 服务器
  • 未分类
  • 私有云
标签聚合
ubuntu Android Utils Windows NPS Android Widgets 安全维护 Android系统编译 Nextcloud 私有云 内网穿透 linux 群晖NAS Spring Boot 我开源的APP 服务器 散篇 NAS TrueNAS
工具/友链

资源导航 – NAS、私有云存储
在线工具 – MD5、SHA、BASE64、URL编解码
在线工具 – 贷款计算器
在线工具 – IPv4/IPv6地址查询

千古八方 在 B站

千古八方 在 知乎

我的微信小程序:
微信小程序-城市生活成本查询
城市生活成本查询
库房物资流水记账簿
最近评论
Avatar photo
千古八方 发布于 1 个月前(12月28日) 重置命令是Nextcloud提供的,和哪个平台没关系。 如果报错,一般是路径或权限的问题导致的。 ...
Avatar photo
aron 发布于 1 个月前(12月24日) 博主你好 我的nextcloud管理员密码过期了 用了occ命令重置但是报错,能请教下是什么原因...
Avatar photo
千古八方 发布于 2 个月前(12月15日) 贝塞尔这个类在这里 https://gitee.com/aityu/AndroidUtils/blo...
Avatar photo
disco 发布于 2 个月前(12月05日) 有demo链接吗?贝塞尔曲线这个关键类没有写出来~
Avatar photo
HJM 发布于 3 个月前(10月20日) 必须点赞!很有效!

COPYRIGHT © 2022 千古八方的博客. ALL RIGHTS RESERVED.

京ICP备14020471号