0%

eMMC

首先,我们要知道eMMC是什么?本质就是nano Flash+ic驱动芯片。说白了,它就是一个flash。

它与一般nano Flash的异同

相同

一般我们使用nano flash只能用于存储而不能运行代码,运行代码的flash是nor flash。我们一般都是通过协议来进行通信也就是说,我们开发nano flash其实也是对它的驱动ic来进行通信操作。

差异

与NAND Flash不同的是,eMMC通常具有较小的存储容量,通常在几十GB或几百GB的级别。eMMC可以作为内置存储器使用,并且由于其内置控制器的作用,可以实现快速的读写操作。因此,eMMC适合于移动设备、嵌入式系统和一些消费电子产品等领域的应用。而与SSD相比,SSD的存储容量可以达到数TB,更适用于需要大容量、高速存储的场景,例如用于企业服务器、工作站、高端游戏电脑等。

eMMC驱动ic引脚

CLK: 用于同步的时钟信号

Data Strobe: 此信号是从Device端输出的时钟信号,频率和CLK相同,用于同步从Device端输出的数据。

CMD:此信号用于发送Host 的command和Device的response。

DAT0-7:用于传输数据的8bit总线

根据驱动ic来选数据位模式。

通信过程

flash,一般是nor flash直接扩容,直接FSMC把flash加入可用地址中;或者驱动ic来增加空间,也就是使用spi来进行通信。

不过emmc的话,就是纯靠硬件外设去通信了。比如可以使用mcu,通过cube来配置emmc的外设寄存器,可以是1、4、8数据位模式,对应驱动ic的引脚,有的1、4、8位的并行数据线;设置为host的设备,速度模式自行选择。如下博客所示:

【经验分享】STM32使用HAL库驱动emmc存储芯片读写_stm32 emmc-CSDN博客

用途

常见的就是用于 手机内存、一些移动的嵌入式内存。不过mcu和小型的soc就别想了,都是一整块flash搞定的事情。一般开发安卓的时候才能用到这些东西,使用方法也是根据手册,或者厂商写好了块设备添加到文件系统中。

note:还有一点就是千万别把内存和存储空间搞混了,这两个不是一个东西啊,而且要知道一件事情,函数不是运行在ram中,函数是固定不动,ram中是存放变量得哦。常见得固态,机械硬盘、U盘这些都是存储空间。内存条、nor flash、ddr技术这些才是内存哦。

包管理系统

我们都知道linux有非常多的发行版,不同发行版之间的指令和功能也是不同的,而且各种有各自的软件管理,其中包管理系统就是一个非常重要的东西,与其说系统,不如说就是一个软件、一个工具。

就知道,这个是一个容器,可以装很多东西啊,所以,它就是一堆东西的集合。我们生活中有书包,有背包,有包装带等东西;自然代码开发也有这些的,比如python的包和闭包操作,上位机软件打包到对应平台;自然我们涉及到linux这种操作系统,就不是这个意思了,不过也是一堆数据的包装,也就是说,我只想要一键下载就会自动下载这个软件所需要和缺少的软件和库等。

为什么要包管理

在以前的时候,用户下载软件的时候。软件可能也会依赖其他软件组件、二进制文件的位置。它通常包括一个配置脚本或 Makefile。你必须自己编译该软件或自己处理所有的依赖关系(有些软件需要安装其他软件)。

包,通常指的是一个应用程序,它可以是一个 GUI 应用程序、命令行工具或(其他软件程序需要的)软件库。包本质上是一个存档文件,包含二进制可执行文件、配置文件,有时还包含依赖关系的信息。为了摆脱这种复杂性,Linux 发行版创建了自己的打包格式,为终端用户提供随时可用的二进制文件(预编译软件),以便安装软件,同时提供一些元数据(版本号、描述)和依赖关系。这个功能应该上世纪的debian的发行版中出现的。

怎么使用

