Linux系统ioctl使用示例 ioctl实验

2023-11-01

    本文是我在andoid实验的ioctl的功能,如双向传递参数。贴出来希望对学习ioctl的人很有帮助。
    linux的ioctl功能是很强大的,android显示模块还有camera模块都离不开ioctl让上层和内核交互。

这个实验对初学者很有帮助的。


board中添加platform_devce
static struct ioctl_test_platform_data ioctl_pdata = {
        static struct ioctl_test_platform_data ioctl_pdata = {
        .gpio=17,
};

static struct platform_device msm_device_ioctl = {
    .name    = "gpio_test",
    .id        = -1,
    .dev    = {
        .platform_data = &ioctl_pdata,
    },
};


头文件:
ioctl_test.h

#ifndef IOCTL_TEST_H
#define IOCTL_TEST_H


/* platform data from board file */
struct ioctl_test_platform_data{
    u16 gpio;
};

struct gpio_priv_t {
    
    int gpio;
    int state0;
    int state1;
    int state2;
    int state3;
    
};

#define GPIO_TEST_IOC_MAGIC          0x92

#define GPIO_TEST_SET_HIGH          _IO(GPIO_TEST_IOC_MAGIC, 1)
#define GPIO_TEST_SET_LOW           _IO(GPIO_TEST_IOC_MAGIC, 2)

#define GPIO_TEST_WRITE_STRUCT           _IOW(GPIO_TEST_IOC_MAGIC, 3,struct gpio_priv_t *)
#define GPIO_TEST_WRITE_INT         _IOW(GPIO_TEST_IOC_MAGIC, 4,unsigned int *)

#define GPIO_TEST_READ_STRUCT          _IOR(GPIO_TEST_IOC_MAGIC, 5,struct gpio_priv_t *)
#define GPIO_TEST_READ_INT          _IOR(GPIO_TEST_IOC_MAGIC, 6,unsigned int *)




#endif




driver:
生成设备节点:/dev/gpio_test
ioctl_test.c

#define pr_fmt(fmt) "%s: " fmt, __func__

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/uaccess.h>
#include <linux/regulator/consumer.h>
#include <linux/platform_device.h>
#include <linux/mutex.h>
#include <mach/gpio.h>
#include<linux/ioctl_test.h>


static struct gpio_priv_t *gpio_priv;


static int gpio_test_open(struct inode *inode, struct file *filp)
{
    if (gpio_priv == NULL)
        return -ENODEV;

    filp->private_data = gpio_priv;

    return 0;
}

static int gpio_test_release(struct inode *inode, struct file *filp)
{

    filp->private_data = NULL;

    return 0;
}


static long
gpio_test_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
    int err = 0;
    void __user *argp = (void __user *)arg;
    int value0;
    int value1 ;
    

    /* Verify user arguments. */
    if (_IOC_TYPE(cmd) != GPIO_TEST_IOC_MAGIC)
        return -ENOTTY;

    switch (cmd) {
    case GPIO_TEST_SET_HIGH:
        printk("GPIO_TEST_SET_HIGH\n");
        if (arg == 0) {
            pr_err("user space arg not supplied\n");
            err = -EFAULT;
            break;
        }
        gpio_set_value(17,1);

        break;

    case GPIO_TEST_SET_LOW:
        printk("GPIO_TEST_SET_LOW\n");
        if (arg == 0) {
            pr_err("user space arg not supplied\n");
            err = -EFAULT;
            break;
        }
        gpio_set_value(17,0);

        break;

    case GPIO_TEST_WRITE_STRUCT:
        printk("GPIO_TEST_WRITE\n");
        if (copy_from_user(gpio_priv, argp, sizeof(struct gpio_priv_t)))
            return -EFAULT;
        printk("gpio_priv->state0=%d\n",gpio_priv->state0);
        printk("gpio_priv->state1=%d\n",gpio_priv->state1);
        printk("gpio_priv->state2=%d\n",gpio_priv->state2);

        break;

    case GPIO_TEST_READ_STRUCT:
        printk("GPIO_TEST_READ\n");
        gpio_priv->state0=1;
        gpio_priv->state1=2;
        gpio_priv->state2=3;
        if (copy_to_user(argp, gpio_priv, sizeof(struct gpio_priv_t)))
            return -EFAULT;

        break;
        
    case GPIO_TEST_WRITE_INT:
        printk("GPIO_TEST_WRITE_INT\n");
        if(copy_from_user(&value0,argp,sizeof(int)))
            return -EFAULT;
        printk("value0 = %d\n",value0);
        break;

    case GPIO_TEST_READ_INT:
        printk("GPIO_TEST_READ_INT\n");
        value1=101;
        if (copy_to_user(argp, &value1, sizeof(int)))
            return -EFAULT;
        break;
        
    default:
        pr_err("Invalid ioctl command.\n");
        return -ENOTTY;
    }

