linux驱动
听枫要靠谱
这个作者很懒,什么都没留下…
展开
-
linux相关gpio函数
/home/ysy/linux/IMX6ULL/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/include/linux/gpio.hstatic inline int gpio_direction_output(unsigned gpio, int value){ return -ENOSYS;}/home/ysy/linux/IMX6ULL/linux/linux-imx-rel_imx_4.1.15_2.1.0_ga/include/asm-generi原创 2022-04-20 21:50:01 · 657 阅读 · 0 评论 -
linux下的gpiod_get和gpiod_get_index
#define __gpiod_get(dev, con_id, flags, ...) __gpiod_get(dev, con_id, flags)#define gpiod_get(varargs...) __gpiod_get(varargs, GPIOD_ASIS)#define __gpiod_get_index(dev, con_id, index, flags, ...) \ __gpiod_get_index(dev, con_id, index, flags)#define g原创 2022-04-16 20:49:49 · 2222 阅读 · 1 评论 -
platform_get_resource
platform_get_resource 这个函数跟设备树没什么关系,但是设备树中的节点被转换为platform_device后,设备树中的reg属性、interrupts属性也会被转换为“resource”。这时,你可以使用这个函数取出这些资源。一 个 节 点 能 被 转 换 为 platform_device , 如 果 它 的 设 备 树 里 指 定 了 中 断 属 性 , 那 么 可 以 从platform_device 中获得“中断资源”,函数如下,可以使用下列...原创 2022-04-16 13:49:57 · 2497 阅读 · 1 评论 -
LINUX下浮点运算
在内核中尽量不要使用浮点运算,所以不要在驱动将原始值转换为对应的实际值,因为会涉及到浮点计算。可以在应用程序中在计算,如果测试APP 中用到了浮点计算,而 I.MX6U 是支持硬件浮点的,因此我们在编译 icm20608App.c 的时候就可以使能硬件浮点,这样可以加速浮点计算。使能硬件浮点很简单,在编译的时候加入如下参数即可:-march-armv7-a -mfpu-neon -mfloat=hard输入如下命令使能硬件浮点编译 icm20608App.c 这个测试程序:arm-linu.原创 2022-04-14 14:07:07 · 1252 阅读 · 0 评论 -
linux下的msleep(),mdelay函数解析
sleep()函数:static inline void ssleep(unsigned int seconds){ msleep(seconds * 1000);}msleep函数:void msleep(unsigned int msecs){ unsigned long timeout = msecs_to_jiffies(msecs) + 1; while (timeout) timeout = schedule_timeout_uninterruptible(t原创 2022-04-11 19:58:17 · 4343 阅读 · 0 评论 -
哪些设备树节点会被转换为 platform_device以及获取中断号
写驱动程序的时候,需要把驱动分为平台device和平台driver两部分。在平台device中会放入硬件所使用的资源,使用C代码来指定platform_device,当需要修改硬件资源时,比如说想去修改led的引脚时,需要重新修改C文件,重新编译内核。再后来我们使用了设备树,可以在设备树中指定硬件资源。设备树是dts文件,它会转换成dtb文件,最终给内核使用。内核会来解析dtb文件得到一系列的device_node,最后一步,将device_node转换成platform_device....原创 2022-03-28 11:17:14 · 1206 阅读 · 0 评论 -
.ko文件的编译生成
1 KERNELDIR := /home/ysy/linux/IMX6ULL/linux/linux-imxrel_imx_4.1.15_2.1.0_ga_alientek2 CURRENT_PATH := $(shell pwd)3 obj-m := chrdevbase.o4 5 build: kernel_modules6 7 kernel_modules: 8 $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules9 clean:10 .原创 2021-10-14 09:09:29 · 3685 阅读 · 0 评论 -
应用和驱动的关系
一、应用程序和驱动的交互原理1、驱动就是获取外设、或者传感器数据,控制外设。数据会提交给应用程序。Linux驱动编译既要编写一个驱动,还要我们编写一个简单的测试应用程序,APP。单片机下驱动和应用都是放到一个文件里面,也就是杂糅到一起。Linux下驱动和应用是完全分开的。用户空间(用户态)和内核空间(内核态):Linux操作系统内核和驱动程序运行在内核空间、应用程序运行在用户空间。应用程序想要访问内核资源,怎么办,有三种方法:系统调用、异常(中断)和陷入。应用程序不会直接调用系统调用,而是通过原创 2021-04-24 19:01:29 · 1136 阅读 · 0 评论 -
Linux驱动开发思维
一、裸机驱动开发回顾1、底层,跟寄存器打交道,有些MCU提供了库。2、二、Linux驱动开发思维1、Linux下驱动开发直接操作寄存器不现实。2、根据Linux下的各种驱动框架进行开发。一定要满足框架,也就是Linux下各种驱动框架的掌握。3、驱动最终表现就是/dev/xxx文件。打开、关闭、读写、。。。4、现在新的内核支持设备树,这个一个.dts文件,此文件 描述了板子的设备信息。三、Linux驱动开发分类linux驱动分为三大类:1、字符设备驱动,最多的。2、块设备驱动,存储3、原创 2021-04-24 19:00:00 · 116 阅读 · 0 评论 -
Linux 多点电容触摸屏实验(1)
1.多点电容触摸简介ATK-7016 这款屏幕其实是由 TFT LCD+触摸屏组合起来的。底下是 LCD 面板,上面是触摸面板,将两个封装到一起就成了带有触摸屏的 LCD 屏幕。电容触摸屏也是需要一个驱动 IC的,驱动 IC 一般会提供一个 I2C 接口给主控制器,主控制器可以通过 I2C 接口来读取驱动 IC里面的触摸坐标数据。ATK-7016、ATK-7084 这两款屏幕使用的触摸控制 IC 是 FT5426,ATK- 4342 使用的驱动 IC 是 GT9147。这...原创 2021-09-10 09:36:35 · 1258 阅读 · 0 评论 -
Linux RS232/485/GPS 驱动实验(4)-minicom移植
minicom 类似我们常用的串口调试助手,是 Linux 下很常用的一个串口工具,将 minicom移植到我们的开发板中,这样我们就可以借助 minicom 对串口进行读写操作。 1、移植 ncurses minicom 需要用到 ncurses,依次需要先移植 ncurses,如果前面已经移植好了 ncurses,那么 这里就不需要再次移植了,只需要在编译 minicom 的时候指定 ncurses 库和头文件目录 即可。 首先在 ubuntu 中 创 建 一 个 目 录 来 存 放原创 2021-08-09 19:12:23 · 882 阅读 · 0 评论 -
Linux RS232/485/GPS 驱动实验(3)-设备树修改
1、UART3 IO 节点创建 UART3 用到了 UART3_TXD 和 UART3_RXD 这两个 IO,因此要先在 iomuxc 中创建 UART3 对应的 pinctrl 子节点,在 iomuxc 中添加如下内容: 1 pinctrl_uart3: uart3grp { 2 fsl,pins = < 3 MX6UL_PAD_UART3_TX_DATA__UART3_DCE_TX 0X1b0b14 MX6UL_PAD_UART3_RX_DATA__UART3_原创 2021-08-07 21:12:19 · 1076 阅读 · 0 评论 -
Linux RS232/485/GPS 驱动实验(2)-UART 驱动分析
1、UART 的 platform 驱动框架 打开 imx6ull.dtsi 文件,找到 UART3 对应的子节点,子节点内容如下所示:1 uart3: serial@021ec000 { 2 compatible = "fsl,imx6ul-uart", 3 "fsl,imx6q-uart", "fsl,imx21-uart"; 4 reg = <0x021ec000 0x4000>;5 interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_原创 2021-08-07 20:46:45 · 515 阅读 · 0 评论 -
Linux RS232/485/GPS 驱动实验(1)
Linux 下 UART 驱动框架 1、uart_driver 注册与注销 uart_driver需要驱动编写人员实现,并使用uart_register_driver注册到内核,卸载驱动的时候,使用uart_unregister_driver卸载。同 I2C、SPI 一样,Linux 也提供了串口驱动框架,我们只需要按照相应的串口框架编写驱动程序即可。串口驱动没有什么主机端和设备端之分,就只有一个串口驱动,而且这个驱动也已经由NXP 官方已经编写好了,我们真正要做的就是在设备树中添加所要使原创 2021-08-07 19:58:38 · 413 阅读 · 0 评论 -
Linux I2C 驱动实验(3)-运行测试
1、编译驱动程序 编写 Makefile 文件,本章实验的 Makefile 文件和第四十章实验基本一样,只是将 obj-m 变 量的值改为“ap3216c.o”,Makefile 内容如下所示:KERNELDIR := /home/ysy/linux/IMX6ULL/linux/linux-imx-rel_imx_4.1.15_2.1.0_gaCURRENT_PATH := $(shell pwd)obj-m := ap3216c.obuild : kernel_modules原创 2021-07-29 14:35:41 · 277 阅读 · 0 评论 -
Linux I2C 驱动实验(2)
1 I2C 设备和驱动匹配过程I2C 设备和驱动的匹配过程是由 I2C 核心来完成的,drivers/i2c/i2c-core.c 就是 I2C 的核心 部分,I2C 核心提供了一些与具体硬件无关的 API 函数,比如前面讲过的: 1、i2c_adapter 注册/注销函数 int i2c_add_adapter(struct i2c_adapter *adapter) int i2c_add_numbered_adapter(struct i2c_adapter *adap) ..原创 2021-07-29 14:26:18 · 888 阅读 · 1 评论 -
Linux I2C 驱动实验
input: 20cc000.snvs:snvs-powerkey as /devices/platform/soc/2000000.aips-bus/20cc000.snvs/20cc000.snvs:snvs-powerkey/input/input0input: 20cc000.snvs:snvs-powerkey as /devices/platform/soc/2000000.aips-bus/20cc000.snvs/20cc000.snvs:snvs-powerkey/input/i原创 2021-07-26 21:22:32 · 415 阅读 · 0 评论 -
Linux驱动-中断实验
**驱动程序:**#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/uaccess.h>#include <linux/io.h>#include <linux/cdev.h>#include <linux/device.h>原创 2021-07-19 14:05:07 · 201 阅读 · 0 评论 -
Linux 驱动-阻塞和非阻塞 IO 实验
**驱动程序:**#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/uaccess.h>#include <linux/io.h>#include <linux/cdev.h>#include <linux/device.h>原创 2021-07-19 13:51:24 · 103 阅读 · 0 评论 -
linux驱动-异步通知实验
驱动程序:#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/uaccess.h>#include <linux/io.h>#include <linux/cdev.h>#include <linux/device.h>#incl原创 2021-07-19 13:44:01 · 84 阅读 · 0 评论 -
linux驱动-非阻塞IO实验
Unable to handle kernel NULL pointer dereference at virtual address 00000004是以为我定义wait_queue_head_t r_wait; /等待队列头/,而没有初始化定义好等待队列头以后需要初始化,使用 init_waitqueue_head 函数初始化等待队列头,函数原型如下:void init_waitqueue_head(wait_queue_head_t *q)参数 q 就是要初始化的等待队列头。也可以使用原创 2021-07-19 13:27:51 · 232 阅读 · 0 评论 -
linux中断
一、Linux内 核中断处理简介1.1、裸机中断1.2 linux中断1、先知道你要使用的中断对应的中断号。2、先申请request_irq,此函数会激活中断。3、如果不用中断了,那就释放掉,使用free_irq。4、中断处理函数irqreturn_t (*irq_handler_t) (int, void *)。5、使能和禁止中断,1.3 上半部和下半部中断一定要处理的越快越好,1、软中断static struct softirq_action softirq_vec[NR_SOF原创 2021-07-15 12:39:22 · 82 阅读 · 0 评论 -
linux驱动报错
原因是设备树结点找不到,因为驱动函数里面的参数写错了是“/gpioled”,少了和"/",所以结点找不到,我因为是设备树配置错了,找半天才发现这个问题,所以写驱动的时候还要仔细呀!!!!...原创 2021-07-08 16:28:38 · 207 阅读 · 0 评论 -
linux设备树
一、什么是设备树1、uboot启动内核用到zImage,imx6ull-alientek-emmc.dtb。bootz 80800000 – 83000000.2、设备树:设备和树。3,在单片机驱动里面比如W25QXX,SPI,速度都是在.c文件里面写死。板级信息都写到.c里面,导致linux内核臃肿。因此 将板子信息做成独立的格式,文件扩展名为.dts。一个平台或者机器对应一个.dts。二、DTS、DTB和DTC的关系.dts相当于.c,就是DTS源码文件。DTC工具相当于gcc编译器,将.d原创 2021-06-10 20:08:24 · 154 阅读 · 0 评论 -
驱动编写要素
编写测试 APP 就是编写 Linux 应用,需要用到 C 库里面和文件操作有关的一些函数,比如open、read、write 和 close 这四个函数。在linux环境下常用文件接口函数:open、close、write、read、lseek。a、在linux系统中要操作一个文件,一般是先open打开一个文件,得到一个文件扫描描述符,然后对文件进行读写操作(或其他操作),最后关闭文件即可。b、对文件进行操作时,一定要先打开文件,然后再进行对文件操作(打开文件不成功的话,就操作不了),最后操作文件完原创 2021-06-06 20:53:46 · 245 阅读 · 0 评论 -
linux驱动
学习驱动开发时,创建设备类,用到函数class_create()和class_destroy()报以下错误:解决方法是把MODULE_LICENSE(“GML”);换成MODULE_LICENSE(“GPL”);。再编译就能通过。原创 2021-05-01 13:08:52 · 51 阅读 · 0 评论 -
led字符驱动步骤
一、地址映射1、裸机LED灯实验就是操作6ULL的寄存器。2,Linux驱动开发也可以操作寄存器,Linux不能直接对寄存器物理地址进行读写操作,比如寄存器A物理地址为0X01010101。裸机的时候可以直接对0X01010101这个物理地址进行操作,但是linux下不行。因为linux会使能MMU。在linux里面操作的都是虚拟地址,所以需要先得到0X01010101这个物理地址对应的虚拟地址。获得物理物理地址对应的虚拟地址使用ioremap函数。第一个参数就是物理地址其实大小,第二个参数就是要原创 2021-04-27 20:17:05 · 186 阅读 · 0 评论 -
模块驱动编译错误
编译内核的时候出现段错误,主要原因是寄存器错误,在进行地址映射会出现错误。##错误原因## 一个进程虚拟空间里的任何地址,在进程访问它之前必须要经过MMU转换,将它映射到物理内存的某个具体的存储位置上才是合法有效的,不然操作系统就会用“Segmetation Fault”对你的进程进行宣判,然后将其kill掉...原创 2021-04-27 13:40:52 · 176 阅读 · 0 评论 -
字符驱动编写错误
编译自己写的驱动时出现 warning: initialization from incompatible pointer type后来发现是自己复制了read变为write出现问题要看清差异ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);...原创 2021-04-22 20:54:16 · 167 阅读 · 0 评论