首先就是看发行版了,有freeBSD、ubuntu、debian、CentOS等,不同的发行版它们的使用的包管理也是不一样的。

总结

设备驱动类型

学习linux驱动的时候,肯定就知道三大设备,字符、块、网络了,但是,随着学习了研究,就看到了平台设备,总线设备,其实一开始我还是有点懵逼了,后面就慢慢能够理解了。

就使用mcu的开发作为例子,不论是gpio、usb、iic、spi等外设,其实都是需要配置和编写驱动,这个就是对寄存器进行编程了,这些驱动就是linux中那些总线驱动了,写好之后,那三个设备就能调用这些总线设备实现对外操作了。因为我们编写的驱动,一个是硬件驱动驱动,一个是设备驱动。想要对设备进行驱动,就一定要有通信手段,所以就一定要一个硬件外设来作为通信操作。假设,soc本身有3个串口在kconfig中只有两个,新增了一个之后,利用这个串口来进行通信,就可能想要编写这个串口的驱动,然后根据这个串口驱动框架来编写对应设备驱动。

驱动框架

学习mcu的时候,也就是裸机开发的时候,我们总是自己去配置系统终端,自己通过cubeMx或者keil来配置引脚功能,然后初始化代码就可以把这个外设注册到ARM内核中,此时就可以重写回调和中断,这个就非常简单和随意。如果玩过车载mcu,就知道代码是matlab生成的嵌入式代码,这种代码是很规范的,想要改的地方很少,而且很少出问题,也就是说,这样的设计是可以很大程度的避免由于人带来的错误。其实使用人写也是可以的,不过这个都是简单mcu,而不是复杂的处理器,对于处理器的设计和开发就不适合一个人来操作了,所以,就必须有框架,有开发流程,有特定的位置和回调。

处理器和SOC,使用rtos确实是可以运行的,但是太浪费资源了,不合适的。所以,只能上linux和类unix系统了,自然就少不了mmu,裸机开发完全就不方便了。此时就得是通过内核来识别到有这些外设,内核去绑定这些外设,这个操作该怎么处理呢?这个就是设备树的功能,设备树编写好各个引脚的功能和外设,内核加载的过程中就会读取设备树内容,此时就会把外设加载到内核中,就可以在 /dev/中看到对应的外设了,这个实现原理就是底层soc根据linux提供的接口来进行绑定,不过一般都是厂商负责的。(如果缺失,比如少了iic,此时就要自己通过平台设备驱动框架来编写iic,这里就需要自己向内核申请正确的物理寄存器地址,来配置iic属性和回调函数,封装成一个总线驱动)

为什么会有框架

就是规范和方便开发者开发,很多外设的操作,都被内核操控了,但是终究是因为地址和设备差异,肯定是需要重新编写和指向的。系统不断封装和抽象多层,但是一定会留给开发者接口,这个接口就得负责对这些物理层面的进行修正。也就是说,我们编写的回调函数,是内核运行过程中调用的,也就是和内核对外接口,这个接口可以绑定实际物理地址,比如修改总线设备就需要用户去指向和寄存器配置。非总线和平台设备,大概率都是调用和申请资源,比如申请中断,申请iic,申请gpio等操作,因为总线设备已经写好了。所以,编程的时候向内核申请就可以使用了。有了这些框架,虽然增加了入门难度,但是一旦理解了系统运行裸机和规范,就会明白,内核干了好多复杂配置和抽象处理,但是终究是因为硬件问题,物理地址、外设地址、寄存器、属性肯定是有差异的。有了框架,就有了规范的开发流程,也极大简化了开发操作,只需要对特定的文件和函数进行修改就可以兼容不同的设备了,至于内核的操作,就是大大的简化了开发者开发流程。

常见的框架
应用层框架