    return err;
}

static const struct file_operations gpio_test_fops = {
    .owner = THIS_MODULE,
    .unlocked_ioctl = gpio_test_ioctl,
    .open = gpio_test_open,
    .release = gpio_test_release
};

static struct miscdevice gpio_test_dev = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = "gpio_test",
    .fops = &gpio_test_fops
};


static int gpio_test_probe(struct platform_device *pdev)
{
    int ret = 0;

    printk("gpio_test_probe 0\n");
    
    /* Initialize */
    gpio_priv = kzalloc(sizeof(struct gpio_priv_t), GFP_KERNEL);

    if (gpio_priv == NULL) {
        pr_alert("Not enough memory to initialize device\n");
        return -ENOMEM;
    }

    ret = misc_register(&gpio_test_dev);
    
    if (ret < 0)
        goto err;
    return 0;

err:
    printk("gpio_test register failed\n");
    

    kfree(gpio_priv);
    gpio_priv = NULL;

    return ret;

}

static int __devexit gpio_test_remove(struct platform_device *plat)
{

    kfree(gpio_priv);
    gpio_priv = NULL;

    misc_deregister(&gpio_test_dev);
    printk("gpio_test remove\n");
    return 0;
}

static struct platform_driver gpio_test_driver = {
    .probe = gpio_test_probe,
    .remove = gpio_test_remove,
    .driver = {
        .name = "gpio_test",
        .owner = THIS_MODULE,
    },
};

static int __init gpio_test_init(void)
    
{
    printk("gpio_test_init  \n");
    return platform_driver_register(&gpio_test_driver);
}

static void __exit gpio_test_exit(void)
{
    platform_driver_unregister(&gpio_test_driver);
}



module_init(gpio_test_init);
module_exit(gpio_test_exit);

应用层:

ioctl_test_app.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>


struct gpio_priv_t {
    
    int gpio;
    int state0;
    int state1;
    int state2;
    int state3;
    
};

#define GPIO_TEST_IOC_MAGIC          0x92

#define GPIO_TEST_IOC_MAGIC          0x92

#define GPIO_TEST_SET_HIGH          _IO(GPIO_TEST_IOC_MAGIC, 1)
#define GPIO_TEST_SET_LOW           _IO(GPIO_TEST_IOC_MAGIC, 2)

#define GPIO_TEST_WRITE_STRUCT           _IOW(GPIO_TEST_IOC_MAGIC, 3,struct gpio_priv_t *)
#define GPIO_TEST_WRITE_INT         _IOW(GPIO_TEST_IOC_MAGIC, 4,unsigned int *)

#define GPIO_TEST_READ_STRUCT          _IOR(GPIO_TEST_IOC_MAGIC, 5,struct gpio_priv_t *)
#define GPIO_TEST_READ_INT          _IOR(GPIO_TEST_IOC_MAGIC, 6,unsigned int *)




static struct gpio_priv_t my_gpio;

int main(int argc, char *argv[])
{

    int ret = 0;
    
    int fp = 0;
    int prama;
    int prama0;
    prama=100;
    my_gpio.state0=4;
    my_gpio.state1=5;
    my_gpio.state2=6;

    printf("ioctl  test... ...\n");
    
    //open module
    if ((ret = (fp = open("/dev/gpio_test", O_RDWR))) < 0)
    {
        printf("ioctl test error retcode = %d\n", ret);
        exit(0);
    }

    
    ioctl(fp, GPIO_TEST_SET_LOW,1);
    ioctl(fp, GPIO_TEST_SET_HIGH,1);
    ioctl(fp, GPIO_TEST_SET_LOW,1);
    ioctl(fp, GPIO_TEST_WRITE_INT,&prama);
    ioctl(fp, GPIO_TEST_READ_INT,&prama0);
    printf("prama0=%d\n",prama0);
    ioctl(fp, GPIO_TEST_WRITE_STRUCT,&my_gpio);
    ioctl(fp, GPIO_TEST_READ_STRUCT,&my_gpio);
    printf("my_gpio.state0=%d\n",my_gpio.state0);
    printf("my_gpio.state1=%d\n",my_gpio.state1);
    printf("my_gpio.state2=%d\n",my_gpio.state2);
    return ret;

}

