monkey_llll
这个作者很懒,什么都没留下…
展开
-
更改Linux console输出等级
最近在调试问题的时候,发现有些日志没有通过串口终端打印出来。排查发现是内核里面配置的串口日志等级较高,导致有些日志没有打印。在内核的配置文件里面,更改CONFIG_CONSOLE_LOGLEVEL_DEFAULT的值。原创 2024-11-06 14:57:32 · 9 阅读 · 0 评论 -
yocto通过环境变量控制代码的编译
编译的时候,编译器会报错。为了快速的确认自己的宏控有没有生效,可以在自己的代码认为添加一些错误,这样在编译的时候根据报错信息,就能知道宏控定义是否生效。2、将TEST_FUNC_ENABLE环境变量添加到yocto的BB_ENV_EXTRAWHITE环境变量里面。实施方案:通过编译选项去配置环境变量,然后在bb文件里面根据环境变量的信息,去定义对应的宏。说明:此步骤主要是获取TEST_FUNC_ENABLE环境变量的值,并定义对应的宏。至此,我们的代码就会根据我们传递的参数编译对应的代码。原创 2024-09-27 17:05:23 · 104 阅读 · 0 评论 -
以太网传输出现不分包
最近对手件反馈,在传输文件的时候,我们这边发包太快,导致对手件网络出现了拥塞,把他们程序给搞死了。他们抓了一下他们收到的包,发现我们发送的数据包都大于了MTU设置的值。然后再次验证,发现Don't Fragment确实取消了,但是发包数据量还是大于了MTU。验证:我们去抓我们发送出去的包,发现确实配置了Don't Fragment。后续再进行测试,就可以看到,我们发送的包是按照MTU大小进行分片了。排查方法:为什么我们发送的数据包会大于MTU的值。注:查看属性是小写的k。可能性二:硬件tso属性导致的。原创 2024-09-14 18:11:31 · 122 阅读 · 0 评论 -
设备树API
记录遇到的设备树API原创 2024-09-11 21:21:50 · 48 阅读 · 0 评论 -
uboot、kernel通过KCFLAGS控制代码编译
很多时候,为了便于代码管理,我们希望在编译的时候,根据传入的参数去编译我们指定的代码。这样可以大大的减少我们的工作量。原创 2024-08-19 15:35:40 · 94 阅读 · 0 评论 -
dm-verity给内核传递的参数解析
这篇博客完整解析了dm-verity在使用过程中bootloader(uboot)向Linux kernel应该传递哪些参数以及这些参数分别是什么意思。原创 2024-07-12 18:10:21 · 138 阅读 · 0 评论 -
dm-verity hashtree的结构
介绍了dm-verity的hashtree的结构图。很形象的表明了hashtree的构成。根据这个结构图,可以自己编码完成hashtree镜像的生成原创 2024-07-12 18:02:34 · 119 阅读 · 0 评论 -
生成dm-verity的hashtree
这个博客主要是生成dm-verity对应的hashtree和root hash。里面是纯C代码,只依赖libcrypto.so这个库。非常易于移植。原创 2024-07-12 17:57:58 · 89 阅读 · 0 评论 -
Linux 内核设备树 ranges属性
注:上面的设备树代码是随便找的。#address-cells:本节点和父节点的值。注:具体有多少行,根据实际情况来决定。#size-cells:本节点的值。原创 2024-04-22 18:03:37 · 553 阅读 · 0 评论 -
kmallc、kzalloc、vmalloc使用
vmalloc() 函数则会在虚拟内存空间给出一块连续的内存区,但这片连续的虚拟内存在物理内存中并不一定连续。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。kmalloc() 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移。kzalloc是kmalloc的变种。GFP_ATOMIC:分配内存的过程是一个原子过程,分配内存的过程不会被(高优先级进程或中断)打断;原创 2024-03-14 16:54:12 · 191 阅读 · 0 评论 -
list_head的使用方法
定义一个list_head类型的head将我们自定义的结构体里面的所有的list_head串起来。后面我们需要的时候,就遍历head变量的所有list_head节点,找到的每一个节点,都使用container_of来找到该节点结构体的首地址,来判断是不是我们找寻的目标。最近用到了list_head,在这里记录一下。如果要搞清楚list_head的使用方法,需要了解container_of的原理。上面代码实现了list_head的增删改查的操作。里面有个我自己定义的删除函数,请忽略。原创 2024-02-28 18:19:05 · 186 阅读 · 0 评论 -
container_of宏的简介及使用
container_of宏之前看了一下内核里面的使用方法,然后就直接依葫芦画瓢用了。没有深究其实现原理。最近使用list_head的时候,发现也用到了container_of。所以就详细看看container_of的实现原理。那么问题又来了,我们根据结果或者结构体的定义,可以知道这个8是怎么来的。但是我们只知道t.c的地址,和t的类型,怎么来得到这个8呢?结合上面的代码,问个问题,如果我们知道t.c的地址,怎么计算t的地址。计算方式如下:t=t.c-8。原创 2024-02-28 17:49:29 · 98 阅读 · 0 评论 -
netlink驱动实现单播和广播
netlink的单播和广播demo原创 2023-07-07 17:57:05 · 345 阅读 · 0 评论 -
Linux /proc/version 文件解析
Linux /proc/version 文件解析原创 2023-03-29 21:31:02 · 1284 阅读 · 0 评论 -
USB-HID鼠标键盘驱动
下面的代码是在tiny4412开发板上面验证通过的驱动代码。之前在imx6上面用过类似的代码,USB-HID鼠标、键盘驱动和平台相关性无关,理论上下面的代码在imx6上面也是可以正常使用的。和这个驱动有一个匹配的应用测试程序。该程序里面读取PC通过串口发送过来的坐标信息,然后转换成USB-HID鼠标数据,再上传给PC,以此来控制PC的鼠标。测试流程:1、移植驱动程序到内核里面2、移植应用测试程序到开发板里面3、连接硬件到PC上,这个时候PC应该提示有鼠标插入4、运行应用测试程序,读.原创 2022-01-05 00:35:31 · 4011 阅读 · 0 评论 -
i.MX7D支持百兆网络-ksz8041网卡
i.MX7这个芯片,目前就没有看见有几个厂家在用这个片子。因此大家对它感兴趣的人基本是少之又少。但是我们公司就用了这个芯片。我们公司用也就用了,但是还把它原有的千兆网络改成了百兆网络。所以又是得自己从头开始搞一遍。在这个平台上面调试ksz8041,比在i.MX6上面调试ksz8041顺利多了。没有多久就搞出来了。环境介绍:板卡:i.MX7Dlinux版本:4.9.88网卡芯片:KSZ8041下面直接上代码:设备树对应的文件 arch/arm/boot/dts/imx7d-sd原创 2021-05-15 22:22:26 · 573 阅读 · 4 评论 -
i.MX6支持百兆网络-ksz8041网卡
i.MX6的开发板,默认使用的是千兆网络。然后看了其他厂家的开发板,发现基本都是使用的千兆网络。公司最近有个项目需要使用百兆网络,找了一圈也没有找到可以参考,没有办法,只有自己弄了。注:i.MX6的千兆网络,因为芯片自带的bug,它的带宽只能支持到400Mbit左右。这个在刚开始测试千兆的时候,可把人坑惨了。环境介绍:板卡:i.MX6Dlinux版本:3.14.52网卡芯:KSZ8041百兆网卡的配置主要就是确定好一个50MHz的参考时钟,这个参考时钟是外部输入的,然后配置一下网卡寄原创 2021-05-15 22:01:29 · 626 阅读 · 0 评论 -
i.MX6通过GPIO模拟SPI总线读写M25P16
因为项目的需要,我们通过GPIO模拟SPI总线的方式去读写M25P16这款flash芯片。本文档会先介绍M25P16这款flash相关的特性,以及怎么读写操作它。然后会贴出驱动代码,以及对应的测试程序。注:驱动代码和测试程序都是经实际测试过的。先说最后的结果:1、驱动最后实现的效果可以让应用程序类似读写文件一样去读写flash。2、读写速度:1MByte/SM25P16介绍:1、容量-2MByte 共32个扇区,每个扇区256页,每页256Byte 32*256*25..原创 2021-05-15 17:51:35 · 436 阅读 · 0 评论 -
IMX6Q uboot到内核的logo延续功能
每一次的订阅,总是给我坚持下去的动力。这章博客应该是这个专栏里面最水的一篇博客了,因此这篇博客的核心内容基本就是NXP论坛官方提供的。因此这篇博客的内容涉及的技术,可以直接去NXP论坛里面找。写这篇博客的主要目的是教大家怎么去用别人已经完成了的技术。主要是一个验证的过程,当然,中间也会涉及一些小的技术。比如:BMP图片的数据提取。首先,我把NXP官网提供的相关代码贴出来。下载链接为:……………………//已经上传CSDN,还在审核过程中。大家也可以直接去NXP论坛找。不同的内核版本对应不同原创 2021-01-05 22:50:46 · 1143 阅读 · 3 评论 -
i.MX6Q lvds和hdmi双屏同显 1080P 分辨率
效果:LVDS+HDMI 都是1080P的分辨率的屏,两者显示的内容完全一样,内容同步更新,无延迟。实现过程中没有使用Wayland、X11、X-window等插件支持。单纯的底层驱动实现。显示,一直都是一个很通用的功能,需要人机交互的产品,基本都有个屏。IMX6D 有3种屏幕显示接口: HDMI、LVDS、LCD。这三种接口基本满足了大部分产品显示接口的需求。在使用IMX6的过程中,只是简单的使用一种接口,或者同时独立的使用多种接口,这些都是比较简单的,在NXP官网提供的BSP里面就已经实原创 2020-12-25 22:30:58 · 2307 阅读 · 2 评论 -
i.MX7D GPT 定时器驱动
在上一章我们介绍了i.MX6 EPIT定时器驱动。那么这一章我们介绍一下i.MX7D GPT 定时器驱动。i.MX7D有4个GPT定时器,其中GPT1被用于系统定时。因此我们还有3个定时器可以使用。这里我们以GPT4这个定时器为例进行讲解。驱动实现分为如下几步:第一步、阅读i.MX7D的芯片手册GPT定时器对应的章节。我已经阅读过了,就不在这里再读了,没有读过的就需要去阅读一下。第二步、查看相关设备树GPT相关信息: 在 arch/arm/boot/dts/imx7s.dtsi 文..原创 2020-12-23 21:27:48 · 448 阅读 · 0 评论 -
i.MX6 EPIT定时器驱动
注:这个驱动参考了https://blog.csdn.net/wince_lover/article/details/54577898#comments这位大神的博客。该大神给出了思路,驱动框架。大家可以直接去看他这个,即可以学习一下,也节约钱。如果你想走捷径,就看我这个吧。本来这个专栏都快没有动力继续往下写了的。之前弄这个专栏的目的也只是为了给自己做个笔记,方便后面查看,结果今天竟然收到了一个订阅,然后瞬间又有动力了。这一章介绍一下i.MX6 EPIT硬件定时器。下一章我们介绍一下i...原创 2020-12-22 22:07:31 · 830 阅读 · 25 评论 -
i.MX6/i.MX7 EIM总线驱动-异步通信-DMA方式编码实现
关于i.MX6/i.MX7 EIM总线驱动,我们前面已经用了两个章节进行了介绍,第一节用来介绍时序(非常重要),第二节用来介绍通过非DMA的方式来进行DMA通信。第二节,只是EIM总线通信的一个过渡章节,对于初学者或许有一点帮助,但是在实际的使用过程中,非DMA的方式基本都不会被应用到产品上,因为使用非DMA的方式,会导致CPU的占用率异常的高,同时在传输的稳定性上也不是很可靠。我们之前使用非DMA的方式进行传输,使用示波器去测试DMA总线上面的波形,发现波形的读写时钟波动很大。那么,这一节,我们主原创 2020-12-21 21:51:32 · 1783 阅读 · 7 评论 -
i.MX6/i.MX7 EIM总线驱动-异步通信-非DMA编码实现
在上一章介绍了i.MX6/i.MX7 EIM总线异步通信的时序。在了解了该总线传输过程时的时序变化后,这一章我们将介绍如果通过编码的方式来实现。同样,我们先介绍我们一下我们的环境:Linux版本:Linux3.14.52 Linux4.9.88 这两个版本都经过实际测试,确定传输是没有问题的。硬件:i.MX6 (i.MX7也验证过,这里以i.MX6为实例进行介绍)在Linux3.xx.xx以后的版本里面,引入了设备树的机制。该机制替代了以前驱动里面device的角色。我们这里的编码...原创 2020-12-11 22:04:28 · 886 阅读 · 8 评论 -
i.MX6/i.MX7 EIM总线驱动-异步通信
i.MX6/i.MX7平台,支持EIM(External Interface Module)总线扩展。在实际项目中,大部分使用该总线和FPGA通信比较多,我们这里以与FPGA为例实现该驱动。i.MX6是使用较多的一个,我们一i.MX6为例进行分析。我手上的芯片型号是i.MX6D。我们实现的功能是:使用EIM的16根数据线与FPGA进行数据传输,EIM_OE/EIM_RW用来控制读写,EIM_CS用来选中。最后效果:传输速度可以达到18MByte/S,这个传输速度应该是EIM异步通信比较大的一个传原创 2020-12-10 23:09:48 · 1337 阅读 · 7 评论