R-QWERT
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux驱动:移植内核暂未支持的exFAT驱动
下面就以编译成ko驱动模块的方式为例(当然也可自行参考Linux内核源码fs目录下Kconfig和Makefile,仿照FAT文件系统进行修改实现menuconfig的可视化配置)。Linux内核由于版权问题默认不支持exFAT文件系统,不过开发者可以根据实际情况自行移植驱动进行添加。原创 2023-08-03 18:24:24 · 575 阅读 · 0 评论 -
Linux spi:用户空间“免设备驱动”读写spi设备方法——spidev
spi_device虽然用户空间不需要直接用到spi_device结构体,但是这个结构体和用户空间的程序有密切的关系,理解它的成员有助于理解SPI设备节点的IOCTL命令,所以首先来介绍它。0x010x02(0|0)(0|)(|0)(|)0x040x080x100x20spi_device的mode成员有两个比特位含义很重要:SPI_CPHA选择对数据线采样的时机,0选择每个时钟周期的第一个沿跳变时采样数据,1选择第二个时钟沿采样数据;...转载 2022-08-27 23:22:59 · 7145 阅读 · 0 评论 -
Linux:insmod加载驱动模块传递参数方法
今天在移植电机驱动的过程中,发现编译脚本在加载该驱动模块的时候,却带的有参数,当时就有点纳闷了。然后经过一段时间的各种查找,终于知道加载驱动模块时传递参数的奥妙;1、应用层在应用程序中,我们通过命令行给main函数传递参数,而在加载驱动模块时,我们可以使用module_param()来传递参数;例如在如下程序段中int main(int argc,char *argv[ ]){ printf("argv[0] %s\n",argv[0]); printf("argv[1] %s\n",argv转载 2021-10-13 23:02:07 · 4174 阅读 · 0 评论 -
Linux:使用/dev/mem内存映射的方式操作GPIO口
使用的是全志H3的芯片,运行Debian Desktop系统的ARM版本Armbian,要控制外部几个IO口,可以使用很多种方法,如果对GPIO的操作速度有要求就需要使用直接操作内存寄存器的方式来控制GPIO口。AllWinner的官方数据手册文档上介绍了GPIO的寄存器内容。GPIO的寄存器在内存的基地址是0x01C20800,所以要将0x01C20800之后的内容映射到进程的虚拟内存之中,使用的mmap函数,这个函数的使用有不少限制,比如最后一个参数offset的意思是要被映射的物理内存地址偏移量,比转载 2021-09-21 12:32:11 · 1580 阅读 · 0 评论 -
Linux:通过sysfs方式控制GPIO(/sys/class/gpio)
一、首先,查看系统中有没有“/sys/class/gpio”这个文件夹,如果没有就在编译内核的时候勾选 Device Drivers-> GPIO Support ->/sys/class/gpio/… (sysfs interface)。 二、通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,directio转载 2021-07-09 14:06:23 · 3776 阅读 · 0 评论 -
Linux驱动:gpio_direction_output和gpio_set_value之间的使用关系
在linux驱动中常常会碰到gpio_set_value(port_num, 0/1)或gpio_direction_output(port_num, 0/1) 这两者有什么关系呢gpio_set_value(port_num, 0/1) 一般只是在这个GPIO口的寄存器上写上某个值,至于这个端口是否设置为输出,它就管不了!而gpio_direction_output(port_num, 0/1),在某个GPIO口写上某个值之后,还会把这个端口设置为输出模式。 因此,有人也许就会建议,把gpio_set_v转载 2021-06-11 14:11:02 · 1858 阅读 · 1 评论 -
Linux驱动:dts设备树详解
文章目录一、什么是设备树?二、DTS、 DTB 和 DTC三、DTS 语法1.dtsi 头文件2.设备节点3.数据形式①、字符串②、32 位无符号整数③、字符串列表4.标准属性(1) compatible 属性(2) model 属性(3) status 属性(4) #address-cells 和#size-cells 属性(5) reg 属性(6) ranges 属性(7) name 属性(8) device_type 属性5.根节点 compatible 属性(1) 使用设备树之前设备匹配方法(2)转载 2021-06-10 20:19:21 · 3481 阅读 · 0 评论 -
Linux驱动:probe函数何时被调用
linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名字匹配,BUS就会调用驱动的probe函数,但是有时我们要看看probe函数里面到底做了什么,还有传递给probe函数的参数我们就不知道在哪定义(反正不是我们在驱动里定义的),如果不知道传递进的参数,去看probe函数总是感觉不求甚解...转载 2021-06-03 19:23:09 · 2881 阅读 · 0 评论 -
Linux驱动:网卡驱动分析之四--实战(移植新内核,针对网卡部分)
文章链接:Linux:移植linux-4.20.9到正点原子imx6ull mini开发板原创 2021-06-10 20:15:02 · 391 阅读 · 0 评论 -
Linux驱动:网卡驱动分析之三--MAC驱动及PHY驱动框架了解
1、前言在了解网卡驱动之前,推荐先看linux内核网络分层结构这篇文章,这里就摘取文章中的两张关于网络数据包的流程图(UDP示例),方便后面网络设备驱动程序的了解:数据结构说明:内核对网络数据包的处理都是基于sk_buff结构的,该结构是内核网络部分最重要的数据结构;对于网络设备驱动比较重要的一部分就是net_device结构体,在include/linux/netdevices.h中定义。(文章只是简单了解驱动框架,没有深入分析)2、MAC控制器驱动程序对于imx6ull的MAC控制原创 2021-06-10 20:13:42 · 4116 阅读 · 0 评论 -
Linux驱动:网卡驱动分析之二--设备树节点分析
1、ethernet设备树节点正如前面所说,内置MAC加外置PHY方案的硬件连接如图:以Freescale imx6ull为例,从dts节点入手,查看其配置:/* imx6ull.dtsi */aliases { ... /* 别名 */ ethernet0 = &fec1; ethernet1 = &fec2;};fec2: ethernet@020b4000 { compatible = "fsl,imx6ul-fec", "fsl,i原创 2021-05-27 20:44:35 · 1937 阅读 · 1 评论 -
Linux驱动:网卡驱动分析之一--硬件简单介绍
1、概念既然是网络,那就涉及到网络OSI(Open System Interconnection)七层模型,示意图如下:(图源网络,如有侵权请联系删除)对于网卡驱动,就涉及到了最底的MAC层和PHY层,其中MAC层有MAC硬件控制器及MAC通信协议组成,也正由于这两层的差异,可以将硬件连接分为以下3种:a. SoC内部没有集成MAC控制器,需要外接MAC+PHY的网络芯片,例如DM9000:(图源网络,如有侵权请联系删除)这种方案的接线一般是以SRAM的方式去连接,实现对以太网的支持。b.原创 2021-05-24 20:26:10 · 3532 阅读 · 0 评论 -
Linux驱动:imx6ull uart驱动简单分析及minicom工具移植使用
1、uart驱动简单分析这部分驱动程序是原厂编写的,但还是看一下了解了解。以Freescale imx6ull为例,在arch/arm/boot/dts/imx6ull.dtsi中可以找到串口节点:/* 串口1节点 */uart1: serial@02020000 { compatible = "fsl,imx6ul-uart", "fsl,imx6q-uart", "fsl,imx21-uart"; reg = <0x02020000 0x4000>; i原创 2021-05-23 19:22:15 · 745 阅读 · 1 评论 -
Linux驱动:multi-touch多点触摸电容屏驱动分析
1、简介(a). 基本概念多点触摸(multitouch,MT)屏的IC芯片一般都是通过I2C协议通信的,所以涉及到**“I2C驱动”,而对于屏幕的按下、抬起等,又涉及到“中断机制”和“input输入子系统”**。所以可以先参考以下几篇文章:Linux驱动:I2C设备驱动Linux驱动:内核的中断机制Linux驱动:input输入子系统Linux驱动:电阻屏驱动分析除了参考以上几种驱动机制,linux内核已经提供关于多点触摸协议的说明文档:Documentation/input/multi原创 2021-05-22 16:15:54 · 932 阅读 · 0 评论 -
Linux驱动:电阻屏驱动分析
1、简介对于电阻屏的原理,需要知道的一点是,它会通过触摸点所在位置的不同而导致在X轴与Y轴电阻电压值的不同而确定坐标的,既然是通过电压值来确定,那就涉及到ADC的采样。有些触摸屏内部集成了i2c控制器,ADC的采样由触摸屏的IC去完成,这样一来SoC就可以通过i2c与它通信来读取坐标值,例如内核中的drivers/input/touchscreen/sx8654.c,它就是以i2c通信的电阻触摸屏;而有些触摸屏则是引出2根线(X轴与Y轴的模拟信号引脚)连接到SoC的ADC采样引脚,SoC通过读取内部AD原创 2021-05-21 22:47:40 · 765 阅读 · 0 评论 -
Linux驱动:基于framebuffer(fb)的驱动分析
基于framebuffer的驱动分析 framebuffer帧缓冲(简称fb)是linux内核中用代码虚拟出的一个设备,是一个platform类型设备,设备文件位于/dev/fb* 在嵌入式系统中一般没有专门的显存,而仅仅是从RAM(SDRAM)空间中分配一段显示缓冲区 framebuffer的作用是:向应用层提供一个统一标准接口的显示设备。不论最终输出是通过hdmi还是lcd控制器,可以认为所有的GUI都...转载 2021-05-17 22:51:59 · 3939 阅读 · 0 评论 -
Linux驱动:基于imx6ull分析PWM驱动及backlight屏幕背光驱动
文章目录1、PWM驱动1.1 驱动分析1.2 使用方法2、backlight驱动2.1 驱动分析2.2 调试方法1、PWM驱动1.1 驱动分析先看设备树文件imx6ull.dtsi的PWM节点,以PWM1为例(绑定说明:Documentation/devicetree/bindings/pwm/imx-pwm.txt):pwm1: pwm@02080000 { compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; reg = <0x02原创 2021-04-29 19:53:39 · 1804 阅读 · 0 评论 -
Linux驱动:在imx6ull上适配RT3070 USB WiFi网卡
1、说明如图,这是一款基于Ralink Technology RT3070芯片的USB Wi-Fi无线网卡和IEEE 802.11b/g/n标准,支持WEP 64/128,WPA,WPA2,TKIP,AES加密方式。2、适配驱动通过[Hardware for Linux]的查找,发现Linux内核中已经支持这款芯片,不同内核版本需要配置的选项如图:本次适配的imx6ull内核版本为4.1.15,所以make menuconfig配置的路径如下:Device Drivers --->原创 2021-04-28 15:22:15 · 1109 阅读 · 0 评论 -
Linux驱动:SPI设备驱动(基于Freescale i.MX6ULL平台了解SPI的驱动框架,顺便写个ICM20608驱动)
文章目录1、简介2、SPI控制器、设备驱动的结构体定义2.1 结构体定义--SPI控制器2.2 结构体定义--SPI设备2.3 结构体定义--SPI驱动3、SPI总线、设备、驱动、硬件操作的联系3.1 SPI控制器驱动加载到内核的过程3.2 SPI控制器驱动如何操作硬件3.3 SPI设备 <-----> SPI驱动3.4 SPI设备 <-----> SPI控制器3.5 SPI驱动 <-----> SPI控制器4、SPI驱动传输数据API函数5、SPI设备驱动框原创 2020-12-19 16:16:19 · 994 阅读 · 7 评论 -
Linux:V4L2应用及框架分析
文章目录1、V4L2简介1.1 来自内核文档的介绍1.2 V4L2支持设备1.3 V4L2驱动框架提供的ioctl选项2、从应用层看V4L2视频捕获功能2.1 相关操作步骤2.1.1 打开设备:open2.1.2 查询设备性能:VIDIOC_QUERYCAP2.1.3 枚举格式:VIDIOC_ENUM_FMT2.1.4 设置格式:VIDIOC_S_FMT2.1.5 “请求”缓存:VIDIOC_REQBUFS2.1.6 查询/映射缓存:VIDIOC_QUERYBUF2.1.7 将缓存放入队列:VIDIOC_Q原创 2020-12-12 14:49:04 · 589 阅读 · 1 评论 -
Linux i2c:用户空间“免设备驱动”读写i2c设备方法2——i2c-tools工具(i2cdetect/i2cdump...)的编译及使用示例
1、准备如上篇文章所说,用户空间“免设备驱动”读写i2c设备的前提是内核里面配置了i2c-dev,由于i2c-tools工具与上一篇《参考内核文档(Documentation/i2c/dev-interface)编写自己的测试程序》的本质都是一样的(注意:有一点与上一篇文章的应用程序不同,i2c-tools是可以搭配“设备驱动”一起调试的),所以也需要确认是否已经配置了i2c-dev,菜单路径如下:Device Drivers ---> -*- I2C support --->原创 2021-01-21 10:01:24 · 810 阅读 · 0 评论 -
Linux i2c:用户空间“免设备驱动”读写i2c设备方法1——参考内核文档编写自己的测试程序
1、简述一般来说,用户空间操作硬件设备都需要驱动的支持,但是在Linux环境中可以从用户空间访问i2c适配器上的所有设备,它是内核的一个通用驱动,所以我们不需要自己写对应的“设备驱动”也可以访问,注意是“设备驱动”。直接从用户空间访问的前提是内核里面配置了i2c-dev,如何判断呢?在命令行里面输入ls /dev/i2c-* 查看是否有对应的设备节点,如果没有就需要去配置内核kernel,menuconfig菜单位置如下:Device Drivers ---> -*- I2C suppor原创 2020-05-03 19:19:50 · 762 阅读 · 0 评论 -
Linux驱动:I2C设备驱动(基于Freescale i.MX6ULL平台了解I2C的驱动框架,顺便写个简陋的MPU6050驱动)
文章目录1、简介2、I2C总线、设备和驱动的结构体定义2.1 结构体定义--I2C总线2.2 结构体定义--I2C设备2.3 结构体定义--I2C驱动3、I2C总线、设备、驱动、硬件操作的联系3.1 I2C总线驱动加载到内核的过程3.2 I2C总线驱动如何操作硬件3.3 I2C设备 <-----> I2C驱动3.4 I2C设备 <-----> I2C总线(控制器)3.5 I2C驱动 <-----> I2C总线(控制器)4、I2C驱动传输数据API函数5、I2C原创 2020-12-05 10:46:26 · 1321 阅读 · 0 评论 -
Linux驱动:input输入子系统
input输入子系统1、input输入子系统1.1 简介1.2 相关API函数1.3 使用流程(驱动框架)2、驱动示例3、测试程序4、测试结果5、内核自带的input按键驱动附:对应的设备树节点1、input输入子系统1.1 简介input子系统是内核针对某一类输入设备的一个框架,键盘、鼠标、按键和触摸屏等设备都属于输入设备。它主要分成了三部分:drivers:驱动层,我们主要编写这部分的驱动代码,驱动里只要上报键盘按下、鼠标点击等事件即可,至于这些事件到底有什么用,就是通过接下来的input c原创 2020-12-01 15:22:52 · 432 阅读 · 0 评论 -
Linux驱动:内核中的MISC“杂项”驱动
内核中的MISC“杂项”驱动1、简介2、使用方法(MISC驱动程序框架)3、使用示例3.1 修改设备树添加设备节点3.2 驱动程序4、测试程序1、简介 MISC是杂项英文单词miscellaneous的简写,内核里面用于描述那些类别不是很明确的设备,通常结合platform总线驱动来编写驱动。其中所有MISC驱动的主设备号都是10,而次设备号则可以从内核源码的include/linux/miscdevice.h文件中选择或者自定义,同时该头文件里也定义了MISC设备结构体和驱动的注册/注销方法,如下所原创 2020-11-28 15:33:25 · 628 阅读 · 0 评论 -
Linux驱动:用platform平台总线驱动编写一个led驱动
文章目录1、平台总线1.1 简介1.2 相关API函数1.2.1 平台设备1.2.2 平台驱动1.3 驱动程序框架1.3.1 平台设备1.3.2 平台驱动3、平台驱动和平台设备老式写法(不使用设备树写法)3.1 平台设备3.2 平台驱动4、平台驱动和平台设备新式写法(使用设备树写法)4.1 平台设备(设备树节点)4.2 平台驱动(驱动代码)5、测试程序6、内核中的led驱动1、平台总线1.1 简介 platform平台总线并不是像usb、i2c那些物理的总线,它是在软件上实现的一种“虚拟”总线。它的原创 2020-11-27 21:38:26 · 686 阅读 · 1 评论 -
Linux驱动:异步通知实现读取按键值
异步通知实现读取按键值1、异步通知1.1 简介1.2 异步通知的API函数1.2.1 内核空间的API函数1.2.2 用户空间的API函数2、驱动源码1、异步通知1.1 简介1.2 异步通知的API函数1.2.1 内核空间的API函数1.2.2 用户空间的API函数2、驱动源码...原创 2020-11-26 22:07:36 · 381 阅读 · 1 评论 -
Linux驱动:I/O多路复用的select、poll、epoll机制
I/O多路复用的select、poll、epoll机制1、I/O多路复用机制1.1 简介1.2 API函数1.2.1 驱动层1.2.2 应用层2、驱动源码(内核空间)3、测试程序(用户空间)3.1 select函数3.2 poll函数1、I/O多路复用机制1.1 简介 select、poll和epoll都允许一个进程监视多个文件描述符,一旦某个描述符可读或者可写,就能够执行相应的读写操作了。poll机制的作用主要是通过在用户空间调用select、poll等函数来对设备进行非阻塞的访问,然后用户空间经原创 2020-11-26 22:07:46 · 376 阅读 · 4 评论 -
Linux驱动:内核的中断机制之二--request_threaded_irq函数使用
内核开始支持中断线程(threaded interrupt handler),使用接口request_threaded_irq;原来的request_irq也继续支持。使用时可根据实际情况选择合适的接口,可使用request_threaded_irq的地方没必要继续使用request_irq加tasklet/workqueue或者内核线程的方式;如果中断处理简单时也不要执着使用request_threaded_irq。下面先贴上2.6.35内核代码中这两个接口声明的代码,然后转贴一点资料。最后把添加thr转载 2021-05-22 11:30:03 · 13102 阅读 · 1 评论 -
Linux驱动:内核的中断机制之一--基本使用方法与中断的上/下半部分
内核的中断机制1、内核中断1.1 简介1.2 中断节点在设备树中的框架1.3 内核中断相关的API函数1.4 内核中断的使用方法2、修改设备树添加按键中断节点3、驱动源码---------------------分割线---------------------4、内核中断的上半部分和下半部分4.1 下半部分实现方法--软中断4.2 下半部分实现方法--tasklet4.2.1 tasklet相关的API函数4.2.2 tasklet的使用方法4.3 下半部分实现方法--工作队列4.3.1 工作队列的相关AP原创 2020-11-26 22:07:22 · 557 阅读 · 0 评论 -
Linux驱动:普通字符设备驱动的两种写法
普通字符设备驱动的两种注册方式(新&旧)在内核中,对于一个普通的字符设备驱动,不难发现有两种注册方式:register_chrdev族函数+创建设备类、文件的函数:这种方法是2.4版本流行的旧方法。优点是简单;缺点是无法指定次设备号register_chrdev_region族+cdev族+创建设备类、文件的函数:这种方法是2.6版本推荐的新方法。优点是可以设置主次设备号;缺点是比较复杂1.旧版本的注册方式/*需要的定义*/int test_major = -1;stati转载 2021-05-22 09:39:41 · 315 阅读 · 0 评论 -
Linux内核定时器:高精度定时器hrtimer的用例
之前介绍了timer_list内核定时器,它的精度在毫秒级别,再高一点它就无能为力了,所幸内核提供了高精度定时器 hrtimer。源文件在linux/kernel/hrtimer.c中。接口简单。下面介绍一下相关接口1. 定时器定义与绑定超时回调函数static struct hrtimer timer; /* 设置回调函数 */timer.function = hrtimer_hander; 2. 定时器初始化/* * 参数timer是hrtimer指针, * 参数clock_i转载 2021-08-27 15:15:29 · 1937 阅读 · 0 评论 -
Linux驱动:LED驱动之十——添加内核定时器实现LED闪烁
添加内核定时器实现LED闪烁1、内核定时器1.1 简介1.2 调度函数遵循的原则1.3 两个比较重要的参数1.3.1 HZ1.3.2 jiffies1.4 内核定时器的API函数1.5 内核定时器的使用流程2、驱动源码3、编译驱动的Makefile和测试程序4、实现效果5、高精度定时器1、内核定时器1.1 简介内核定时器是内核用来控制在未来某个时间点(基于jiffies,瞬间)调度来异步调用某个函数的一种机制。它有以下特点:依赖系统时钟节拍;与MCU等定时器不同,内核定时器是一个软定时器,但最终原创 2020-11-26 22:07:06 · 874 阅读 · 0 评论 -
Linux驱动:LED驱动之九——mutex互斥锁(并发与竞争)
这里写目录标题1、前言2、互斥锁是什么3、驱动源码4、编译驱动程序的Makefile、测试程序5、测试结果6、总结与补充1、前言 应用层有各种锁和信号量等机制,这些机制在底层也同样具备,往下看吧,有什么理解错误的还希望各位指点指点。2、互斥锁是什么3、驱动源码4、编译驱动程序的Makefile、测试程序5、测试结果6、总结与补充...原创 2020-11-26 22:06:55 · 362 阅读 · 0 评论 -
Linux驱动:LED驱动之八——semaphore信号量(并发与竞争)
这里写目录标题1、前言2、信号量是什么3、驱动源码4、编译驱动程序的Makefile、测试程序5、测试结果6、总结与补充1、前言2、信号量是什么3、驱动源码4、编译驱动程序的Makefile、测试程序5、测试结果6、总结与补充...原创 2020-11-26 22:06:45 · 301 阅读 · 0 评论 -
Linux驱动:LED驱动之七——spinlock自旋锁(并发与竞争)
这里写目录标题1、前言2、自旋锁是什么3、驱动源码4、编译驱动程序的Makefile、测试程序5、测试结果6、总结与补充1、前言2、自旋锁是什么 自旋锁3、驱动源码4、编译驱动程序的Makefile、测试程序5、测试结果6、总结与补充...原创 2020-11-26 22:06:35 · 425 阅读 · 0 评论 -
Linux驱动:LED驱动之六——在原LED驱动上添加atomic原子操作(并发与竞争)
这里写目录标题1、前言2、atomic原子操作知根到底3、驱动源码:led_atomic.c4、编译驱动程序的Makefile、测试程序5、总结与补充1、前言 上一篇文章说到了Linux是多任务的操作系统,所以有可能会存在多个应用程序使用到同一个驱动程序,那么如果不加以任何控制的话,就有可能会导致一些错误的结果。针对这些问题,内核早就有所准备,内核里面有2、atomic原子操作知根到底3、驱动源码:led_atomic.c4、编译驱动程序的Makefile、测试程序在上一篇文章Makef原创 2020-11-26 22:06:21 · 249 阅读 · 0 评论 -
Linux驱动:LED驱动之五——pinctrl和gpio子系统形式的LED驱动
设备树修改imx6ull-14x14-evk.dts/ { model = "Freescale i.MX6 ULL 14x14 EVK Board"; compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull"; ... led0 { #address-cells = <1>; #size-cells = <1>; compatible = "led0"; pinctrl-names = "defaul原创 2020-11-26 22:06:11 · 756 阅读 · 0 评论 -
Linux驱动:LED驱动之四——设备树形式的LED驱动
#include <linux/ide.h>#include <linux/module.h>#include <linux/cdev.h>#include <linux/device.h>#include <linux/of_address.h>// 用于映射后保存虚拟地址static void __iomem *IMX6U_CCM_CCGR1;static void __iomem *SW_MUX_GPIO1_IO03;st原创 2020-11-26 22:06:02 · 305 阅读 · 0 评论 -
Linux驱动:LED驱动之三——在第一个实验基础上改写成LED驱动
本篇文章直接在第一个实验【Linux驱动:字符设备驱动模型之一——创建一个设备节点及测试】的代码的基础上添加硬件的操作,实现驱动程序控制LED的硬件操作。经过对比代码可以看到,相比于第一个实验,驱动的框架是一样的,不同的只是添加了硬件的初始化和操作,硬件部分我们参考正点原子所用到的寄存器操作:1、驱动程序:led.c#include <linux/ide.h>#include <linux/module.h>#include <linux/cdev.h>#i原创 2020-11-26 22:05:47 · 260 阅读 · 0 评论