- 博客(70)
- 资源 (1)
- 收藏
- 关注
原创 整理一些常用的代码示例
在使用时,首先使用EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL来初始化和配置PCI总线上的根桥,然后使用EFI_PCI_IO_PROTOCOL来与具体设备进行通信和控制。功能:EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL提供了访问PCI总线上的根桥所需的各种功能和方法,包括内存读写、I/O读写、配置空间读写等。EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL提供了用于访问配置空间的方法,可以用于获取和修改设备的配置信息。
2023-05-17 19:59:42
1205
原创 UEFI 界面实例解析
如果不加判断,直接不可选,那么可以这么写 grayoutif TRUE;INTERACTIVE,意味人机交互,也就是可以动作的,通过这个key去进行操作,这种形式选中后按Enter就是执行操作,先理解三个函数,ExtractConfig,导出配置,RouteConfig,存储配置,CallBack,操作Hii数据。, C文件中保留重要的函数就行,仿照其他第三方驱动,这些驱动以Library形式在DSC文件中被包入,这样就新增了一个页面,在DeviceManager页面,还有一种驱动,这种是独立的驱动。
2023-05-15 00:11:32
2658
原创 C++学习笔记(二)疑点总结
就是取个别名,可以引用变量和函数,系统不会为引用开辟独立空间,同时,引用必须初始化,引用同时也可以作为函数的参数,比如在main函数中需要调用swap(int *p1,int *p2)并输出相应值,那么可以用swap(&a,&b),使用引用就不需要指针,swap(int &p1,int &p2),main函数直接使用swap(a,b),另外,引用可以作为函数的返回值类型,但要注意,不要返回局部变量的引用,返回值类型为引用,可以完成链式操作。//调用拷贝构造Data(const Data &data)
2022-03-22 15:37:48
919
原创 BIOS学习实战之SMBIOS
这个protocol就是操作smbios内容的,smbios怎么加载的,这个就有待去了解了,而且代码本身大部分是做好的,来看下这个protocol的里面包含了什么
2022-03-22 15:36:23
5522
7
原创 BIOS实战之写一个自己的SetUpApp(1)
一直想魔改UEFI的设置界面,奈何很多逻辑还没理清,既然实践是检验真理的唯一标准,那么这些天准备一边钻研,一边总结,一边实践,看能不能写出一个自己的app来。待写。。。
2022-03-22 15:35:03
924
2
原创 ASL操作符
语法:Scope(Location){ObjectList}用法:打开并且为对象集分配一个基础名字范围。在此范围内定义的所有对象名字都是基于Location创建的,Scope本身并不创建对象。Scope (\PCI0){ Name (Index,3) Scope (\) { Method (RQ) {Return (0)} }}新创建的对象被放置在ACPI名字空间中:\PCI0.Index \RQ语法:Device(DeviceName){ObjectList
2022-03-02 20:56:36
1485
2
原创 Attiny48单片机编程经验总结
Attiny48为AVR单片机,AVR单片机具有多个I/O端口,分别称作PORTA,PORTB,PORTC,PORTD等等,每个I/O端口最多有8个端口引脚,每个端口都有3个对应的专用寄存器,这三个寄存器的作用分别是
2022-03-02 20:52:11
1463
原创 BIOS实战之蜂鸣器和LED灯的功能实现
这两个功能,我也是看文档来的,前面该写的函数几乎都写了,这一节主要说一下我理解的,怎么实现蜂鸣器的功能以及LED的功能,这时候就体现这个看文档的重要性了。Beep的实现前面我们说了这个硬件监控的一些功能实现以及逻辑设备的读写,有了这个基础,那么我们同样可以进行蜂鸣器的功能实现,那么蜂鸣器在哪个逻辑设备呢,这里必须说明,这些SIO的功能必须根据文档来,如果手上没有文档是比较难理解的,通过IT8738芯片文档,我们发现一张图,如下图,有没有发现蜂鸣器和LED都在这,这个功能是什么功能呢,GPIO Fun
2022-02-27 23:06:29
2047
1
原创 BIOS实战之secure boot功能的实现方法
Secure boot,顾名思义,就是安全启动,主板厂商将一些根证书放在BIOS中,当打开安全启动模式的时候,不管是bootloader还是硬件驱动还是shell下运行的程序应用(包括shell),都需要进行验签才能运行,首先我们看下证书有哪些:
2022-02-25 11:06:40
10904
原创 BIOS实战之HW monitor
首先看下HW monitor,也就是硬件监控,什么温度,电压,系统风扇,CPU风扇啥的。在IT8738芯片文档9.5节中,我们可以看到,这些是在芯片内置的EC逻辑设备中进行的,也就是环境控制(不是嵌入式控制)
2022-02-25 11:03:14
4438
原创 BIOS实战之读写逻辑设备(SIO)
提到了SIO有关的,之前略有研究,不过确实实际只研究过小部分功能,也就做龙芯BIOS的时候参与过SIO的有关编程,因为这个东西笔记本是肯定不会用的,笔记本用EC,这个SIO也就相当于PC板上的EC了,某位大佬既然问了我这些,回去立马找了份SIO芯片的文档,仔细看了下,也算查漏补缺了,这篇主要记录读写逻辑设备的原理以及有关编程
2022-02-25 11:01:10
2218
原创 BIOS实战之MIPI屏的配置
BMP工具用来配置GOP driver的,需要BIN文件和BSF文件,下图随意打开了一个GOP driver文件,可以看到VBT的信息,支持LFP type为edp。GOP的bin文件有的有多个,看代码加载的是哪个就改哪个
2022-02-25 10:59:47
3181
3
原创 DXE driver
前文说过,DXE阶段运行的驱动有两种类型,一种是符合UEFI驱动模型的,另一种就是不符合的普通DXE driver,普通的DXE driver一般在驱动运行的时候就直接完成了,符合UEFI驱动模型的需要先注册驱动,然后在BDS阶段通过调用系统服务来完成。在显卡的驱动模型中,已经说明了符合UEFI驱动模型的driver运行方式,这篇短文主要是记录一下driver是怎么加载运行的。对于符合UEFI驱动模型的,实现BootServices 的ConnectController接口,该函数将尝试连接一个或多
2022-02-16 10:11:38
1200
2
原创 BIOS实战之事件的使用
这里主要介绍两个示例,第一个是在之前Phoenix代码中看到的,第二个是国产平台中遇到的,首先看第一个。问题:开机显示logo后进入shell或者pxe,logo依然存在,进入pxe好解决,咱们在进入之前进行清屏就行,那么进入shell后的问题该怎么去解决呢这里我们就可以用到一个事件(为什么不在进入shell前进行清屏?这个我也没实践过,不晓得当初写这个解决方案的是否验证过了,因为相比较事件,直接清屏更加简单有效),看过UEFI原理与编程实践中事件的简单使用,这里新增一个知识点RegisterPro
2022-02-11 15:29:57
1262
原创 UiApp的生命周期
当一台机器按某一个快捷键进setup界面的时候,如F2/F8/ESC,UiApp的生命周期就正式开始了。UiApp,顾名思义,它就是一个app,只不过,这是一个特殊的app,我们进入setup的界面就是这个app的具体表现
2022-02-11 14:20:54
1888
原创 BIOS实战之调整启动顺序
在BIOS的功能完善过程中,我们经常需要调整启动顺序,比如在有UEFI shell启动项的情况下,我们需要将其放在最后,或者要将某个硬盘放在首位。EfiBootManagerSortLoadOptionVariable (LoadOptionTypeBoot, (SORT_COMPARE)CompareBootOption);INTNEFIAPICompareBootOption ( CONST EFI_BOOT_MANAGER_LOAD_OPTION *Left, CONST
2022-01-25 15:16:59
3199
原创 UEFI原理与编程实践--EFI System Table中的输入输出
这一节UEFI原理与编程的书籍里面貌似没有提到,不过在我上次使用飞腾源代码增加功能的过程中发现logo界面的左上角有个光标,后来发现源代码也有,这就让有强迫症的人非常不爽啦,这个光标怎么来的呢,我找了几个地方,都不对,后来懒得找了,既然在logo出现前就有这个光标了,那我直接在logo显示前清屏不就ok了么,然后把这个问题顺利解决。输入输出在UEFI中使用非常广泛,随便举个栗子,大家经常使用的Print打印输出在屏幕上:UINTNInternalPrint ( IN CONST CHAR1
2022-01-13 15:06:59
1828
1
原创 UEFI原理与编程实践--添加标准C库
标准C库有个好处,那就是通用性,比如工作中,要做一个EC的更新工具,要求厂商给一份源代码,拿过来发现,他们是用的标准C写的,也是,不做UEFI的,谁会使用UEFI标准定义的函数去写他们自己的代码呢。那么问题来了,拿到这份代码应该怎么做,第一种,UEFI代码中加入C标准库,第二种,标准库中的函数使用UEFI标准中的函数进行替换,之前我添加C标准库,发现整个固件的size需要重新调整,也就是要重新调整FV的大小,因为针对FV,是做了一些功能的,不能随意调整,所以,只能用UEFI标准函数替换了。不过C标准
2022-01-13 13:10:57
735
1
原创 UEFI原理与编程实践---字体
在BIOS setup界面,通常有一个选项,那就是语言选择,EDKII源代码默认是没有中文支持的,所以,即使你在dsc文件中将gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultPlatformLang的值设置为"zh-Hans",界面也不会有任何的反应。UEFI将资源组织在HII包中,新增新的字符串资源,我们需要在程序中通过HiiAddPackages注册字符串资源,然后通过字符串标识符使用对应的字符串。每一种语言都有自己的编码区间,通过编码匹配Unico
2022-01-13 11:37:46
937
原创 BIOS实战之PCI设备枚举二
上次说到了除了IO枚举PCI设备,还有另一种方式枚举PCI设备,那就是通过pciio,这也是UEFI代码中的常规操作(当然还有MMIO,不过不写了)UEFI BIOS 提供了两个主要的模块来支持PCI 总线,一个是PCI Host Bridge 控制器驱动,另一个是PCI 总线驱动。PCI Host Bridge 控制器驱动是跟特定的平台硬件绑定的,根据系统实际IO 空间和memory map, 为PCI设备指定I/O 空间和Memory 空间的范围,并且产生PCI Host Bridge Reso
2022-01-12 17:00:19
2439
1
原创 BIOS实战之PCI设备枚举一
PCI设备枚举主要通过两种不同方式进行表现,一种就是IO了,那么另一种就是UEFI中的pciio协议,首先看下第一种IO方式进行PCI设备枚举先写一个读PCI配置空间的函数,这是通过汇编写,很好理解:unsigned long PciRead(unsigned long index){ unsigned long pcidata; asm .386 //use 32bit registers asm xor eax, eax //c
2022-01-12 16:41:48
2449
1
原创 PCI/PCIE相关知识
PCI/PCIe配置空间PCI/PCIe的配置空间Configuration Space是一个与Memory空间和IO空间并列的独立的空间。PCI Configuration Space有256 Bytes,对于PCIe Configuration Space,扩展为4096 Bytes,PCIe是在PCI基础上发展的协议,并且在此基础之上进行了扩展,其扩展形式是通过一种称为Capability的寄存器块来完成的。访问方式IO方式CPU提供了两组I/O寄存器用于访问配置空间:配置空间控制
2022-01-12 15:01:31
1277
原创 UEFI原理与编程实践--UEFI驱动模型之显卡(UEFI方向)驱动分析
拆开一台国产电脑,会发现,很多重要芯片,其实已经国产化了,CPU、GPU、电源管理芯片等等,刚做了一下GOP的笔记,回头想想,之前包入厂商的显卡驱动一直没怎么关注他们的运行逻辑是什么,那么,这篇文章就来探讨深入一下,这个显卡驱动是怎么做的国产显卡,属于前列的当属景嘉微显卡,那么这次就来分析一下JM7200的驱动是怎么做的。UEFI驱动模型驱动总的分为两种,一种是符合驱动模型的,一种就是不符合的了,UEFI驱动模型的核心是通过EFI Driver Binding Protocol管理驱动程序。.
2022-01-12 11:52:52
3796
原创 UEFI原理与编程实践--图像显示GRAPHICS_OUTPUT_PROTOCOL
GOP,也就是GRAPHICS_OUTPUT_PROTOCOL的简称,GOP包含三个成员函数和一个成员变量:Status = gBS->LocateProtocol ( &gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&GraphicsOutput );struct _EFI_GRAP
2022-01-12 10:24:21
3078
原创 BIOS实战之读取文件--BMP图片显示
本节直接贴主要的代码:#include "DisplayBmpTest.h"EFI_STATUSEFIAPIShellAppMain ( IN UINTN Argc, IN CHAR16 **Argv ){ EFI_STATUS Status; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput = NULL; UINT8 *
2022-01-11 15:42:00
693
2
原创 BIOS实战之读取文件---获取文件路径+最终读取
接上一节,获取文件路径实际上也是获取当前这个APP的路径,怎么获取这个APP的路径,这里需要用到一个EFI_LOADED_IMAGE_PROTOCOL,原理如下:根据当前 Application 的 ImageHandle 取得对应的 Handle。使用 HandleProtcol 直接打开加载在Application 上面的 EFI_LOADED_IMAGE_PROTOCOL。在这个 Protocol上有 FilePath,就是当前 Image 的 Device Path Protocol通过
2022-01-11 14:42:30
2729
原创 BIOS实战之读取文件
在UEFI shell下,BIOS的更新、EC的更新等都需要用到读取文件,从UEFI原理与编程中初步了解怎么读写,那么接下来就进入实践环节...
2022-01-11 14:07:38
2107
2
原创 EDK II 源码剖析---USB协议之EHCI(例子)二
上一节主要讲了USB主控制器驱动的一般流程,接下来主要讲一下USB 总线驱动和USB 设备驱动USB总线驱动同样的,从下面的函数开始说起:EFI_STATUSEFIAPIUsbBusControllerDriverStart ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingD
2022-01-06 10:34:49
3188
原创 EDK II 源码剖析---USB协议之EHCI(例子)一
基础1. OHCI(Open Host Controller Interface)是支持USB1.1的标准,但它不仅仅是针对USB,还支持其他的一些接口,比如它还支持Apple的火线(Firewire,IEEE 1394)接口。与UHCI相比,OHCI的硬件复杂,硬件做的事情更多,所以实现对应的软件驱动的任务,就相对较简单。主要用于非x86的USB,如扩展卡、嵌入式开发板的USB主控。2. UHCI(Universal Host Controller Interface),是Intel主导的对USB1.
2022-01-05 14:33:25
2523
原创 LPC相关知识
LPC(Low Pin Count)接口时Intel推出的一种低IO数目的外设接口,用于连接SuperIO、Flash等LPC设备
2021-12-06 16:10:29
3546
原创 UEFI原理与编程实践--编译环境搭建
有一段时间没写了,主要是windows的环境搭建下班后一直没弄好,在编译的时候总是出现一个cl.exe的致命错误,百度了很多也没解决,索性我放弃了,直接搭建Linux编译环境得了。因为我用的是官网最新的edk(吐槽一下,edk里面有些文件都没有,被删掉了,不知道这个代码管理者是怎么管控的),所以不晓得到底是代码有问题呢还是搭建的环境有问题,我也不想去思考了,毕竟搭建Linux环境我觉得简单多了,还不占用C盘过多的空间,对于个人来说,简直完美。废话不多说,下面直接开始搭建。第一步:安装VMware
2021-12-06 13:20:07
1045
1
原创 UEFI原理与编程实践--硬盘相关的Protocol:BlockIo/DiskIo/DiskInfo/PassThrough
硬盘是一种块设备,所以每个硬盘设备控制器都安装有一个BlockIo实例、一个BlockIo2实例,然后还安装了一个DiskIo实例、一个DiskIo2实例,这两者的区别就是BlockIo只能按块读写设备,而DiskIo可以从任意便宜出读写磁盘,并且可以读取任意字节数,BlockIo是EFI_BLOCK_IO_PROTOCOL的缩写,DiskIo是EFI_DISK_IO_PROTOCOL的缩写。虽然BlockIo和DiskIo极大的方便了我们操作磁盘,但是其功能十分有限,通过BlockIo和Dis...
2021-11-30 16:42:45
2422
原创 SIO有关知识
Super I/O芯片也叫I/O芯片。在486以上档次的主板上都有I/O控制电路。因为在南桥这样的高速设备和串行、并行接口、软盘驱动器及键盘鼠标等大量低速设备之间必定存在资源的不匹配,而需要经过转换和管理。而Super I/O芯片则完成了该功能。
2021-11-29 14:02:57
1883
转载 SPI相关知识
SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。
2021-11-29 13:59:41
491
原创 UEFI原理与编程实践--GUI之Setup界面分析一
formset &endformset表单集,Setup设置界面的一个页面,该页面内的内容都需要放在表单集内Example: formset guid = MAIN_FORM_SET_GUID, title = STRING_TOKEN(STR_MAIN), help = STRING_TOKEN(STR_MAIN_HELP), class = MAIN_FORM_SET_CLASS, subclass = 0,
2021-11-29 13:47:53
6232
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人