在android上实验的
android.mk
#Android.mk //TODO:Here is makefile reference
LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_SRC_FILES:= ioctl_test_app.c

LOCAL_MODULE_TAGS := eng optional

LOCAL_MODULE:= ioctl_app

include $(BUILD_EXECUTABLE)


编译make ioctl_app -j4
adb remount
adb push ioctl_app /system/bin
adb shell
ioctl_app
msg:

用户空间:
ioctl  test... ...
prama0=101
my_gpio.state0=1
my_gpio.state1=2
my_gpio.state2=3
内核:
<4>[   37.787128] GPIO_TEST_SET_LOW
<4>[   37.787908] GPIO_TEST_SET_HIGH
<4>[   37.787976] GPIO_TEST_SET_LOW
<4>[   37.788404] GPIO_TEST_WRITE_INT
<4>[   37.788469] value0 = 100
<4>[   37.788519] GPIO_TEST_READ_INT
<4>[   37.789478] GPIO_TEST_WRITE
<4>[   37.790193] gpio_priv->state0=4
<4>[   37.790256] gpio_priv->state1=5
<4>[   37.790668] gpio_priv->state2=6
<4>[   37.790733] GPIO_TEST_READ





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux系统ioctl使用示例 ioctl实验 的相关文章

  • cannot read property ‘line‘ of undefined

    环境 vite vue3 ts 这个问题的点还挺不明显的 翻了翻代码修改记录 发现是漏了结尾的 lt style gt 标签 做好本地代码管理真的很重要
  • gradle 两种更新方法

    第一种 Android studio更新 第一步 在你所在项目文件夹下 你项目根目录gradlewrappergradle wrapper properties 替换 distributionUrl https services gradl
  • 【算法/剑指Offer】地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。

    题目描述 地上有一个m行和n列的方格 一个机器人从坐标0 0的格子开始移动 每一次只能向左 右 上 下四个方向移动一格 但是不能进入行坐标和列坐标的数位之和大于k的格子 例如 当k为18时 机器人能够进入方格 35 37 因为3 5 3 7
  • java螺旋数组

    1 程序设计题 对于一个 n 行 m 列的表格 我们可以使用螺旋的方式给表格依次填上正整数 我们称填好的表格为一个螺旋矩阵 例如 一个 4 行 5 列的螺旋矩阵如下 1 2 3 4 5 14 15 16 17 6 13 20 19 18 7
  • jquery 等待3秒钟执行函数

    setTimeout function div2 hide 3000
  • CF1249B2 Books Exchange (hard version) 题解

    题目大意 共 q q q 组询问 对于每一组询问有长度为 n n n 的序列 p p
  • Linux进程内核栈

    进程创建的时候Linux内核会创建内核栈 arm手册也要求内核态有单独的栈 如应用进程在用户态通过系统调用陷入内核态的时候 上下文信息 如cpu寄存器 需要有个地方保存 如此 从内核态切换回用户态时候 能继续从系统调用之后的代码开始执行 这
  • JSON数据采集(采集JSON格式数据)

    如果想要采集JSON格式数据的网页怎么办 Json数据格式的页面 常出现于以下场景 1 滚动加载页面采集 瀑布流加载采集 2 网址没有变化的页面采集 3 采集点击加载更多的页面 这些页面我们都可以尝试使用简数采集器来实现JSON数据采集 1
  • Java 1.5, 1.6, 1.7, 1.8的区别

    对于很多刚接触java语言的初学者来说 要了解一门语言 最好的方式就是要能从基础的版本进行了解 升级的过程 以及升级的新特性 这样才能循序渐进的学好一门语言 今天先为大家介绍一下JDK1 5版本到JDK1 7版本的特性 希望能给予帮助 JD
  • MybatisPlus自定义sql多表关联分页条件查询

    MybatisPlus自定义sql多表关联分页条件查询 mp封装了crud但是对应复杂sql还是需要自己定义 网上对于多表分页查询的mp描述不是很清楚 我在这里重新写一篇文章 1 数据库准备 需要实现的sql是两表关联条件查询 select
  • MeterSphere 至善篇

    简介 MeterSphere 是一站式开源持续测试平台 涵盖测试跟踪 接口测试 UI 测试和性能测试等功能 全面兼容 JMeter Selenium 等主流开源标准 有效助力开发和测试团队充分利用云弹性进行高度可扩展的自动化测试 加速高质量
  • 自动适配手机网页 适配手机的网站网页 网页自动适配

    自动适配手机网页 适配手机的网站网页 网页自动适配 Category xy309 Time 2012 11 21 8 54 26 点击 14次 Source 兴移 允许网页宽度自动调整 自适应网页设计 到底是怎么做到的 其实并不难 首先 在
  • (面试题)如何解决MySQL慢查询

    慢查询出现原因以及解决方法 扫描多余的数据 避免使用select from xxx 跨多表扫描数据 可以减少join 并适当反范式化 增加冗余数据 以空间换时间 索引没有建立 索引优化不当 或未应用到最佳索引 联合索引使用最左匹配 CREA
  • 【无标题】UE5从百度盘下载UEC++项目到本地所遇到的一些问题和解决方法

    从百度盘里下载UEC 项目到自己的电脑 如果直接用VS打开C 会报打不开源文件等错误 如下图所示 解决方法 删除 图中用红线框的文件夹 若是VS 版本不同也可以把 sln 文件删除 删除后再生成c 项目 若是打开VS 编译是出现以下弹窗 则
  • 一级指针

    一级指针是一种指针 它指向一块内存地址 这块内存中存储的是另一个变量的内存地址 使用一级指针 你可以间接访问到这个变量 在 C C 中 可以使用一级指针来动态分配内存 改变函数参数的值 或者通过指针传递数组 下面是一个使用一级指针的例子 i
  • Java基础 时间相关类小结[Timestamp,Date,Calendar]

    Java基础 时间相关类 Timestamp Date Calendar 前言 一 Timestamp 时间戳 二 Date 日期 三 Calendar 日历 四 Timestamp Date Calendar的转换 五 日期之间的比较 前
  • 计算机组成原理学习笔记——六、总线

    文章目录 计算机组成原理学习笔记 六 CPU总线 6 1 总线概述 6 2 总线仲裁 6 3 总线操作和定时 6 4 总线标准 小结 计算机组成原理学习笔记 六 CPU总线 6 1 总线概述 总线的猝发传送方式 一个总线周期内传输存储地址连

