华清远见上海中心班--11.17作业
一、用ioctl传递字符数组
#ifndef __LED_H__
#define __LED_H__
//编写命令码
#define UACCESS_BUF _IOW('a',1,char [128])
#endif#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include "led.h"
#define CNAME "myled"int major;
//打开
int mycdev_open(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
//关闭
int mycdev_close(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
long my_ioctl(struct file* file,unsigned int cmd,unsigned long arg)
{int ret;char kbuf[128] = {0};if(cmd == UACCESS_BUF){ret = copy_from_user(kbuf,(void*)arg,sizeof(kbuf));printk("kbuf = %s\n",kbuf); }return 0;
}
const struct file_operations fops ={.open = mycdev_open,.release = mycdev_close,.unlocked_ioctl = my_ioctl,
};
//入口
static int __init demo_init(void)
{//注册字符设备驱动major = register_chrdev(0,CNAME,&fops);if(major <0){printk("registe chrdec is error\n");return major;}printk("major=%d\n",major);return 0;
}
static void __exit demo_exit(void)
{//注销字符设备驱动unregister_chrdev(major,CNAME);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include "led.h"
char buf[128]={"I am world"};
int main(int argc,char const *argv[])
{int fd = -1;fd = open("/dev/myled",O_RDWR);if(-1 == fd){perror("open is error\n");exit(1);}ioctl(fd,UACCESS_BUF,buf);close(fd);return 0;
}
测试现象:用dmesg命令查看到,在内核中打印的语句是与用户空间传输的“I am world”一致
二、用ioctl传递结构体
#ifndef __LED_H__
#define __LED_H__typedef struct{int width;int higth;
}image_t;
//编写命令码
#define UACCESS_STRUCT _IOW('a',1,image_t)
#endif#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include "led.h"
#define CNAME "myled"int major;
//打开
int mycdev_open(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
//关闭
int mycdev_close(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}
long my_ioctl(struct file* file,unsigned int cmd,unsigned long arg)
{int ret;image_t kimage;if(cmd == UACCESS_STRUCT){ret = copy_from_user(&kimage,(void*)arg,sizeof(kimage));printk("width = %d\n",kimage.width); printk("higth = %d\n",kimage.higth);kimage.width += 10;kimage.higth += 10;ret = copy_to_user((void*)arg,&kimage,sizeof(kimage));if(ret){printk("to user error\n");return -EIO;}}return 0;
}
const struct file_operations fops ={.open = mycdev_open,.release = mycdev_close,.unlocked_ioctl = my_ioctl,
};
//入口
static int __init demo_init(void)
{//注册字符设备驱动major = register_chrdev(0,CNAME,&fops);if(major <0){printk("registe chrdec is error\n");return major;}printk("major=%d\n",major);return 0;
}
static void __exit demo_exit(void)
{//注销字符设备驱动unregister_chrdev(major,CNAME);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include "led.h"
int main(int argc,char const *argv[])
{image_t image ={20,1024};int fd = -1;fd = open("/dev/myled",O_RDWR);if(-1 == fd){perror("open is error\n");exit(1);}ioctl(fd,UACCESS_STRUCT,&image);printf("width=%d\n",image.width);printf("higth=%d\n",image.higth);close(fd);return 0;
}
测试现象:dmesg查看到width=20,higth=1024;用户空间接收到内核传回的+10的值,width=30,higth=1034
华清远见上海中心班--11.17作业相关推荐
- 华清远见上海中心培训感言
最早接触华清是在2022年寒假后学校安排的线上实习,这时也正值春招时间,投递了许多简历经历了部分面试,在求职面试中发现了自己求职优势的不足.一方面,在大学没有积累足够的专业知识以及动手实验操作能力和参 ...
- 华清远见上海中心22071班--11.19作业
题目:实现开发板点灯操作 程序要求: 1)分部实现注册字符设备驱动 2)自动创建设备节点 3)通过结构体对led灯地址进行映射 4)次设备号完成私有数据传参 5)在open函数中获取到次设备号,用私有 ...
- 华清远见上海中心22071班--11.24作业
题目:应用层采取ioctl命令控制,驱动代码用GPIO子系统,实现开发板6盏灯的循环亮灭 头文件程序: #ifndef __LED_H__ #define __LED_H__typedef enum{ ...
- 华清远见上海中心22071班--11.28作业
题目:三个按键实现按键中断,key1>>led1,key2>>led2, key3>>led3.按键按一下灯亮,再按一下灯灭 . #include <linu ...
- 华清远见上海中心22071班--11.29作业
题目:paltform总线中通过名字.名字列表和设备树三种方式实现driver和device匹配 方式一>>>名字: #include <linux/init.h> #i ...
- 华清远见上海中心22071班 9.19作业
目录 1.并发服务器 1)多进程并发服务器 2)多线程并发服务器 2.域套接字 1.流式域套接字(TCP) 1.1服务器 1.2客户端 2.报式套接字(UDP) 2.1服务器 2.2客户端 1.并发服 ...
- 华清远见上海中心22071班 8.25作业
目录 1.用无头结点的循环链表实现约瑟夫环问题 头文件: 功能函数: 主函数: 终端输出: 2.顺序栈实现进制转换问题 头文件: 功能函数: 主函数: 终端输出: 1.用无头结点的循环链表实现约瑟夫环 ...
- 华清远见上海中心22071班 9.2作业
1.用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分.要求用文件IO实现. 函数: #include <stdio.h> #include <fcntl.h&g ...
- 华清远见上海中心22071班
按键中断实现电灯 1.将myirq写入设备树文件中 myirq{interrupt-parent = <&gpiof>;interrupts = <7 0>,<8 ...
最新文章
- OpenVINO实时人脸表面3D点云提取
- ifndef/define/endif——主要目的是防止头文件的重复包含和编译
- AX宏Macros运算
- pycharm导入python环境是空的_PyCharm导入python项目并配置虚拟环境的教程详解
- Matlab--三维散点插值成曲面
- 一个测试新人的职业规划——三个月
- 计算机网络课设-小型校园网,计算机网络课设 小型校园网
- Nacos系列:欢迎来到Nacos的世界!
- 翻牌游戏如何打乱牌面java_如何游戏4Bet底池?
- pip和requests模块的安装
- 关于Selenium2Library库导入PyCharm无法自动感知关键字的解决方法
- 通达OA2017工作流数据报表查询全部流程
- Qt定时器QTimer使用教程与代码演示
- 晶振的匹配电容计算公式
- 精通linux开关机表情包,关机表情包 - 关机微信表情包 - 关机QQ表情包 - 发表情 fabiaoqing.com...
- 手把手教你基于Springboot+Vue搭建个人博客网站
- 数据库:概念结构设计
- Js 高德地图SDK
- MATLAB—离散一元、二元、多元函数求导求梯度(二维、三维、多维空间)(diff和gradient)
- 史上最好用的SEO工具之一ahrefs
热门文章
- 几行JS代码实现b站直播间弹幕抽奖
- 220817-3Dslicer配准学习记录
- AOSP : Android源码下载
- android重写item,android-在RecyclerView.Adap中重写notifyItemChanged的动画
- python 中任务 6.3 构建并评分分类模型(SVM模型) 学习笔记3
- 2021 缺货 缺货
- If-then结构控制介绍
- 为什么谐振时电抗为0_调频串并联谐振交流耐压试验装置组成及参数
- 铁道部12306后台技术框架 完整异常栈信息以及技术缺点和漏洞
- vulnhub-BBS(cute)1.0.1