Linux驱动开发【IMX6ULL】
文章平均质量分 73
记录Linux驱动开发学习过程
晨少爱学习
不定时分享个人所学,以及自学过程中的总结笔记,欢迎志同道合的朋友们一起讨论学习(csdbili)
展开
-
设置Linux开发板开机自启动QT程序的报错解决办法
PS:下面这个脚本是最终的脚本,文章所展示的是我解决问题的调试过程,最后发现只需要加一句 s。是自己编写的自启动脚本,内容例如下:(也可以将这些直接写到。在移植QT的时候我们设置了一些链接库的路径,终端里运行。环境变量中,添加内容后的启动脚本如下所示。环境变量中,添加内容后的启动脚本如下所示。将这些路径复制下来,修改启动脚本如下所示。在系统中寻找 fonts 文件。将这些路径复制下来,添加到。将这些路径复制下来,添加到。然后重启开发板,出现新报错。然后重启开发板,出现新报错。终端运行如下命令,获取。原创 2024-04-23 13:37:33 · 1114 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】24.关于mmap为什么能直接操作LCD显示
所以当我们操作mmap返回的指针时,实际上内核中虚拟内存的内容也会被修改。实际上我们在内核中使用malloc申请一个内存空间后,在用户态使用。Framebuffer实际上是一块保存了一帧图像数据的内存,那为什么可以直接操作到文件呢,其中的映射关系怎么实现的?记录今天面试过程中遇到的一个提问,当时没有答上来。返回一个指针,就可以通过这个指针来操作文件。MMU(内存管理单元)原创 2023-09-07 19:21:58 · 503 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】23.驱动模块开发之Makefile解析
编写完驱动代码后要编写Makefile,并使用make进行编译,这里举一个最经典的驱动模块的Makefile写法。执行 make 之后,会执行Makefile下的 all:后面的命令。原创 2023-08-24 10:33:44 · 603 阅读 · 0 评论 -
uboot通过NFS挂载根文件系统卡死解决办法(VFS: Unable to mount root fs via NFs, trying floppy)
uboot通过NFS挂载根文件系统时,加载完内核后,卡死在这里。setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.200:/home/me/imx6ull_nfs ip=192.168.1.100:192.168.1.200:192.168.1.1:255.255.255.0::eth0 off'原创 2023-08-14 13:02:08 · 1079 阅读 · 1 评论 -
Linux系统中的自旋锁(两幅图清晰说明)
多CPU下的自旋锁采取的是忙等待(原地打转)机制,虽然忙等待的线程占用了它所在的cpu,但其他线程仍可放到其他CPU上执行。所以自旋锁上锁和解锁之间的临界区代码要尽量的短,最好不要超过5行,否则采取忙等待的线程会浪费过多的cpu资源。单cpu下的自旋锁采用的是睡眠机制,因为忙等待会使仅有可怜的一个cpu被其占用,而拥有自旋锁的线程得不到执行无法释放锁,会引起死锁。原创 2023-08-10 00:07:41 · 361 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)
IMX6ULL一共有两个ADC,每个ADC都有八个通道,但他们共用一个ADC控制器原创 2023-08-02 11:02:04 · 2437 阅读 · 2 评论 -
【IMX6ULL驱动开发学习】21.Linux驱动之PWM子系统(以SG90舵机为例)
我们要在设备树(.dts)文件中引用和使能该节点,同时指定好pwm映射到的GPIO引脚(即pinctrl子系统,我这里映射到了GPIO1_9上)原创 2023-08-01 15:08:10 · 2295 阅读 · 2 评论 -
IMX6 GPIO设置为输出时gpiod_get_value结果一直为1
IMX6 GPIO设置为输出时gpiod_get_value结果一直为1。解决方法:配置SION位,使IO口在输出状态下可以正确获取状态。转载 2023-07-27 09:41:16 · 367 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】20. input子系统(按键实现ls命令)
自定义了三个按键 按键1:l 键 按键2:s键 按键3:Enter键原创 2023-07-12 22:38:39 · 637 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】19.mmap内存映射
mmap将一个文件或者其它对象映射进内存,使得应用层可以直接读取到驱动层的数据,无需通过copy_to_user函数可以用于像LCD这样的外设, 需要读写大量数据的原创 2023-07-12 17:38:47 · 814 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】18.中断下半部(tasklet、工作队列、中断线程化)
下图表述了Linux内核的中断处理机制,为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点, Linux将中断处理程序分解为两个半部:(Top Half) 和用于完成尽量少的的功能, 它往往只是简单地读取寄存器中的中断状态, 并在清除中断标志后就进行“登记中断”的工作。意味着中去。这样, 顶半部执行的速度就会很快, 从而可以服务更多的中断请求。几乎做了中断处理程序所有的事情, 而且, 这也是底半部和顶半部的最大不同, 因为顶半部往往被设计成不可中断。原创 2023-07-12 15:43:35 · 720 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】17.内核定时器(按键消抖)
内核定时器初始化 setup_timer(struct timer_list *timer, void (*function)(unsigned long), unsigned long data);原创 2023-07-12 10:42:17 · 692 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】16.睡眠机制_poll机制_fasync异步通知(按键控制LED)
学完了休眠唤醒机制、poll机制、异步通知、定时器、tasklet、工作队列、mmap、input子系统后,该沉淀沉淀了原创 2023-07-11 21:50:29 · 635 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)
sleep函数是可以被中断的,也就是说当进程在睡眠的过程中,如果被中断,那么当中断结束回来再执行该进程的时候,该进程会从sleep函数的下一条语句执行。学习异步通知的时候,自己实现一个功能:按键控制蜂鸣器,同时LED灯在闪烁。打断,所以sleep没有执行完就重新进入下一次循环了。说明kill_fasync这个函数中有中断发生。结果:LED好像也同时被按键控制了。修改代码后解决该问题。原创 2023-07-04 22:57:08 · 967 阅读 · 2 评论 -
【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)
(根据GPIO子系统标号得到软件中断号)针对正点原子IMX6ULL阿尔法开发板。(根据软件中断号发起请求中断)(获取GPIO子系统标号)(获得GPIO的数量)原创 2023-06-30 15:23:00 · 1178 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】13.Pinctrl子系统与GPIO子系统
驱动开发中,我们可以使用寄存器对外设进行操作,但是那样太麻烦了所以引入了 Pinctrl子系统与GPIO子系统。Pinctrl子系统:可以用它来复用引脚、配置引脚的电气属性等等。GPIO子系统:控制引脚,设置输入输出。原创 2023-06-27 21:23:37 · 550 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】12.Linux驱动之设备树
(1)platform_driver 结构体添加 of_match_table 属性,添加 of_device_id 结构体,匹配设备树。(2)在 probe 函数中提取设备树中的引脚,提取设备树节点中的属性(of_property_read_u32等函数)后缀为 dtb 的是二进制的设备树文件,我们需要修改它,那么真正要操作的是其对应的 dts 文件,即。其他地方都不用修改,下次想添加外设时,直接修改设备树,然后修改 of_device_id 结构体即可。即可替换成新的设备树了,如何查看是否替换成功呢。原创 2023-06-27 00:50:14 · 1622 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想(学习设备树过渡部分)
经过分层之后,我们需要添加一个新的外设时,只需要做两个步骤:(1)在 xxx_board.c 中添加硬件引脚资源(2)在 xxx_chip_gpio.c 中添加具体的GPIO初始化、控制等操作驱动层的 xxx_drv.c 根本不需要怎么修改前几天自己总结了个图,也是帮助自己梳理思路看上去有些乱,不过只要学过韦东山老师视频的。原创 2023-06-25 17:36:58 · 557 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】10.设置uboot,通过tftp服务器加载内核与设备树,通过nfs挂载根文件系统
这里设置console为ttymxc0,因为linux启动以后I.MX6ULL 的串口1在linux下的设备文件就是/dev/ttymxc0,115200是串口的波特率。用来设置根文件系统的位置,root=/dev/mmcblk1p2 用于指明根文件系统存放在mmcblk1 设备的分区 2 中。主要设置 TFTP_DIRECTORY=“/home/me/tftpboot”,设置tftp共享目录。/Linux内核文件/arch/arm/boot//Linux内核文件/arch/arm/boot/dts。原创 2023-06-24 21:01:49 · 2562 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】09.Linux驱动之GPIO中断(附SR501人体红外感应驱动代码)
转到底,这样反应会灵敏些;跳线帽接到H上,即可重复模式,有人一直高电平,无人一直低电平。5V供电,输出引脚我接到了正点原子IMX6ULL阿尔法开发板的GPIO1_IO2上。(中断编程不需要设置GPIO输入输出,当然申请GPIO,设置输入也没问题)由于在中断函数中输出信息了,所以检测到有人无人时,中断会自动打印出信息。参数:int irq, void *dev_id。,因为既然已经进入中断函数了,那就是已经执行了。类型(见下图),一般选择。(上升沿、下降沿等)主要注意参数和返回值。再次查看中断发生次数。原创 2023-06-15 14:41:47 · 3078 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED
查看原理图,发现led接的引脚是 GPIO1_IO3,对应 /sys/kernel/debug/gpio 中的。在之前的hello驱动程序基础上修改,使用上面的GPIO子系统函数,添加一些逻辑性的代码即可。(可是实际操作中设置为4才能点亮LED,这里不知道是什么道理,懂得朋友麻烦评论区指点一下)记住这里传入的第二个参数 “user_led”,后面验证的时候会看到。1.1 确定 led 的GPIO标号,查看内核中的gpiochip。与之前的hello应用程序区别不大,直接贴代码。1.5 设置GPIO方向。原创 2023-06-13 22:35:25 · 1899 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】07.cdev注册驱动设备_设置次设备号范围
如果我使用 mknod 创建一个 /dev/abc 设备,主设备号也是240,次设备号 设置为1,linux内核提供的主设备号是有限的,如果设备很多的情况下主设备号就可能不够用了。因为 register_chrdev 函数使得分配的主设备号下的所有次设备号。分配设备号的方式比较简单直接,但是会导致设备占用所有的次设备号。注册驱动设备时,采用cdev函数注册,分配两个次设备号0、1。比如我的hello驱动主设备号是240,次设备号是0,在之前的hello驱动中,注册驱动设备的方式如下。原创 2023-06-12 13:22:01 · 667 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】06.APP与驱动程序传输数据+自动创建设备节点(hello驱动)
APP与驱动程序传输数据原理:1. APP调用**open函数**打开设备,使用**系统IO函数write**写入数据到设备; 2. 系统调用驱动程序的**写操作函数(通过file_operations结构体指定)**,将APP中传入的参数传入该**写操作函数**; 3. 驱动程序的写操作函数调用**copy_from_user**函数**从用户程序中拷贝数据**到驱动程序中; 4. APP调用**系统IO函数read**,读取驱动数据; 5. 系统调用驱动程序的**读操作函数(通过file_operat原创 2023-06-11 16:22:18 · 1196 阅读 · 1 评论 -
【IMX6ULL驱动开发学习】05.IMX6ULL驱动开发_编写第一个hello驱动【熬夜肝】
1、获取内核文件 获取Linux内核文件,可以从Linux Kernel官网下载,我这里为了跟开发板中的系统一致,避免出现其他问题,所以使用的韦东山老师提供的Linux-4.9.88内核文件,2、编译内核文件 为什么要编译内核文件,因为驱动代码的编译要基于原创 2023-06-09 00:01:34 · 2436 阅读 · 1 评论 -
【IMX6ULL驱动开发学习】04.IMX6ULL开发板与虚拟机互传文件(scp、SFTP、NFS)
这样就可以在开发板的 /mnt 目录下访问到虚拟机的 /home/me/Linux_ARM/IMX6ULL/hello_driver 目录下的文件了,无论在哪一边增改文件,另一边都能实时同步。表示 /home/me/Linux_ARM/IMX6ULL 目录下的文件都可以被挂载共享**(这一步必须做)**当然也可以将当前设备下的文件拷贝到远端,命令后面两个路径,前后位置调换一下即可。我们要做的是将虚拟机下的目录挂载到IMX6ULL开发板的/mnt目录下。这里便可以连接上我们的开发板,看到开发板下的文件了。原创 2023-06-08 14:45:44 · 1545 阅读 · 0 评论 -
【IMX6ULL驱动开发学习】03.设置IMX6ULL开发板与虚拟机在同一网段(设置开发板静态IP)
开发板ping虚拟机(如果ping不通,拔掉网线再插上,重启板子,重复几次还ping不通,检查Ubuntu的防火墙是否没有关闭),右键 “ 断开连接” ,再看看自己当前的网络连接,看看哪个ens设备没了,那那个ens设备就是你的桥接网卡了。按照上图步骤手动设置IP,根据window下有线网卡的网段来设置,网段是192.168.1,最后一个数从。如果只显示了一个lo设备,或者只有一个ens设备和lo设备,则说明桥接的网卡没有启动起来。好的,再右键小电脑图标,连接好桥接网卡,点击。原创 2023-06-08 14:33:50 · 2514 阅读 · 7 评论 -
【IMX6ULL驱动开发学习】02.IMX6ULL烧写Linux系统
由于我买的是正点原子的IMX6ULL阿尔法开发板,但是我是看韦东山老师视频学习的驱动所以这里我烧录的方法是按照韦东山老师的课程来的这里给出烧写Linux系统用到的工具提取码:af6w下载解压后,可以看到烧写工具。原创 2023-06-08 11:50:39 · 2533 阅读 · 10 评论 -
【IMX6ULL驱动开发学习】01.安装交叉编译环境【附下载地址】
将交叉编译工具链文件夹拷贝到一个目录下保存好,我这里拷贝到 /usr/local/arm文件夹下。但是此时我们在其他目录下输入 arm- ,按 tab键并不会补全,那是因为没有添加环境。也就是将你的交叉编译工具链的bin文件路径添加到 $PATH变量中。可以选择最新的(我也忘记我用的哪个版本了,都可以用问题不大)输入命令查看工具链版本,至此交叉工具编译环境安装完成!解压后得到的文件夹便是我们要使用的交叉编译工具链了。其实我们常用的工具链都在工具链文件夹的bin目录下。拷贝工具链到arm文件夹下。原创 2023-06-08 00:18:31 · 1079 阅读 · 0 评论