这个框架就是为了去配合应用层开发,也就是说,也可以认为是三大设备开发框架,我留给应用层的ioctl的操作方法就是满足这个框架的。

  • V4L2架构,摄像头架构
  • ALSA架构,音频设备
  • SCSI架构,这个是硬盘光驱的
驱动层框架

这个是外设的控制总线

  • 总线框架,常见的IIC、SPI 、GPIO等,一般都是厂商写好的.

  • 平台框架,是一种设备驱动框架,用于处理那些没有标准总线(如 PCIe、USB 等)的嵌入式设备。

三大设备框架

调用总线来实现对外设的处理操作

  • 字符设备, 控制 声卡 、摄像头 、屏幕等设备
  • 块设备,控制 emmc 、eepore 、固态、机械等
  • 网络设备,控制 usb网卡,rj45、wifi等
框架使用

内核就得到了这些总线,也就是可以编写设备了。块设备,网络设备,字符设备,这三个设备都是很多时候都是基于总线来进行输入输出操作的。比如字符设备,我调用一个ov5640摄像头,就是一个iic来配置摄像头属性寄存器,通过一个DCMI来传输数据,也就是说这个字符设备,需要申请两个总线,一个IIC,一个是DCMI,首先创建一个平台设备,通过平台设备来进行字符设备的创建,然后编写驱动,至于IIC和DCMI,我们只需要调用它们的中断和收发函数就完事了,至于它们的总线驱动框架都是内核处理的,这个就和平台设备非常相似,也就是调用probe和remove那些回调操作。

总结

这个有点协议的味道了,大家都是这样开发和使用,其实就是极大简化了开发流程。以前可能要改很多文件,但是抽象之后,只要我编写的回调函数完成兼容,就可以让整个框架顺利进行,就是说我只需要改几个文件,这确实是极大的简化操作,但是,对于刚入门来说,就是灾难来得,都不知道要在哪里改,为什么这样改就能运行,甚至文件操作集对应参数都对不上,这一切都是因为开发框架,而我们写的驱动只是框架运行过程中调用函数,而不是对外操作和给外部使用的函数。rt-thread的文件操作集是直接给外部调用的,也就是说它是没有驱动框架,只是类似于一个结构体里面一堆函数指针罢了。

逆向

听名字高大上的, 不过也得分情况,我之前和朋友去华强北买了一个苹果的无线充电宝,发现它有猫腻的,它充电是断断续续的,也就是说它的通信协议不行的,破解的非常不理想。这种逆向就是普普通通的,把通信数据逆向出来,然后找到表示电量的数据位,进行实时修改然后再发送过去,这个逆向是非常捞的,不过华强北那边很多这种科技,不过它便宜啊,而且,它便宜啊,你说对不对呢?还有那种苹果电池也是一样的,华强北技术电池装好之后,系统会提示电池异常,这里就是协议识别失败了,不过能用也能开机,毕竟你系统要吃电的吧,总不能识别电池不对,关机吧,逆天了嗷。

至于那种网络逆向的,那些网络安全方面,黑客方面的,呜呜呜,不是我们这个方向的,未来的赛博世界第一个就是把我淘汰了捏。我只是一个废物,搞嵌入式的。

用途

这个就不是干正经事情的,通常就是为了抄袭原厂,常见就是电池,镜头,充电宝,外设,家居,从机外设等;华强北专区了属于是,不过,利润高的啊,一般逆向都是行业内的大牛,它们为了卖自己的产品,为了垄断产品,嘎嘎设计协议来防止盗版,一旦识别和握手失败就会直接开机失败或者不识别目标外设。

利好群体

有些相机,3D打印机,彩色打印机,喷漆/喷漆机器等,它们的设备卖的好便宜的,不过,这些都是耐用的东西,其实是很难卖出很多份的。所以,它们就把目标打到了消耗品和从机上面,比如镜头,油墨,打印纸盒,油漆等。