随机推荐

  • iOS架构师_架构模式(代理,block,通知,MVC,MVP,MVVM)

    1 什么是架构 没有明确的定义 属于设计的一方面 没明确的把设计和架构进行区分 它可以小到类与类之间的交互 大到不同模块之间 以及不同业务之间的交互 都可以从架构的层面去理解它 所有架构和设计模式的目的都是为了解耦合 2 基本的架构基础 案
  • windows上通过cmake-gui生成pytorch工程

    在Windows下通过cmake gui exe生成不带cuda的Torch sln工程操作步骤 PyTorch版本使用1 8 1 首先可以先通过打开cmake gui exe 指定pytorch源代码目录和生成vs2017工程的位置 然后
  • 跨库的触发器

    CREATE TRIGGER addtomsgdown ON dbo TABLE1 FOR INSERTASdeclare usernumber as varchar 11 declare messagecontent as varchar
  • Figma 常用功能及快捷键

    Figma 常用功能及快捷键 参考视频 https www bilibili com video BV1Da4y177ks t 27 Figma 快捷键 https figmacn com resource all figma shortc
  • C语言 自己的杂记,随便写的,备忘用

    C语言的主函数声明 int main int argc char argv 或者 int main void 指针 int foo 并不是生命一个名为 foo的变量 变量是foo foo的类型是 指向int的指针 int foo bar 并
  • 4、、多变量线性回归(Linear Regression with Multiple Variables)

    4 1 多维特征 目前为止 我们探讨了单变量 特征的回归模型 现在我们对房价模型增加更多的特征 例如房间数楼层等 构成一个含有多个变量的模型 模型中的特征为 x1 x2 xn 增添更多特征后 我们引入一系列新的注释 n 代表特征的数量 x
  • 第二十六章 登录检验解决⽅案 JWT

    单机tomcat应 登录检验 sesssion保存在浏览器和应 服务器会话之间 户登录成功 服务端会保存 个session 当然客户端有 个sessionId 客户端会把sessionId保存在cookie中 每次请求都会携带这个sessi
  • ctfshow web224 sql_文件上传产生sql注入 详解

    sql 文件上传产生sql注入 首先是扫描 或者 直觉检查 有个robots txt 访问这个页面 发现可以重置密码 重置后admin登录 是个文件上传 测试下来不是文件上传的漏洞 题目也是提示的sql 我这里建了个bmp的文件可以成功上传
  • API接口及apipost,postman的基本使用

    一 简介 接口是 前后端通信的桥梁 被称为 API接口 这里的接口指的是数据接口 一个接口就是 服务中的一个路由规则 根据请求响应结果 给客户端返回结果时 一般是JSON格式的 接口的作用 实现前后端通信 一般接口由一下几个部分组成 请求方
  • Shiro使用redis作为缓存(解决shiro频繁访问Redis)(十一)

    原文地址 转载请注明出处 https blog csdn net qq 34021712 article details 80791219 王赛超 之前写过一篇博客 使用的一个开源项目 实现了redis作为缓存 缓存用户的权限 和 sess
  • 一份完整的HTML模板文件、HTML中容易被忽略的基础知识点

  • Apache HBase API及备份与还原

    一 Apache HBase API Apache HBase也适用于多个外部API 有关更多信息 请参阅Apache HBase外部API 将在下一节的内容中介绍 有关使用本机HBase API的信息 请参阅User API Refere
  • Java 日期时间类的简单介绍及运用

    Date类 1 简介 java util Date类 表示特定的瞬间 精确到毫秒 构造方法 public Date 分配Date对象并初始化此对象 以表示分配它的时间 精确到毫秒 public Date long date 分配Date对象
  • 【Unity】URP渲染管线下代码获取相机的Volume Mask属性

    步骤 1 引用URP的命名空间 2 获取摄像机 3 通过URP扩展获取Volume Mask属性 附 层级的相关代码 Reference 1 引用URP的命名空间 using UnityEngine Rendering Universal
  • SVN的备份与还原

    文章目录 操作环境及相关指令 操作环境 相关指令 防火墙相关指令 端口号相关指令 SVN相关指令 文件传输 备份与还原 备份 SVN相关配置信息 SVN软件安装 还原 访问 SVN地址重定向 操作环境及相关指令 操作环境 操作系统 root
  • SPI技术-JDK实现

    SPI是什么 SPI全称Service Provider Interface 是Java提供的一套用来被第三方实现或者扩展的API 它可以用来启用框架扩展和替换组件 Java SPI 实际上是 基于接口的编程 策略模式 配置文件 组合实现的
  • OpenSSL创建生成CA证书、服务器、客户端证书及密钥

    使用OpenSSL创建生成CA证书 服务器 客户端证书及密钥 目录 使用OpenSSL创建生成CA证书 服务器 客户端证书及密钥 一 生成CA证书 二 生成服务器证书 三 生成客户端证书 四 测试 本片博客对对应资源下载 免积分 https
  • js轮播图的制作详细过程

    JS轮播图 1 在body里面写简单的HTML代码 首先在顶部head标签里引入外部CSS和JS 注意要引入JQuery库 并且放在所写的js上面 不然不会有效果 然后在一个div中包裹两个url 第一个用于显示图片 第二个用于定义页码 代
  • 数据结构——>栈

    栈 栈的介绍 栈的应用场景 栈的代码实现 实现栈的思路分析 入栈 出栈 遍历栈 栈的介绍 1 栈是一个先入后出的有序列表 想象成弹夹 2 变化的一端为栈顶 固定的一端为栈底 3 入栈演示图 4 出栈演示图 栈的应用场景 1 递归 2 四则运
  • Linux系统ioctl使用示例 ioctl实验

    本文是我在andoid实验的ioctl的功能 如双向传递参数 贴出来希望对学习ioctl的人很有帮助 linux的ioctl功能是很强大的 android显示模块还有camera模块都离不开ioctl让上层和内核交互 这个实验对初学者很有帮