![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
嵌入式
文章平均质量分 74
fanged
野生程序员。。。这里主要是一些学习笔记和心得。。。
展开
-
树莓派3B驱动ST7735(Python)
要在树莓派 3B 上驱动 ST7735 LCD 屏幕并显示 "Hello World",你可以使用 Linux 内核中的 SPI 驱动程序以及帧缓冲驱动程序来控制显示屏。查了一下午,最后发现GPT搞成需要触屏的驱动了,pitft28-resistive一般是用在需要触屏的地方,然后dtoverlay的用法也不是很熟悉,看起来应该是设备树的匹配,这块后面有时间再研究研究。通过这些步骤,你可以在树莓派 3B 上成功驱动 ST7735 LCD 屏幕,并在屏幕上显示 "Hello World"。原创 2024-08-30 01:33:06 · 304 阅读 · 0 评论 -
示波器的使用
算是很基础的一个东西,但是该掌握还是要认真掌握才行。原创 2024-08-14 11:17:34 · 91 阅读 · 0 评论 -
总线学习5--I2S
音频信号在原始状态下是模拟信号,表现为随时间连续变化的电压波形。为了将这些模拟信号存储或处理为数字形式,需要将其转换为一系列离散的数字值。这一过程称为。原创 2024-08-06 00:34:57 · 121 阅读 · 0 评论 -
MQTT协议
第一部分是固定的一个字节,从高位到低位分别是消息类型(占 4bit)、重传标识(占 1 bit)、Qos 标识(占 2bit)、保留位 (占1bit);的消息发布/订阅传输协议。从抓包的情况来看,装的mosquitto-clients是2个字节的固定报头。当然,如果是扩充到3个字节,那消息长度肯定是够用的。因为我之前一直做路由器,一直是听说MQTT协议,年初接触了一下Openwrt产品,又是这个协议,所以抽时间看一下。5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;原创 2024-08-05 02:19:34 · 104 阅读 · 0 评论 -
总线学习6--I2C(EEPROM)
鉴于I2C的项目还是很多,所以又多做了一个试验。原创 2024-08-11 18:11:42 · 646 阅读 · 0 评论 -
总线学习4--UART
总结一下UART协议基本就是两根线(不算地线),甚至你都可以理解成一根线,只是方向相反而已。也没有时钟那些乱七八糟的,时隙直接sleep就欧了。数据一次一个byte,高就是1,低就是0。真的很简单。。在嵌入式里面,不知道有没有比它更简单的协议。。。上图的校验位据说基本上不会用的。。。原创 2024-08-04 23:04:46 · 195 阅读 · 0 评论 -
嵌入式外挂MCU
之前看了有些方案说外挂某个芯片,或者说外挂某个MCU,当时觉得很牛X,是很想写一点来学习学习。最近真的学了嵌入式底层,觉得这个话题又没啥好写的。从软件的角度来说,外挂硬件,其实就是你用了某个三方库。。。没错,就是这么理解。只是软件上可能是用dlopen这样的软件接口去开,然后调用函数接口。但是嵌入式硬件中是使用I2C或者SPI这些总线协议去去控制。当然,如果封装一些I2C这些,也和函数接口无异了。最后是有可能设备树的某些定义或者属性要改一下。难吗?好像真不算难,没太多好写的。原创 2024-06-20 15:26:20 · 237 阅读 · 0 评论 -
显示学习5(基于树莓派Pico) -- 彩色LCD的驱动
第一个封装的都是self._writecommand(TFT.CASET),_writecommand(TFT.RASET),_writecommand(TFT.RAMWR)这几个SPI的接口。画图,画线,画圆,显示图片,颜色有时候要转换成屏要的格式,让上层更方便使用。然后逐个点处理,首先读取BMP的bgr信息,bgr = f.read(3),然后调用接口将颜色一个一个的写进去。之后就是行列和颜色的设置,这里有个特别点的。简单整理一下,大概是这么几类,画图形,比如circle,画线,文字,操作点。原创 2024-08-04 03:25:26 · 397 阅读 · 0 评论 -
总线学习3--SPI
1 接口名称不统一,相对于I2C的两根线,这个SPI显示接口名称真的很多,SCL/SCK,SDA/MOSI,A0/DC,最后才知道这几个是一个东西。整个信号大概是这样的,可以看到reset就是开始拉低再拉高,相当于重启了屏幕,之后就没事了。这样也造成了SPI需要多个片选线,如果挂10个设备,就要10个片选线,这点确实就不如I2C先进了。SPI一般是4根线,SCLK是时钟,MOSI是主设备输出,MISO是主设备输入(LCD没有输入,所以这次少了一根线),SS是片选。插上祖传逻辑分析仪,五根线一起上,抓信号。原创 2024-08-02 17:29:04 · 373 阅读 · 0 评论 -
总线学习2--使用GPIO模拟I2C
这篇也是2月份就TODO了,但是一直没写。没动工的原因也是一直忙,有限的时间内不知道如何下手,最后搞定了micropython之后,这些内容才算能推进。只是把实现I2C改成直接操作GPIO。其实核心功能就是那么几个,start,stop,write,read。主设备在 SCL 保持高电平的情况下,将 SDA 线从低电平拉高。(所有的图都是上面是SDA,下面是SCL)发命令是没问题,但是发数据还有问题。最后是仿照I2C的接口,还有两个封装。SDA拉低,SCL维持高位。原创 2024-02-26 02:50:16 · 464 阅读 · 0 评论 -
总线学习1--I2C
B就知道A要说话了,然后约定个时间1秒间隔,网上甩就是1,不甩就是0。一个包是9个bit,前面8个是发送者发出,最后会再附加一个bit是接收者发ACK,表示设备收到,将SDA拉低。假如说有两个人,都拉着一根线,这根线只能上下摆动,不能说话或者别的,只能通过这根线传递信息。对应的波形就是,可以看到,第一段就是地址0x3c,第二段固定是0x80,第三段就是命令0xAE。对应的波形是和上面一样,第一段是地址0x3c,第二段固定是0x80,最后那段就是0x20。对应图中,上面的就是SDA,下面的就是SCL。原创 2024-08-02 02:25:24 · 974 阅读 · 0 评论 -
Pinctrl学习
这一篇2月就TODO了,因为之前一直没怎么用到,所以拖到现在。因为我之前一直用树莓派或者esp32这些,感觉GPIO这些就是直接用就完了,所以Pinctrl的概念一直不明白,最近因为主动请缨申请了点屏幕,要用到这个,所以再看看。这里不写原理了,只写用法。原创 2024-02-22 22:35:50 · 95 阅读 · 0 评论 -
BusyBox
这个题目挂了很久了,一直想写一点但是又觉得没什么好写的。因为从原理来说,busybox真的不难,没有太多特别的东西,就是一个进程完成了之前很多进程干的活。这样减少了空间暂用。然后比较有趣的一点,是可以用busybox制作构建最小系统。其实后面去看看各个命令的实现,我觉得还是很有趣味的。用法其实也很简单,把以前的命令作为参数就可以了。不幸的是加载fs的时候失败了,空了再研究吧。看了下编译出来1.1M,确实挺感人的。创建初始化脚本inittab。原创 2024-03-27 14:41:07 · 251 阅读 · 0 评论 -
WatchDog
一般来说,看门狗有两种,一种软件一种硬件。原创 2024-07-19 11:09:26 · 430 阅读 · 0 评论 -
ESP32部署TensorFlow Lite
后面看了历险记(参考中)那个文章,说是现在乐鑫自己也有tflite的例子,可以曲线救国,先跑通乐鑫自己的例子,然后用python下的tensorflow生成lite模型,最后用xxd命令转换成model.cc。继续往机器学习的方向走,遇到的最大的问题就是不管是tensorflow还是tflite-micro,都无法下载。照着他写的一步步来,晚上把乐鑫自己的hello world跑通了,还是很简单。接着有时间我会慢慢来分析分析的。本来是想找一篇中文教程,不过只看到一个英文官方的,也行吧,虽然效率会慢丢丢。原创 2024-07-14 13:27:24 · 371 阅读 · 0 评论 -
逻辑分析仪小试
错误会不同,但是IO口一直报错,后面翻出来这个板子的说明,才发现硬件上来说很多口是固定的,不能随便乱用。I2C,就两跟线,所以就用了两个channel,0和2。大概看了下,一个数据包是8位,总线是7位,基本上就是0x08到0x77全部发了一次数据。有一个小遗憾,接口是mini-usb,这种线找了半天,终于发出来一根,插上去直接灯就亮了。然后就很简单,Micropython开始跑,逻辑分析仪也一起跑,很快数据就抓出来了。如果有响应,就会将SDA,也就是上面那条线拉低,因为没有响应,所以显示的NAK。原创 2024-07-11 01:58:25 · 129 阅读 · 0 评论 -
USB抓包(1)
再说说Txn,查了下这个其实是transactions的缩写,也就是事务,一个事务包含一个或者多个数据包Package。ADDR是04,ENDP是00,DATA就是Record的部分。分成三部分,一个是SETUP Txn,一个是IN Txn,还有一个STATUS Txn。不过感觉看外面的就好,里面的以后再学习吧,A1 83 00 0A 00 02 02 00,然后对应的就是上面解析好的内容,ProcessingUnitID那些。按照USB协议,PID是标注这个表的用途,比如令牌,数据,握手,特殊。原创 2024-07-12 20:25:06 · 411 阅读 · 0 评论 -
显示学习4(基于树莓派Pico) -- 游戏
Framebuffer 的 blit 方法是用于将一个区域的图像数据从一个帧缓冲区复制到另一个帧缓冲区的方法。在图形编程中,blit 是 "block transfer"(块传输)的简称,通常用于在内存中进行图像数据的复制或传输操作。可以看出,常规游戏的实现思路,就是基于2D图形的,以帧为单位,所有的逻辑操作都是基于2D的坐标体系。显示方面封装后就直接看做一块内存,逻辑处理完之后控制内存中数据的变化,最后把改动提交到显示器。进入这一帧时,首先根据按键来更新小鸟的位置,然后判断小鸟是否飞出去了。原创 2024-04-07 15:35:25 · 878 阅读 · 0 评论 -
USB UVC 3-- uvc gadget(更新中)
USB分为USB Host和USB Device两种,PC一般是USB Host,手机等终端数码设备一般是USB Device。OTG是指设备既可以作为USB Device,又可以作为USB Host。在Linux中,USB Device设备称为Gadget。这个代码是应用层的,内核将来有时间再写一篇吧。比对着一起看吧,兼听则明啊。原创 2024-05-02 01:55:51 · 470 阅读 · 0 评论 -
USB UVC 2-- libuvc
这个部分的内容就比较多,首先还是libusb_open,然后uvc_get_device_info,获取设备的具体能力,uvc_claim_if,这里申明UVC的接口。然后就是一套,libusb_get_device_descriptor,libusb_fill_interrupt_transfer,libusb_submit_transfer(是 libusb 库中的一个函数,用于将 USB 传输请求提交给 USB 设备。主要就是调用了libusb_init,应该是对usb的初始化。原创 2024-04-26 01:55:21 · 495 阅读 · 0 评论 -
USB UVC 1-- 基础
USB UVC,顾名思义,首先还是USB,整个UVC还是基于USB框架的,要真正掌握这个,还是要掌握USB的协议。然后是UVC,全称是USB Video Class,用于支持视频设备(例如网络摄像头、摄像机、扫描仪等)与计算机之间的通信和交互。首先摄像头要支持USB协议,其次要支持UVC协议,要提供符合UVC协议的设备描述符,然后是遵循UVC定义好的控制命令,多媒体格式,还有传输方式。:Realtek 是一家知名的芯片制造商,在其 RTS 系列中也有支持 UVC 的摄像头芯片。Brightness(背光)原创 2024-02-17 02:05:40 · 549 阅读 · 1 评论 -
高通平台初步
涉及到的部件主要有HLOS,MPSS(medem),aDSP&cDSP,XBL(Boot build),AOP,TZ,WLAN,BTFM,video,WiGig,VENUS,SLPI,CPE,Secure processor。前面都是开源,从TZ开始后面的都是给bin。首先是安装环境,一些常规的,主要是Ubuntu,JDK,repo,ARM交叉编译器,Python,Perl,Samba(可选)。上面的图有点小怪,主要是Libraies,Framework,App,这部分感觉应该是Google的。原创 2024-03-20 14:42:03 · 618 阅读 · 0 评论 -
显示学习2(基于树莓派Pico) -- Framebuffer
我的理解显示屏其实还是一堆LED点的组合,在内存中有映射到显示屏的显示数据,记录了每个点的详细信息,比如色彩,亮度等等的信息,这部分信息先在内存中进行预处理,处理完成后,再将这段内存送到显示器逐个点进行显示。图形的格式看起来也不少,MONO_VLSB,MONO_HLSB,MONO_HMSB,RGB565,GS2_HMSB,GS4_HMSB,GS8,每一种都要能基本了解吧。从python的接口来看,FB还提供了一些简易接口,line画线,fill_rect画矩形,text写文字。两个的功能好像有点重叠。原创 2024-02-22 22:33:53 · 175 阅读 · 0 评论 -
设备树学习
这里就描述这个设备的硬件信息,其中compatible 就是这个设备的硬件名称,用来在驱动中做匹配的。后面linux内核就把这些做成公共库抽象出来,后面设备只需要传入“我是什么设备”,那么linux就可以从内核中公共库找到需要的驱动,避免了很多质量不一的冗余代码,而且也方便了管理。基本流程是编译前编写DTS(有一个DTSi,可以视为厂商的DTS头文件,可以提取一些共性数据),之后会通过DTC编译成DTB,通过Bootloader传给kernel。在设备树中,涉及到的文件主要是DTS,DTSI,还有DTB。原创 2024-02-24 16:27:47 · 222 阅读 · 0 评论 -
BSP开发的内容
总之,BSP 是为特定硬件平台定制的软件支持包,旨在简化嵌入式软件开发过程,并为开发人员提供必要的软件基础设施和工具。:为特定硬件组件(如处理器、外设、传感器等)提供底层软件接口,允许操作系统或应用程序与硬件进行通信和控制。:可能包括操作系统内核和相应的 BSP 驱动程序,用于管理硬件资源、调度任务、提供文件系统支持等。:包括硬件规格、软件开发手册、API 文档、示例代码等,帮助开发人员理解和使用 BSP。:提供额外的软件功能和服务,例如图形界面、网络协议栈、文件系统、USB 支持等。原创 2024-03-27 01:43:26 · 466 阅读 · 0 评论 -
C的位操作
/1 4,相当于把前4个bit放到后4个bit。//此时是100,倒数第三位打开。通过上面的分析,再看mac的操作,其实就很简单了。最简单总结一下,&是清数据,|是设置数据。原创 2024-02-10 01:31:04 · 139 阅读 · 1 评论 -
make menuconfig
选项的输入是 Kconfig和config.in(2.4内核),选择完成后保存到.config文件,makefile的时候调用.config文件。从log可以看出,调用script/kconfig下面的代码,生成了mconf工具,该工具调用Kconfig生成图形界面。通过kconfig,在include下生成generated,里面包含autoconf.h,就包含了之前所有的宏定义。底层wattrset,waddch这些接口调用的是Curses Library这个库,应该是有点年纪了。原创 2024-02-03 17:40:21 · 321 阅读 · 1 评论 -
chmod小结
首先还是要明白分组的概念:u是文件所有者,也就是自己。g是所属组,也就是自己那个组。我一般用的最多的就是chmod 777 file,也就最简单的一招。参数方面,有用的就是-R,递归修改所有文件夹下所有内容。chmod -R 777 file也行,但是略显粗糙。使用数字模式要相对麻烦一点,因为必须设置其他两个组。权限分三种,分别是读r写w执行x,分别是4,2,1。chmod其实有两个方式,符号模式和数字方式。最后,在嵌入式开发领域,最常用且精准的命令就是。符号模式更精准,数字模式简单,比如777。原创 2024-02-02 00:29:27 · 381 阅读 · 0 评论 -
嵌入式Image小总结
在zimage的基础上,增加了一个头。有比如校验信息,内核入口,参数等。主要起到简化配置的作用。在每个平台上,可能会定制不同的信息。就是linux内核编译生成文件,virtual memory linux。这居然打包成一个exe,还是elf格式的。之前遇到过,过年期间整理一下。主要涉及到的内容就是VMlinux,uimage,zimage。对VMlinux打包的产物,看介绍是使用的gzip。运行时,会把image解压到内存中。看了下资料,可以通过启动gdb对VMlinux,也就是linux内核进行调试。原创 2024-01-31 02:07:42 · 107 阅读 · 0 评论 -
Tee学习
整体调用的流程也差不多就那样,init,opensession,invoke,closesession,finish。想来也是,搞的太复杂,这玩意估计也就玩不下去。当然,代码简单,编译却比较麻烦,我到最后都没有编出来。这个不仅仅是个软件,而是一整套环境,还是自带操作系统(Linux和optee_os),交叉编译环境,带虚拟机的。真的等你安装完了,看看示例,却会发现很简单,使用tee的API就可以了。此外,部署是真的大麻烦,基本上要深度定制,boot流程也要大改,感觉大部分精力都要放在配置环境上。原创 2024-02-22 22:33:13 · 103 阅读 · 0 评论 -
V4L2学习(框架和上层)
上层有什么呢:GStreamer,FFmpeg,OpenCV,v4l-utils。当然,你直接调用ioctl写一个简单的也行,也不算复杂。最近才看了下V4L2,说起来V4L2实际上是一个接口标准。使用V4L2上层接口的应用,V4L2框架,以及使用V4L2下层接口的驱动。另外要值得看的是和GStreamer之间的接口处理,等到看GStreamer的时候再写写吧。上层总的来说不算复杂,10来个接口,照着写一遍就懂了,唯一就是BUF的处理可能会麻烦点。NVIDIA的这个图说的还比较简明扼要。原创 2024-03-04 01:56:31 · 429 阅读 · 0 评论 -
DRM显示学习(TODO)
待补充。原创 2024-02-22 22:34:24 · 79 阅读 · 0 评论 -
Android学习12 -- SEAndroid
SELinux(Security-Enhanced Linux),提供了内核级的安全访问,比以前ACL强很多。从上图可以看出,实际上andorid selinux就是在访问文件时,内核中有一些回调钩子,如果配置了,就会去检查。就这么简单。安全上下文是 SELinux 的核心。安全上下文我自己把它分为「进程安全上下文」和「文件安全上下文」。一个「进程安全上下文」一般对应多个「文件安全上下文」。只有两者的安全上下文对应上了,进程才能访问文件。它们的对应关系由政策中的规则决定。查询文件的上下文,ls -Z。原创 2024-03-15 02:25:49 · 224 阅读 · 0 评论 -
显示学习1(基于树莓派Pico) -- 基础
最后是用的python,开发效率最高。比如poweron,poweroff,show。对于show的理解是framebuffer中进行操作,操作完成之后调用show显示。在I2C中,主要是向地址0x3C写入命令,0x80应该是命令字,后面接命令。首先是找SSD1315的驱动文件,网上看了下说SD1306的也是通用。驱动的是0.96寸的OLED,SSD1315。使用的I2C接口驱动。暂时先写到这吧,关于framebuffer,我单独写一篇。驱动中同时有I2C和SPI写命令的差异,可以看看。原创 2024-04-07 01:41:12 · 432 阅读 · 0 评论