就用打印机举例,它们直接把油墨封装到一个盒子上面,盒子上面有接口,只有设备和接口对齐,然后握手识别成功之后,设备才能正常运行。所以,它们的消耗品就卖的非常非常非常非常贵,真的就是恶心人。所以,如果能够把这个逆向出来,就可以极大的节约成本,不过这个确实是灰色产业来着,咳咳咳。公司还是用正版吧,不过私人和工作室的话,嘻嘻嘻。

协议帧逆向操作流程

首先,要有心理准备,而且要考虑逆向多少东西出来,时间成本是根据要逆向的数据成指数增长的。比如上面的苹果无线充电宝,它握手可能只要不断的发送当前充电宝的电量这一个数据就好了,其他的不用修改。但是手机电池就不一样了,可能还要你返回压力,返回温度,返回电量,返回很多奇奇怪怪的校验位,少一个就会识别为异常。运气好的话,就可以继续工作,运气不好的话,就直接识别设备异常不使用关机了。

就是想办法把数据搞出来。首先,找到电源引脚,找到通信引脚,看看用的是什么通信协议,spi,iic,usb还是啥。然后,把原厂的设备拆了,把对应的引脚引出来使用逻辑分析仪进行处理和分析。接着,把数据使用自己编写的脚本导出来。拿一个mcu,进行对应通信协议代码编写,然后根据双方的握手情况进行逻辑编写和数据发送,此时数据一个都不用改,直接般原厂的,理论上是可以实现通信的。

一般都是做从机的,所以,默认状态都是接受,等待来自主机的通信请求,进行对应的回复和处理。

数据帧类型

我个人喜欢把数据帧分为:开机帧,握手帧,开始帧,属性帧,空闲帧,工作帧,循环帧,请求帧,停止帧。

  • 开机帧:好理解,其实就是一些电平的拉高拉低,和原厂一样就好了。

  • 握手帧:就是开机帧之后,第一次的较量了,他会判断你是不是它公司的设备,不一定有的。

  • 开始帧:握手成功之后,就是开始了,改变通信速度,发送标志位,发送请求等都有可能,不一定有的。

  • 属性帧:为了确认你真的是我家设备,肯定会问序列号,问固件版本,生产日期,厂商、当前设备的设置的属性(比如苹果电池,pg00231234xxxxxxxx,pg是工厂 0023是电量最小值 1234是电量最大值。后续就会发送对应数据范围内数据来告诉手机,手机就可以根据它发送过来的数据知道当前电量了,电量不一定就是0-100啊,0-100只是一个百分比罢了。)

  • 空闲帧:其实我觉得叫心跳包更好点,不是吗?应该都有的。

  • 工作帧:就是主机让从机干某些工作来着,比如强行关闭电池阀门。应该都有的。

  • 循环帧:就是定期发送当前从机属性给主机,方便主机去实时监控从机,一般是有实时性的数据才有意义,这个大概有的,比如可以实时传输当前电量。应该都有的。

  • 请求帧:就是主机来询问从机状态,这些状态可能是不常变化的,也可以是经常变化的,反正就是我没事还不能来看看你吗?应该都有的。

  • 停止帧:就是关机,待机,结束通信,有始有终嘛,应该都有的,有时可能还有结束握手也就是关机帧呢,有点tcp的味道了。

然后就是根据对应的数据帧,进行数据分析了。比如电量吧,看看循环帧中那些数据位随着电量改变了,说明它就是我们要找的数据位,进行对应的操作和编写,然后在少到mcu中去测试一下结果,看看主机是什么反应。就是这样的枯燥无味,但是有利可图。

note:

1.千万千万千万千万要考虑逆向数据的数量,比如循环帧随着电量改变的数据位怎么可能只有几位,肯定是有好好多位一起变的,因为电池电量改变了可不简单啊,涉及到很多材料学、电路设计和走线等,它的很多物理属性都会变化的。它的电压是会变化的,它的电流也会变化,电阻,电容啥的都会变,这个一下子就变了很多数据,分析非常困难。

2.数据不一定就是数据,比如pg00231234xxxxxxxx,0023你怎么知道我没加密呢?1234你怎么知道就是这个电量呢?我可以使用挡位设计,我可以对数据进行拆分等诸多加密操作。挡位 00是一个挡位 23是一个模式;也可以12是一个挡位 34是一个计算公式的参数;说不定我这个数据的高八位放在前两个字节中,低八位放到后面两个字节中呢,然后中间穿插0101,穿插校验和来迷惑?这样得到的逆向数据可以说是一点用都没有的垃圾数据罢了。这个难度就是大大增加了,不过对应通信的可靠性是真的增加了呢。

感悟

其实说白了,神魔之争,魔高一尺道高一丈,只要有利益,就会引来其他人的贪婪,说白了,就是一群资本家的丑恶嘴脸罢了。不过是违法的,怎么说呢,其实从中,也能学到一些东西。如果我开发了一个程序、做了一个很不错的产品,但是别人盗版怎么办,这个时候,我就要设计一个非常非常非常非常非常非常非常非常阴间的通信协议来尽可能的保护我的产品权益,光是靠法律,别人和你好着,等你告赢了,别人早就盈利了。

首先,学习逆向协议,就知道一个主从通信的逻辑,设计一个属于自己的通信协议,注意了这里不是那些外设,而是软件层面的通信协议,可以清楚的理解和知道工作流程和行为状态,可以知道如何增强通信可靠和信号数据安全,这些其实都是纸老虎来着。世上无难事,只怕有心人。别人想要逆向你的协议,被破解只是迟早的事情罢了。不过是利益、时间、安全、成本等权衡和较量罢了。

如果你看我的博客,然后做了某些产业被抓了。。。咳咳咳,到时候别把我供出来就好了,呜呜呜。

对了,还有那种逆向代码的大佬,直接看bin来操作的,看汇编的,不得不说,你们是才是真正的逆向大佬,你们能把源码搞出来的话,确实牛逼的,不过时间成本应该不用我说,难度也是非常吓人。代码加密是常态,引导丢失,程序flash自我删除,防拆处理,BKP防入侵,密钥找不到也是正常的,莫名其妙开辟的数据和空间,恶心人的校验和,锁死芯片本身序列号等都是基操了,而我只是一个小废物捏,呜呜呜。

GPU
GPU管线
GPU编程
OpenGL
DirectX
两者区别和优劣
嵌入式中OpenGL
移动设备中OpenGL ES
总结

ROS

软路由

现在的路由器基本都是无线路由器了,集成wifi和网线于一体。

软路由器其实是在电脑主机的基础上配合软件组合成的路由解决方案,路由的参数通过软件控制和设置。简单的说就是在电脑的硬件基础上加上路由系统来实现路由器的所有功能。硬路由就是我们普遍使用的路由器,由厂家提供整体的解决方案,包括路由器的硬件和软件。

反正软路由就是可以使用第三方软件呢。

路由器VPN

很多时候,连上wifi了,又打开梯子是吧,这个过程有点繁琐,不舒服是吧,这个没得说的,麻烦呢。所以,从路由器着手,就可以实现连上即可vpn。

第三方固件

我的路由器刚好就是TP-Link的,是ok的,直接按照流程,安装clash即可

TP-Link路由器Clash翻墙完全指南 | Clash中文教程网 (clashv2ray.com)

openwrt

现在的路由器基本都是这个了,其实就是像配置我们的windows的静态IP一样,也是配置一个节点的一样的操作的。这个难度就有点高了。

https://zhuanlan.zhihu.com/p/362389529

这个一般是开发人员来搞得,甚至可以编写脚本实现,需要vpn访问特殊ip的时候才使用。

总结

这个是一个好技巧,一劳永逸,注意了。出去了别乱说话和干事哦。