Can’t include “nasm.inc” error

最近在使用 EDK201903 的时候遇到了一个奇怪的问题, 错误信息如下:

ScanMem32Wrapper.c
c:\buildbs\stable201903\Build\NT32X64\DEBUG_VS2015x86\X64\MdePkg\Library\BaseLib\BaseLib\OUTPUT\X64\LongJump.iii:22: fatal: unable to open include file `Nasm.inc’
NMAKE : fatal error U1077: ‘C:\nasm\nasm.EXE’ : return code ‘0x1’
Stop.

具体代码在 \MdePkg\Library\BaseLib\X64\LongJump.nasm 。 就是说在编译过程中编译器发现找不到 Nasm.inc 这个文件。

; Module Name:
;
;   LongJump.Asm
;
; Abstract:
;
;   Implementation of _LongJump() on x64.
;
;------------------------------------------------------------------------------

%include "Nasm.inc"

    DEFAULT REL
    SECTION .text

extern ASM_PFX(PcdGet32 (PcdControlFlowEnforcementPropertyMask))

在 \MdePkg\Include\X64 目录下有这个文件。

经过搜索,在 https://bugzilla.tianocore.org/show_bug.cgi?id=2719 有提到这个问题,但是我没看明白问题的原因。一个解决方法是将这个文件拷贝到 \MdePkg\Library\BaseLib\X64 下面,再次编译即可通过。

这个问题挺奇怪, EDK2 201903 我已经使用了很长时间,不知道为什么突然又出现这样的错误。

GC9A01 Porting 到 Adafriut GFX

前面介绍了直接驱动 GC9A01 的方法,最近花了点时间将代码 Porting 到 Adafruit_GFX 库上,这样用户可以直接调用库函数来实现在屏幕上的绘制。

下面的测试代码和之前的 ILI9341  库中的graphicstest内容相同,可以方便的进行参考:

/***************************************************
  This is a library for the GC9A01 IPS SPI display.

  Originally written by Limor Fried/Ladyada for 
  Adafruit Industries.

  Modified by Zoologist@ www.lab-z.com
 ****************************************************/

#include <Adafruit_GFX.h>    // Core graphics library by Adafruit
#include <Arduino_GC9A01.h> // Hardware-specific library for GC9A01 (with or without CS pin)
#include <SPI.h>
/*如果你用DFRobot 的TinkerNode 那么可以使用下面的定义
#define TFT_DC    D9
#define TFT_RST   D2
#define TFT_CS    D8 // only for displays with CS pin
#define TFT_MOSI  MOSI   // for hardware SPI data pin (all of available pins)
#define TFT_SCLK  SCK   // for hardware SPI sclk pin (all of available pins)
*/
//如果你使用 esp-wroom-32,那么可以考虑使用下面的定义
#define TFT_DC    15
#define TFT_RST   2
#define TFT_CS    19    // only for displays with CS pin
#define TFT_MOSI  23   // for hardware SPI data pin (all of available pins)
#define TFT_SCLK  18   // for hardware SPI sclk pin (all of available pins)

//You can use different type of hardware initialization
//using hardware SPI (11, 13 on UNO; 51, 52 on MEGA; ICSP-4, ICSP-3 on DUE and etc)
Arduino_GC9A01 tft = Arduino_GC9A01(TFT_DC, TFT_RST,TFT_CS ); //for display  CS pin
//Arduino_GC9A01 tft = Arduino_GC9A01(TFT_DC, TFT_RST); //for display with without CS pin
//or you can use software SPI on all available pins (slow)
//Arduino_GC9A01 tft = Arduino_GC9A01(TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK); //for display without CS pin
//Arduino_GC9A01 tft = Arduino_GC9A01(TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK, TFT_CS); //for display with CS pin
//Arduino_GC9A01 tft = Arduino_GC9A01(-1, TFT_RST, TFT_MOSI, TFT_SCLK, TFT_CS); //for display with CS pin and DC via 9bit SPI

void setup(void) {
  Serial.begin(115200);
  Serial.println("Hello! GC9A01 TFT Test");
  
  tft.init(240, 240);   // initialize a GC9A01 chip, 240x240 pixels

  Serial.println(F("Benchmark                Time (microseconds)"));

  delay(10);
  Serial.print(F("Screen fill              "));
  Serial.println(testFillScreen());
  delay(500);

  Serial.print(F("Text                     "));
  Serial.println(testText());
  delay(3000);

  Serial.print(F("Lines                    "));
  Serial.println(testLines(GC9A01_CYAN));
  delay(500);

  Serial.print(F("Horiz/Vert Lines         "));
  Serial.println(testFastLines(GC9A01_RED, GC9A01_BLUE));
  delay(500);

  Serial.print(F("Rectangles (outline)     "));
  Serial.println(testRects(GC9A01_GREEN));
  delay(500);

  Serial.print(F("Rectangles (filled)      "));
  Serial.println(testFilledRects(GC9A01_YELLOW, GC9A01_MAGENTA));
  delay(500);

  Serial.print(F("Circles (filled)         "));
  Serial.println(testFilledCircles(10, GC9A01_MAGENTA));

  Serial.print(F("Circles (outline)        "));
  Serial.println(testCircles(10, GC9A01_WHITE));
  delay(500);

  Serial.print(F("Triangles (outline)      "));
  Serial.println(testTriangles());
  delay(500);

  Serial.print(F("Triangles (filled)       "));
  Serial.println(testFilledTriangles());
  delay(500);

  Serial.print(F("Rounded rects (outline)  "));
  Serial.println(testRoundRects());
  delay(500);

  Serial.print(F("Rounded rects (filled)   "));
  Serial.println(testFilledRoundRects());
  delay(500);

  Serial.println(F("Done!"));

}

void loop() {
  for(uint8_t rotation=0; rotation<4; rotation++) {
    tft.setRotation(rotation);
    testText();
    delay(1000);
  }
}

unsigned long testFillScreen() {
  unsigned long start = micros();
  tft.fillScreen(GC9A01_BLACK);
  tft.fillScreen(GC9A01_RED);
  tft.fillScreen(GC9A01_GREEN);
  tft.fillScreen(GC9A01_BLUE);
  //tft.fillScreen(GC9A01_BLACK);
  return micros() - start;
}

unsigned long testText() {
  tft.fillScreen(GC9A01_RED);
  unsigned long start = micros();
  tft.setCursor(0, 0);
  tft.setTextColor(GC9A01_WHITE);  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(GC9A01_YELLOW); tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextColor(GC9A01_RED);    tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
  tft.println();
  tft.setTextColor(GC9A01_GREEN);
  tft.setTextSize(5);
  tft.println("Groop");
  tft.setTextSize(2);
  tft.println("I implore thee,");
  tft.setTextSize(1);
  tft.println("my foonting turlingdromes.");
  tft.println("And hooptiously drangle me");
  tft.println("with crinkly bindlewurdles,");
  tft.println("Or I will rend thee");
  tft.println("in the gobberwarts");
  tft.println("with my blurglecruncheon,");
  tft.println("see if I don't!");
  return micros() - start;
}

unsigned long testLines(uint16_t color) {
  unsigned long start, t;
  int           x1, y1, x2, y2,
                w = tft.width(),
                h = tft.height();

  tft.fillScreen(GC9A01_RED);
  
  x1 = y1 = 0;
  y2    = h - 1;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = w - 1;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t     = micros() - start; // fillScreen doesn't count against timing

  
  tft.fillScreen(GC9A01_BLACK);
  

  x1    = w - 1;
  y1    = 0;
  y2    = h - 1;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = 0;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t    += micros() - start;

  
  tft.fillScreen(GC9A01_BLACK);
  

  x1    = 0;
  y1    = h - 1;
  y2    = 0;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = w - 1;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
  t    += micros() - start;

  
  tft.fillScreen(GC9A01_BLACK);
  

  x1    = w - 1;
  y1    = h - 1;
  y2    = 0;
  start = micros();
  for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
  x2    = 0;
  for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);

  
  return micros() - start;
}

unsigned long testFastLines(uint16_t color1, uint16_t color2) {
  unsigned long start;
  int           x, y, w = tft.width(), h = tft.height();

  tft.fillScreen(GC9A01_BLACK);
  start = micros();
  for(y=0; y<h; y+=5) tft.drawFastHLine(0, y, w, color1);
  for(x=0; x<w; x+=5) tft.drawFastVLine(x, 0, h, color2);

  return micros() - start;
}

unsigned long testRects(uint16_t color) {
  unsigned long start;
  int           n, i, i2,
                cx = tft.width()  / 2,
                cy = tft.height() / 2;

  tft.fillScreen(GC9A01_BLACK);
  n     = min(tft.width(), tft.height());
  start = micros();
  for(i=2; i<n; i+=6) {
    i2 = i / 2;
    tft.drawRect(cx-i2, cy-i2, i, i, color);
  }

  return micros() - start;
}

unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
  unsigned long start, t = 0;
  int           n, i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(GC9A01_BLACK);
  n = min(tft.width(), tft.height());
  for(i=n; i>0; i-=6) {
    i2    = i / 2;
    start = micros();
    tft.fillRect(cx-i2, cy-i2, i, i, color1);
    t    += micros() - start;
    // Outlines are not included in timing results
    tft.drawRect(cx-i2, cy-i2, i, i, color2);
    yield();
  }

  return t;
}

unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
  unsigned long start;
  int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;

  tft.fillScreen(GC9A01_BLACK);
  start = micros();
  for(x=radius; x<w; x+=r2) {
    for(y=radius; y<h; y+=r2) {
      tft.fillCircle(x, y, radius, color);
    }
  }

  return micros() - start;
}

unsigned long testCircles(uint8_t radius, uint16_t color) {
  unsigned long start;
  int           x, y, r2 = radius * 2,
                w = tft.width()  + radius,
                h = tft.height() + radius;

  // Screen is not cleared for this one -- this is
  // intentional and does not affect the reported time.
  start = micros();
  for(x=0; x<w; x+=r2) {
    for(y=0; y<h; y+=r2) {
      tft.drawCircle(x, y, radius, color);
    }
  }

  return micros() - start;
}

unsigned long testTriangles() {
  unsigned long start;
  int           n, i, cx = tft.width()  / 2 - 1,
                      cy = tft.height() / 2 - 1;

  tft.fillScreen(GC9A01_BLACK);
  n     = min(cx, cy);
  start = micros();
  for(i=0; i<n; i+=5) {
    tft.drawTriangle(
      cx    , cy - i, // peak
      cx - i, cy + i, // bottom left
      cx + i, cy + i, // bottom right
      tft.color565(i, i, i));
  }

  return micros() - start;
}

unsigned long testFilledTriangles() {
  unsigned long start, t = 0;
  int           i, cx = tft.width()  / 2 - 1,
                   cy = tft.height() / 2 - 1;

  tft.fillScreen(GC9A01_BLACK);
  start = micros();
  for(i=min(cx,cy); i>10; i-=5) {
    start = micros();
    tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
      tft.color565(0, i*10, i*10));
    t += micros() - start;
    tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
      tft.color565(i*10, i*10, 0));
    yield();
  }

  return t;
}

unsigned long testRoundRects() {
  unsigned long start;
  int           w, i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(GC9A01_BLACK);
  w     = min(tft.width(), tft.height());
  start = micros();
  for(i=0; i<w; i+=6) {
    i2 = i / 2;
    tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));
  }

  return micros() - start;
}

unsigned long testFilledRoundRects() {
  unsigned long start;
  int           i, i2,
                cx = tft.width()  / 2 - 1,
                cy = tft.height() / 2 - 1;

  tft.fillScreen(GC9A01_BLACK);
  start = micros();
  for(i=min(tft.width(), tft.height()); i>20; i-=6) {
    i2 = i / 2;
    tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
    yield();
  }

  return micros() - start;
}

测试视频:

完整的代码和库文件下载:

C2061 错误

最近在研究段代码的时候遇到了一个奇怪的问题,经过简化,错误可以用下面的代码表示:

#include  <stdio.h>
struct stBlockX
{
     int value;					// Decodes to.
     int length;				// Length in bits.
     unsigned short int code;	// 2 byte code (variable length)
} ;

stBlockX        m_blocks[1024];

int
main (
  IN int Argc,

  IN char **Argv
  )
{

  puts("Hello there fellow Programmer.");
  puts("Welcome to the world of EDK II.");

  return 0;
}

编译错误是 C2061:

d:\test\AppPkg\Applications\C2061\C2061.c(27): error C2061: syntax error: identifier 'm_blocks'
d:\test\AppPkg\Applications\C2061\C2061.c(27): error C2059: syntax error: ';'
d:\test\AppPkg\Applications\C2061\C2061.c(27): error C2059: syntax error: '['
Building ... d:\test\AppPkg\Applications\Sockets\GetAddrInfo\GetAddrInfo.inf [X64]
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Vc\bin\x86_amd64\cl.exe"' : return code '0x2'
Stop.

有兴趣的朋友可以先看一下代码猜测一下原因。

经过研究,出现问题是原因是上面的定义出现错误,应该是定义为一种类型,实际上只是定于了一个变量,修改为下面这种就能够通过编译并且正常工作了。

typedef struct 
{
     int value;					// Decodes to.
     int length;				// Length in bits.
     unsigned short int code;	// 2 byte code (variable length)
} stBlockX;

stBlockX        m_blocks[1024];

参考:

1. https://blog.csdn.net/wangjun_huster/article/details/60480192 type struct 和struct的区别

ESP32 俄罗斯方块游戏机

最近使用 ESP32 做的一个俄罗斯方块游戏机,是立创的一个比赛的项目。具体代码在 https://diy.szlcsc.com/p/Zoologist/ji-yuesp32-di-e-luo-si-fang-kuai-you-hu-ji

话说 ESP32 真的很强大,价格也不贵,这样下去完全可以取代Uno(最新的一款 ESP32 支持 USB Device可以实现很多有趣的功能)

另外,研究了一下 WordPress 插入 Bilibili 网站视频的方法(直接插入会使得视频画面很小),代码如下【参考1】:

&lt;iframe frameborder="no" height="400" src="//player.bilibili.com/player.html?aid=412935552&amp;cid=186803402&amp;page=1" width="100%">&lt;/iframe>

上述方法来自:https://www.yunyiya.com/index.php/archives/186/

UEFI Tips: EDK2 Stable202002

前一段试验了新出的 EDK2 Stable202002 版本,可以在 https://github.com/tianocore/edk2/releases/tag/edk2-stable202002 看到,有如下的更新:

New Features

因为有朋友经常遇到环境配置上面的问题,因此,这次直接提供一个 EDK202002 +Win10 + VS2015 的镜像文件。有需要的朋友可以下载之后从 VirtualBox 启动。

链接: https://pan.baidu.com/s/1asiGrFGwyhZ91u9OepCxXg 提取码: m73e

=========================================================

20201019 补充 简单介绍一下 VS2019编译这套代码的方法

为了编译成功,除了 VS2019 还需要安装下面2个软件:

1. Python 3.8 (安装时注意选择 Add python to path)

2.安装 Nasm (安装完后检查一下,如果默认目录不是在C:根目录下,那么需要将全部文件拷贝到 c:\nasm下)

3. 运行 edksetup rebuild  生成编译工具

接下来就遇到奇怪的问题了,当我们使用 build -a X64 -p EmulatorPkg\EmulatorPkg.dsc -t VS2019 命令后,编译中会有如下的错误:

        "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.26.28801\bin\Hostx86\x64\link.exe" /out:"c:\buildbs\s202002\Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.exe" /base:0x10000000 /pdb:"c:\buildbs\s202002\Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.pdb" /ALIGN:4096 /FILEALIGN:4096 /SUBSYSTEM:CONSOLE /EXPORT:InitializeDriver=_ModuleEntryPoint /BASE:0x10000  @c:\buildbs\s202002\Build\EmulatorX64\DEBUG_VS2019\X64\EmulatorPkg\Win\Host\WinHost\OUTPUT\static_library_files.lst
Microsoft (R) Incremental Linker Version 14.26.28806.0
Copyright (C) Microsoft Corporation.  All rights reserved.

c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/EmulatorPkg/Win/Host/WinHost/OUTPUT/WinHost.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BaseLib/BaseLib/OUTPUT/BaseLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BaseMemoryLib/BaseMemoryLib/OUTPUT/BaseMemoryLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BasePcdLibNull/BasePcdLibNull/OUTPUT/BasePcdLibNull.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull/OUTPUT/BaseDebugLibNull.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull/OUTPUT/PeCoffExtraActionLibNull.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/EmulatorPkg/Library/SecPpiListLib/SecPpiListLib/OUTPUT/SecPpiListLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BasePrintLib/BasePrintLib/OUTPUT/BasePrintLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdePkg/Library/BasePeCoffLib/BasePeCoffLib/OUTPUT/BasePeCoffLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/EmulatorPkg/Library/ThunkPpiList/ThunkPpiList/OUTPUT/ThunkPpiList.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/EmulatorPkg/Library/ThunkProtocolList/ThunkProtocolList/OUTPUT/ThunkProtocolList.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/EmulatorPkg/Library/SecPeiServicesLib/SecPeiServicesLib/OUTPUT/SecPeiServicesLib.lib
c:/buildbs/s202002/Build/EmulatorX64/DEBUG_VS2019/X64/MdeModulePkg/Library/FrameBufferBltLib/FrameBufferBltLib/OUTPUT/FrameBufferBltLib.lib
LINK : warning LNK4108: /ALIGN specified without /DRIVER; image may not run
LINK : warning LNK4001: no object files specified; libraries used
LINK : warning LNK4068: /MACHINE not specified; defaulting to X86
LINK : error LNK2001: unresolved external symbol _ModuleEntryPoint
c:\buildbs\s202002\Build\EmulatorX64\DEBUG_VS2019\X64\WinHost.lib : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.26.28801\bin\Hostx86\x64\link.exe"' : return code '0x460'
Stop.

这是生成模拟器的最后一个动作,但是在 Link 的时候遇到了问题。

偶然发现,在 \EmulatorPkg\Win\VS2017\   有  BuildVS.bat 这个文件,内容如下:

cd ../../../

@call edksetup.bat

build -p EmulatorPkg\EmulatorPkg.dsc -t VS2017 %*

如果我们使用 build -a X64 -p EmulatorPkg\EmulatorPkg.dsc -t VS2017 那么是可以编译通过的。

经过比对,最终发现在 \EmulatorPkg\Win\Host\WinHost.inf 有对 VS2017 编译工具特别的处理。根据这个提示,在文件中加入针对 VS2019 的特别处理如下:

  MSFT:*_VS2019_X64_DLINK_FLAGS      = /LIBPATH:”%VCToolsInstallDir%lib\x64″ /LIBPATH:”%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x64″ /LIBPATH:”%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x64″ /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:AMD64 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib

即可通过编译。

推荐一本书《深入浅出SSD:固态存储核心技术、原理与实战》

最近比较忙,暂时没时间继续研究 UEFI编程,另外业余时间在琢磨如何制作一个双机共享(UEFI Shell 和 Windows)文件的小东西,这样能够极大方便在实体机上测试 UEFI Application。

偶然看到《深入浅出SSD:固态存储核心技术、原理与实战》这本书,感觉内容深入浅出非常适合需要了解SSD相关知识的人士。特别是 “第8章 SSD电源管理” 和当前的 Modern Standby 有很大关系(我忽然觉得未来有一天支持 S3可能会成为某个笔记本的卖点)。推荐有兴趣的朋友阅读此书。

版权信息
赞誉
推荐序一
推荐序二
前言
第1章 SSD综述
1.1 引子
1.2 SSD vs HDD
1.3 固态存储及SSD技术发展史
1.4 SSD基本工作原理
1.5 SSD产品核心参数
1.6 接口形态
1.7 固态存储市场
第2章 SSD主控和全闪存阵列
2.1 SSD系统架构
2.2 SSD主控厂商
2.3 案例:硅格(SiliconGo)SG9081主控
2.4 案例:企业级和消费级主控需求的归一化设计
2.5 案例:DERA(得瑞领新)NVMe控制器TAI和NVMe SSD产品
2.6 全闪存阵列AFA
2.7 带计算功能的固态硬盘
第3章 SSD存储介质:闪存
3.1 闪存物理结构
3.2 闪存实战指南
3.3 闪存特性
3.4 闪存数据完整性
第4章 SSD核心技术:FTL
4.1 FTL综述
4.2 映射管理
4.3 垃圾回收
4.4 Trim
4.5 磨损平衡
4.6 掉电恢复
4.7 坏块管理
4.8 SLC cache
4.9 RD&DR
4.10 Host Based FTL
第5章 PCIe介绍
5.1 从PCIe的速度说起
5.2 PCIe拓扑结构
5.3 PCIe分层结构
5.4 PCIe TLP类型
5.5 PCIe TLP结构
5.6 PCIe配置和地址空间
5.7 TLP的路由
5.8 数据链路层
5.9 物理层
5.10 PCIe Reset
5.11 PCIe Max Payload Size和Max Read Request Size
5.12 PCIe SSD热插拔
5.13 SSD PCIe链路性能损耗分析
第6章 NVMe介绍
6.1 AHCI到NVMe
6.2 NVMe综述
6.3 吉祥三宝:SQ、CQ和DB
6.4 寻址双雄:PRP和SGL
6.5 Trace分析
6.6 端到端数据保护
6.7 Namespace
6.8 NVMe over Fabrics
第7章 SSD测试
7.1 主流SSD测试软件介绍
7.2 验证与确认
7.3 测试仪器
7.4 回归测试
7.5 DevSlp测试
7.6 PCIe InterOp
7.7 WA测试
7.8 耐久度测试
7.9 认证Certification
7.10 SSD Performance测试
第8章 SSD电源管理
8.1 SATA省电模式Partial和Slumber
8.2 SATA超级省电模式DevSlp
8.3 SATA终极省电模式RTD3
8.4 PCIe省电模式ASPM
8.5 PCIe其他省电模式
8.6 NVMe动态电源管理
8.7 Power Domain
第9章 ECC原理
9.1 信号和噪声
9.2 通信系统模型
9.3 纠错编码的基本思想
9.4 LDPC码原理简介
9.5 LDPC解码
9.6 LDPC编码
9.7 LDPC在SSD中的应用

ESP32 GC9A01 测试代码

最近买了一个圆形的液晶显示屏,这个造型很特别是表盘的原型。它的主控是 GC9A01,我在网上搜了一圈没有找到现成的库于是只能自己研究。查看了一下 SPEC发现Command 之类的和ST7789基本相同,但是直接使用 ST7789 无法驱动显示。为此只能从头研究。

GC9A01 TFT LCD

测试使用 FireBeetle(ESP32),特别需要注意的是从资料上看这个屏幕只支持 3.3V,因此使用 UNO 这样的板子有烧毁的可能,我也并没有试验过UNO 这样的5V 的板子,具体建议询问卖家。

硬件连接:

FireBeetle(ESP32)GC9A01 
3.3VVCC 
GNDGND 
D9DC 
D2RST 
D10(预留给CS 未使用)  
 CSGND
 BLK未连接
 SCL 
 SDA 
ESP32和 GC9A01连接

最终只得从卖家的代码上修改。卖家提供了很多代码,最终选择从C51 代码上修改:

#include &lt;SPI.h>
//画笔颜色
#define WHITE            0xFFFF
#define BLACK            0x0000   
#define BLUE             0x001F  
#define BRED             0XF81F
#define GRED             0XFFE0
#define GBLUE            0X07FF
#define RED              0xF800
#define MAGENTA          0xF81F
#define GREEN            0x07E0
#define CYAN             0x7FFF
#define YELLOW           0xFFE0
#define BROWN            0XBC40 //棕色
#define BRRED            0XFC07 //棕红色
#define GRAY             0X8430 //灰色
#define DARKBLUE         0X01CF //深蓝色
#define LIGHTBLUE        0X7D7C //浅蓝色  
#define GRAYBLUE         0X5458 //灰蓝色
#define LIGHTGREEN       0X841F //浅绿色
#define LGRAY            0XC618 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)

#define TFT_DC D9
#define TFT_RST D2
#define TFT_CS D10

#define LCD_RES_Clr()  digitalWrite(TFT_RST,LOW)
#define LCD_RES_Set()  digitalWrite(TFT_RST,HIGH)

#define LCD_DC_Clr()  digitalWrite(TFT_DC,LOW)
#define LCD_DC_Set()  digitalWrite(TFT_DC,HIGH)

#define u16 word
#define delay_ms delay
#define LCD_W 240
#define LCD_H 240

#if defined (SPI_HAS_TRANSACTION)
  static SPISettings mySPISettings;
#endif

/******************************************************************************
      函数说明:LCD写入命令
      入口数据:dat 写入的命令
      返回值:  无
******************************************************************************/
void LCD_WR_REG(byte c)
{
  LCD_DC_Clr();//写命令
  #if defined (SPI_HAS_TRANSACTION)
      SPI.begin();
      SPI.beginTransaction(mySPISettings);
      SPI.transfer(c);
      SPI.endTransaction();
  #endif
  LCD_DC_Set();
}
/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
    #if defined (SPI_HAS_TRANSACTION)
      SPI.begin();
      SPI.beginTransaction(mySPISettings);
      SPI.transfer(dat>>8);
      SPI.transfer(dat);
      SPI.endTransaction();
  #endif
}
/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA8(byte c)
{
  #if defined (SPI_HAS_TRANSACTION)
      SPI.begin();
      SPI.beginTransaction(mySPISettings);
      SPI.transfer(c);
      SPI.endTransaction();
  #endif
}

void LCD_Init(void)
{
  
  LCD_RES_Clr();//复位
  delay_ms(100);
  LCD_RES_Set();
  delay_ms(100);
  
  LCD_WR_REG(0xEF);
  LCD_WR_REG(0xEB);
  LCD_WR_DATA8(0x14); 
  
  LCD_WR_REG(0xFE);      
  LCD_WR_REG(0xEF); 

  LCD_WR_REG(0xEB); 
  LCD_WR_DATA8(0x14); 

  LCD_WR_REG(0x84);     
  LCD_WR_DATA8(0x40); 

  LCD_WR_REG(0x85);     
  LCD_WR_DATA8(0xFF); 

  LCD_WR_REG(0x86);     
  LCD_WR_DATA8(0xFF); 

  LCD_WR_REG(0x87);     
  LCD_WR_DATA8(0xFF);

  LCD_WR_REG(0x88);     
  LCD_WR_DATA8(0x0A);

  LCD_WR_REG(0x89);     
  LCD_WR_DATA8(0x21); 

  LCD_WR_REG(0x8A);     
  LCD_WR_DATA8(0x00); 

  LCD_WR_REG(0x8B);     
  LCD_WR_DATA8(0x80); 

  LCD_WR_REG(0x8C);     
  LCD_WR_DATA8(0x01); 

  LCD_WR_REG(0x8D);     
  LCD_WR_DATA8(0x01); 

  LCD_WR_REG(0x8E);     
  LCD_WR_DATA8(0xFF); 

  LCD_WR_REG(0x8F);     
  LCD_WR_DATA8(0xFF); 


  LCD_WR_REG(0xB6);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x20);

  LCD_WR_REG(0x36);
  LCD_WR_DATA8(0x08);


  LCD_WR_REG(0x3A);     
  LCD_WR_DATA8(0x05); 


  LCD_WR_REG(0x90);     
  LCD_WR_DATA8(0x08);
  LCD_WR_DATA8(0x08);
  LCD_WR_DATA8(0x08);
  LCD_WR_DATA8(0x08); 

  LCD_WR_REG(0xBD);     
  LCD_WR_DATA8(0x06);
  
  LCD_WR_REG(0xBC);     
  LCD_WR_DATA8(0x00); 

  LCD_WR_REG(0xFF);     
  LCD_WR_DATA8(0x60);
  LCD_WR_DATA8(0x01);
  LCD_WR_DATA8(0x04);

  LCD_WR_REG(0xC3);     
  LCD_WR_DATA8(0x13);
  LCD_WR_REG(0xC4);     
  LCD_WR_DATA8(0x13);

  LCD_WR_REG(0xC9);     
  LCD_WR_DATA8(0x22);

  LCD_WR_REG(0xBE);     
  LCD_WR_DATA8(0x11); 

  LCD_WR_REG(0xE1);     
  LCD_WR_DATA8(0x10);
  LCD_WR_DATA8(0x0E);

  LCD_WR_REG(0xDF);     
  LCD_WR_DATA8(0x21);
  LCD_WR_DATA8(0x0c);
  LCD_WR_DATA8(0x02);

  LCD_WR_REG(0xF0);   
  LCD_WR_DATA8(0x45);
  LCD_WR_DATA8(0x09);
  LCD_WR_DATA8(0x08);
  LCD_WR_DATA8(0x08);
  LCD_WR_DATA8(0x26);
  LCD_WR_DATA8(0x2A);

  LCD_WR_REG(0xF1);    
  LCD_WR_DATA8(0x43);
  LCD_WR_DATA8(0x70);
  LCD_WR_DATA8(0x72);
  LCD_WR_DATA8(0x36);
  LCD_WR_DATA8(0x37);  
  LCD_WR_DATA8(0x6F);


  LCD_WR_REG(0xF2);   
  LCD_WR_DATA8(0x45);
  LCD_WR_DATA8(0x09);
  LCD_WR_DATA8(0x08);
  LCD_WR_DATA8(0x08);
  LCD_WR_DATA8(0x26);
  LCD_WR_DATA8(0x2A);

  LCD_WR_REG(0xF3);   
  LCD_WR_DATA8(0x43);
  LCD_WR_DATA8(0x70);
  LCD_WR_DATA8(0x72);
  LCD_WR_DATA8(0x36);
  LCD_WR_DATA8(0x37); 
  LCD_WR_DATA8(0x6F);

  LCD_WR_REG(0xED); 
  LCD_WR_DATA8(0x1B); 
  LCD_WR_DATA8(0x0B); 

  LCD_WR_REG(0xAE);     
  LCD_WR_DATA8(0x77);
  
  LCD_WR_REG(0xCD);     
  LCD_WR_DATA8(0x63);   


  LCD_WR_REG(0x70);     
  LCD_WR_DATA8(0x07);
  LCD_WR_DATA8(0x07);
  LCD_WR_DATA8(0x04);
  LCD_WR_DATA8(0x0E); 
  LCD_WR_DATA8(0x0F); 
  LCD_WR_DATA8(0x09);
  LCD_WR_DATA8(0x07);
  LCD_WR_DATA8(0x08);
  LCD_WR_DATA8(0x03);

  LCD_WR_REG(0xE8);     
  LCD_WR_DATA8(0x34);

  LCD_WR_REG(0x62);     
  LCD_WR_DATA8(0x18);
  LCD_WR_DATA8(0x0D);
  LCD_WR_DATA8(0x71);
  LCD_WR_DATA8(0xED);
  LCD_WR_DATA8(0x70); 
  LCD_WR_DATA8(0x70);
  LCD_WR_DATA8(0x18);
  LCD_WR_DATA8(0x0F);
  LCD_WR_DATA8(0x71);
  LCD_WR_DATA8(0xEF);
  LCD_WR_DATA8(0x70); 
  LCD_WR_DATA8(0x70);

  LCD_WR_REG(0x63);     
  LCD_WR_DATA8(0x18);
  LCD_WR_DATA8(0x11);
  LCD_WR_DATA8(0x71);
  LCD_WR_DATA8(0xF1);
  LCD_WR_DATA8(0x70); 
  LCD_WR_DATA8(0x70);
  LCD_WR_DATA8(0x18);
  LCD_WR_DATA8(0x13);
  LCD_WR_DATA8(0x71);
  LCD_WR_DATA8(0xF3);
  LCD_WR_DATA8(0x70); 
  LCD_WR_DATA8(0x70);

  LCD_WR_REG(0x64);     
  LCD_WR_DATA8(0x28);
  LCD_WR_DATA8(0x29);
  LCD_WR_DATA8(0xF1);
  LCD_WR_DATA8(0x01);
  LCD_WR_DATA8(0xF1);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x07);

  LCD_WR_REG(0x66);     
  LCD_WR_DATA8(0x3C);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0xCD);
  LCD_WR_DATA8(0x67);
  LCD_WR_DATA8(0x45);
  LCD_WR_DATA8(0x45);
  LCD_WR_DATA8(0x10);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x00);

  LCD_WR_REG(0x67);     
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x3C);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x00);
  LCD_WR_DATA8(0x01);
  LCD_WR_DATA8(0x54);
  LCD_WR_DATA8(0x10);
  LCD_WR_DATA8(0x32);
  LCD_WR_DATA8(0x98);

  LCD_WR_REG(0x74);     
  LCD_WR_DATA8(0x10); 
  LCD_WR_DATA8(0x85); 
  LCD_WR_DATA8(0x80);
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0x00); 
  LCD_WR_DATA8(0x4E);
  LCD_WR_DATA8(0x00);         
  
  LCD_WR_REG(0x98);     
  LCD_WR_DATA8(0x3e);
  LCD_WR_DATA8(0x07);

  LCD_WR_REG(0x35); 
  LCD_WR_REG(0x21);

  LCD_WR_REG(0x11);
  delay_ms(120);
  LCD_WR_REG(0x29);
  delay_ms(20);
} 

/******************************************************************************
      函数说明:设置起始和结束地址
      入口数据:x1,x2 设置列的起始和结束地址
                y1,y2 设置行的起始和结束地址
      返回值:  无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
    LCD_WR_REG(0x2a);//列地址设置
    LCD_WR_DATA(x1);
    LCD_WR_DATA(x2);
    LCD_WR_REG(0x2b);//行地址设置
    LCD_WR_DATA(y1);
    LCD_WR_DATA(y2);
    LCD_WR_REG(0x2c);//储存器写
}

/******************************************************************************
      函数说明:在指定区域填充颜色
      入口数据:xsta,ysta   起始坐标
                xend,yend   终止坐标
                color       要填充的颜色
      返回值:  无
******************************************************************************/
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
{          
  u16 i,j; 
  LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
  for(i=ysta;i&lt;yend;i++)
  {                               
    for(j=xsta;j&lt;xend;j++)
    {
      LCD_WR_DATA(color);
    }
  }                   
}
void setup() {
  pinMode(TFT_CS,OUTPUT);
  digitalWrite(TFT_CS,LOW);
  pinMode(TFT_DC,OUTPUT);
    pinMode(TFT_RST,OUTPUT);

  mySPISettings = SPISettings(1000000, MSBFIRST, SPI_MODE0);
  LCD_Init();

}

void loop() {
  LCD_Fill(0,0,LCD_W,LCD_H,BLUE);
  LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
  LCD_Fill(0,0,LCD_W,LCD_H,BRED);
  LCD_Fill(0,0,LCD_W,LCD_H,GRED);
  LCD_Fill(0,0,LCD_W,LCD_H,RED);
  LCD_Fill(0,0,LCD_W,LCD_H,MAGENTA);
  LCD_Fill(0,0,LCD_W,LCD_H,GREEN);
  LCD_Fill(0,0,LCD_W,LCD_H,CYAN);     
}

测试的内容是不断让屏幕变换颜色:

FillScreen 测试

Windows 版本对照表

来自 https://docs.microsoft.com/zh-cn/windows/release-information/

目前常见的版本有 19H1(1903) 19H2(1909) 20H1(2004) 20H1(。

所有的日期都按照 ISO 8601 格式列出:YYYY-MM-DD)上次更新时间: 2021-01-04

半年频道

Version服务选项上市日期OS build最后修订日期终止服务:家庭版、教育版、专业教育版、专业工作站版和 IoT 核心版服务终止日期:企业版、教育版和 IoT 企业版
20H2半年频道2020-10-2019042.6852020-12-082022-05-102023-05-09Microsoft 建议使用
2004半年频道2020-05-2719041.6852020-12-082021-12-142021-12-14
1909半年频道2019-11-1218363.12562020-12-082021-05-112022-05-10
1809半年频道2019-03-2817763.16372020-12-08服务终止2021-05-11
1809半年频道(定向)2018-11-1317763.16372020-12-08服务终止2021-05-11
1803半年频道2018-07-1017134.19022020-12-08服务终止2021-05-11
1803半年频道(定向)2018-04-3017134.19022020-12-08服务终止2021-05-11

下面是2个已经终止的版本

Version服务选项上市日期OS build最后修订日期终止服务:家庭版、教育版、专业教育版、专业工作站版和 IoT 核心版服务终止日期:企业版、教育版和 IoT 企业版
1709半年频道2018-01-1816299.19372020-06-18服务终止2020-10-13
1709半年频道(定向)2017-10-1716299.19372020-06-18服务终止2020-10-13

企业版和 IoT 企业版 LTSB/LTSC 版本

Version服务选项上市日期OS build最后修订日期主要支持结束日期外延支持结束日期
1809长期服务频道 (LTSC)2018-11-1317763.12942020-06-162024-01-092029-01-09
1607长期服务分支 (LTSB)2016-08-0214393.37552020-06-182021-10-122026-10-13
1507 (RTM)长期服务分支 (LTSB)2015-07-2910240.186092020-06-182020-10-132025-10-14

Windows 10 发行历史记录

在 Windows 10 更新历史记录上了解有关 Windows 10 更新内容的更多信息。


 Version 20H2 (OS build 19042)

要将设备运行的 Windows 10 版本 2004 升级为 Windows 10 版本 20H2,可通过 更新支持包 来加速此流程。有关详细信息,请参阅KB4562830

OS build上市日期服务选项知识库文章
19042.6852020-12-08半年频道KB 4592438
19042.6622020-11-30半年频道KB 4586853
19042.6312020-11-19半年频道KB 4594440
19042.6302020-11-10半年频道KB 4586781
19042.6102020-10-29半年频道KB 4580364
19042.5722020-10-20半年频道

 Version 2004 (OS build 19041)

OS build上市日期服务选项知识库文章
19041.3312020-06-18半年频道KB 4567523
19041.3292020-06-09半年频道KB 4557957
19041.2642020-05-27半年频道

 Version 1909 (OS build 18363)

要将设备运行的 Windows 10 版本 1903 升级为 Windows 10 版本 1909,可通过更新支持包来加速此流程。有关详细信息,请参阅KB4517245

OS build上市日期服务选项知识库文章
18363.9042020-06-16半年频道KB 4567512
18363.9002020-06-09半年频道KB 4560960
18363.8362020-05-12半年频道KB 4556799
18363.8152020-04-21半年频道KB 4550945
18363.7782020-04-14半年频道KB 4549951
18363.7532020-03-30半年频道KB 4554364
18363.7522020-03-24半年频道KB 4541335
18363.7202020-03-12半年频道KB 4551762
18363.7192020-03-10半年频道KB 4540673
18363.6932020-02-27半年频道KB 4535996
18363.6572020-02-11半年频道KB 4532693
18363.6282020-01-28半年频道KB 4532695
18363.5922020-01-14半年频道KB 4528760
18363.5352019-12-10半年频道KB 4530684
18363.4762019-11-12半年频道KB 4524570

 Version 1903 (OS build 18362)

OS build上市日期服务选项知识库文章
18362.9042020-06-16半年频道KB 4567512
18362.9002020-06-09半年频道KB 4560960
18362.8362020-05-12半年频道KB 4556799
18362.8152020-04-21半年频道KB 4550945
18362.7782020-04-14半年频道KB 4549951
18362.7532020-03-30半年频道KB 4554364
18362.7522020-03-24半年频道KB 4541335
18362.7202020-03-12半年频道KB 4551762
18362.7192020-03-10半年频道KB 4540673
18362.6932020-02-27半年频道KB 4535996
18362.6572020-02-11半年频道KB 4532693
18362.6282020-01-28半年频道KB 4532695
18362.5922020-01-14半年频道KB 4528760
18362.5352019-12-10半年频道KB 4530684
18362.4762019-11-12半年频道KB 4524570
18362.4492019-10-24半年频道KB 4522355
18362.4182019-10-08半年频道KB 4517389
18362.3882019-10-03半年频道KB 4524147
18362.3872019-09-26半年频道KB 4517211
18362.3572019-09-23半年频道KB 4522016
18362.3562019-09-10半年频道KB 4515384
18362.3292019-08-30半年频道KB 4512941
18362.2952019-08-13半年频道KB 4512508
18362.2672019-07-26半年频道KB 4505903
18362.2392019-07-09半年频道KB 4507453
18362.2072019-06-27半年频道KB 4501375
18362.1752019-06-11半年频道KB 4503293
18362.1452019-05-29半年频道KB 4497935
18362.1162019-05-21半年频道KB 4505057

 Version 1809 (OS build 17763)

OS build上市日期服务选项知识库文章
17763.12942020-06-16半年频道 • 半年频道(定向) • LTSCKB 4567513
17763.12822020-06-09半年频道 • 半年频道(定向) • LTSCKB 4561608
17763.12172020-05-12半年频道 • 半年频道(定向) • LTSCKB 4551853
17763.11922020-04-21半年频道 • 半年频道(定向) • LTSCKB 4550969
17763.11582020-04-14半年频道 • 半年频道(定向) • LTSCKB 4549949
17763.11322020-03-30半年频道 • 半年频道(定向) • LTSCKB 4554354
17763.11312020-03-17半年频道 • 半年频道(定向) • LTSCKB 4541331
17763.10982020-03-10半年频道 • 半年频道(定向) • LTSCKB 4538461
17763.10752020-02-25半年频道 • 半年频道(定向) • LTSCKB 4537818
17763.10392020-02-11半年频道 • 半年频道(定向) • LTSCKB 4532691
17763.10122020-01-23半年频道 • 半年频道(定向) • LTSCKB 4534321
17763.9732020-01-14半年频道 • 半年频道(定向) • LTSCKB 4534273
17763.9142019-12-10半年频道 • 半年频道(定向) • LTSCKB 4530715
17763.8642019-11-12半年频道 • 半年频道(定向) • LTSCKB 4523205
17763.8322019-10-15半年频道 • 半年频道(定向) • LTSCKB 4520062
17763.8052019-10-08半年频道 • 半年频道(定向) • LTSCKB 4519338
17763.7752019-10-03半年频道 • 半年频道(定向) • LTSCKB 4524148
17763.7742019-09-24半年频道 • 半年频道(定向) • LTSCKB 4516077
17763.7402019-09-23半年频道 • 半年频道(定向) • LTSCKB 4522015
17763.7372019-09-10半年频道 • 半年频道(定向) • LTSCKB 4512578
17763.7202019-08-17半年频道 • 半年频道(定向) • LTSCKB 4512534
17763.6782019-08-13半年频道 • 半年频道(定向) • LTSCKB 4511553
17763.6522019-07-22半年频道 • 半年频道(定向) • LTSCKB 4505658
17763.6152019-07-09半年频道 • 半年频道(定向) • LTSCKB 4507469
17763.5932019-06-26半年频道 • 半年频道(定向) • LTSCKB 4509479
17763.5922019-06-18半年频道 • 半年频道(定向) • LTSCKB 4501371
17763.5572019-06-11半年频道 • 半年频道(定向) • LTSCKB 4503327
17763.5292019-05-21半年频道 • 半年频道(定向) • LTSCKB 4497934
17763.5042019-05-19半年频道 • 半年频道(定向) • LTSCKB 4505056
17763.5032019-05-14半年频道 • 半年频道(定向) • LTSCKB 4494441
17763.4752019-05-03半年频道 • 半年频道(定向) • LTSCKB 4495667
17763.4392019-05-01半年频道 • 半年频道(定向) • LTSCKB 4501835
17763.4372019-04-09半年频道 • 半年频道(定向) • LTSCKB 4493509
17763.4042019-04-02半年频道 • 半年频道(定向) • LTSCKB 4490481
17763.3792019-03-12半年频道 • 半年频道(定向) • LTSCKB 4489899
17763.3482019-03-01半年频道(定向) • LTSCKB 4482887
17763.3162019-02-12半年频道(定向) • LTSCKB 4487044
17763.2922019-01-22半年频道(定向) • LTSCKB 4476976
17763.2532019-01-08半年频道(定向) • LTSCKB 4480116
17763.1952018-12-19半年频道(定向) • LTSCKB 4483235
17763.1942018-12-11半年频道(定向) • LTSCKB 4471332
17763.1682018-12-05半年频道(定向) • LTSCKB 4469342
17763.1342018-11-13半年频道(定向) • LTSCKB 4467708
17763.1072018-11-13半年频道(定向) • LTSCKB 4464455
17763.552018-10-09半年频道(定向) • LTSCKB 4464330
17763.12018-10-02半年频道(定向) • LTSC

 Version 1803 (OS build 17134)

OS build上市日期服务选项知识库文章
17134.15532020-06-16半年频道 • 半年频道(定向)KB 4567514
17134.15502020-06-09半年频道 • 半年频道(定向)KB 4561621
17134.14882020-05-12半年频道 • 半年频道(定向)KB 4556807
17134.14562020-04-21半年频道 • 半年频道(定向)KB 4550944
17134.14252020-04-14半年频道 • 半年频道(定向)KB 4550922
17134.14012020-03-30半年频道 • 半年频道(定向)KB 4554349
17134.13992020-03-17半年频道 • 半年频道(定向)KB 4541333
17134.13652020-03-10半年频道 • 半年频道(定向)KB 4540689
17134.13452020-02-25半年频道 • 半年频道(定向)KB 4537795
17134.13042020-02-11半年频道 • 半年频道(定向)KB 4537762
17134.12762020-01-23半年频道 • 半年频道(定向)KB 4534308
17134.12462020-01-14半年频道 • 半年频道(定向)KB 4534293
17134.11842019-12-10半年频道 • 半年频道(定向)KB 4530717
17134.11302019-11-12半年频道 • 半年频道(定向)KB 4525237
17134.10992019-10-15半年频道 • 半年频道(定向)KB 4519978
17134.10692019-10-08半年频道 • 半年频道(定向)KB 4520008
17134.10402019-10-03半年频道 • 半年频道(定向)KB 4524149
17134.10392019-09-24半年频道 • 半年频道(定向)KB 4516045
17134.10092019-09-23半年频道 • 半年频道(定向)KB 4522014
17134.10062019-09-10半年频道 • 半年频道(定向)KB 4516058
17134.9842019-08-19半年频道 • 半年频道(定向)KB 4512509
17134.9502019-08-13半年频道 • 半年频道(定向)KB 4512501
17134.9152019-07-16半年频道 • 半年频道(定向)KB 4507466
17134.8852019-07-09半年频道 • 半年频道(定向)KB 4507435
17134.8602019-06-26半年频道 • 半年频道(定向)KB 4509478
17134.8582019-06-18半年频道 • 半年频道(定向)KB 4503288
17134.8292019-06-11半年频道 • 半年频道(定向)KB 4503286
17134.7992019-05-21半年频道 • 半年频道(定向)KB 4499183
17134.7662019-05-19半年频道 • 半年频道(定向)KB 4505064
17134.7652019-05-14半年频道 • 半年频道(定向)KB 4499167
17134.7532019-04-25半年频道 • 半年频道(定向)KB 4493437
17134.7062019-04-09半年频道 • 半年频道(定向)KB 4493464
17134.6772019-03-19半年频道 • 半年频道(定向)KB 4489894
17134.6482019-03-12半年频道 • 半年频道(定向)KB 4489868
17134.6192019-02-19半年频道 • 半年频道(定向)KB 4487029
17134.5902019-02-12半年频道 • 半年频道(定向)KB 4487017
17134.5562019-01-15半年频道 • 半年频道(定向)KB 4480976
17134.5232019-01-08半年频道 • 半年频道(定向)KB 4480966
17134.4722018-12-19半年频道 • 半年频道(定向)KB 4483234
17134.4712018-12-11半年频道 • 半年频道(定向)KB 4471324
17134.4412018-11-27半年频道 • 半年频道(定向)KB 4467682
17134.4072018-11-13半年频道 • 半年频道(定向)KB 4467702
17134.3762018-10-24半年频道 • 半年频道(定向)KB 4462933
17134.3452018-10-09半年频道 • 半年频道(定向)KB 4462919
17134.3202018-09-26半年频道 • 半年频道(定向)KB 4458469
17134.2862018-09-17半年频道 • 半年频道(定向)KB 4464218
17134.2852018-09-11半年频道 • 半年频道(定向)KB 4457128
17134.2542018-08-30半年频道 • 半年频道(定向)KB 4346783
17134.2282018-08-14半年频道 • 半年频道(定向)KB 4343909
17134.1912018-07-24半年频道 • 半年频道(定向)KB 4340917
17134.1672018-07-16半年频道 • 半年频道(定向)KB 4345421
17134.1652018-07-10半年频道 • 半年频道(定向)KB 4338819
17134.1372018-06-26半年频道(定向)KB 4284848
17134.1122018-06-12半年频道(定向)KB 4284835
17134.832018-06-05半年频道(定向)KB 4338548
17134.812018-05-23半年频道(定向)KB 4100403
17134.482018-05-08半年频道(定向)KB 4103721

 Version 1709 (OS build 16299)

OS build上市日期服务选项知识库文章
16299.19372020-06-18半年频道 • 半年频道(定向)KB 4567515
16299.19322020-06-09半年频道 • 半年频道(定向)KB 4561602
16299.18682020-05-12半年频道 • 半年频道(定向)KB 4556812
16299.18062020-04-14半年频道 • 半年频道(定向)KB 4550927
16299.17762020-03-30半年频道 • 半年频道(定向)KB 4554342
16299.17752020-03-17半年频道 • 半年频道(定向)KB 4541330
16299.17472020-03-10半年频道 • 半年频道(定向)KB 4540681
16299.17172020-02-25半年频道 • 半年频道(定向)KB 4537816
16299.16862020-02-11半年频道 • 半年频道(定向)KB 4537789
16299.16542020-01-23半年频道 • 半年频道(定向)KB 4534318
16299.16252020-01-14半年频道 • 半年频道(定向)KB 4534276
16299.15652019-12-10半年频道 • 半年频道(定向)KB 4530714
16299.15082019-11-12半年频道 • 半年频道(定向)KB 4525241
16299.14812019-10-15半年频道 • 半年频道(定向)KB 4520006
16299.14512019-10-08半年频道 • 半年频道(定向)KB 4520004
16299.14212019-10-03半年频道 • 半年频道(定向)KB 4524150
16299.14202019-09-24半年频道 • 半年频道(定向)KB 4516071
16299.13922019-09-23半年频道 • 半年频道(定向)KB 4522012
16299.13872019-09-10半年频道 • 半年频道(定向)KB 4516066
16299.13652019-08-16半年频道 • 半年频道(定向)KB 4512494
16299.13312019-08-13半年频道 • 半年频道(定向)KB 4512516
16299.12962019-07-16半年频道 • 半年频道(定向)KB 4507465
16299.12682019-07-09半年频道 • 半年频道(定向)KB 4507455
16299.12392019-06-26半年频道 • 半年频道(定向)KB 4509477
16299.12372019-06-18半年频道 • 半年频道(定向)KB 4503281
16299.12172019-06-11半年频道 • 半年频道(定向)KB 4503284
16299.11822019-05-28半年频道 • 半年频道(定向)KB 4499147
16299.11502019-05-19半年频道 • 半年频道(定向)KB 4505062
16299.11462019-05-14半年频道 • 半年频道(定向)KB 4499179
16299.11272019-04-25半年频道 • 半年频道(定向)KB 4493440
16299.10872019-04-09半年频道 • 半年频道(定向)KB 4493441
16299.10592019-03-19半年频道 • 半年频道(定向)KB 4489890
16299.10292019-03-12半年频道 • 半年频道(定向)KB 4489886
16299.10042019-02-19半年频道 • 半年频道(定向)KB 4487021
16299.9672019-02-12半年频道 • 半年频道(定向)KB 4486996
16299.9362019-01-15半年频道 • 半年频道(定向)KB 4480967
16299.9042019-01-08半年频道 • 半年频道(定向)KB 4480978
16299.8472018-12-19半年频道 • 半年频道(定向)KB 4483232
16299.8462018-12-11半年频道 • 半年频道(定向)KB 4471329
16299.8202018-11-27半年频道 • 半年频道(定向)KB 4467681
16299.7852018-11-13半年频道 • 半年频道(定向)KB 4467686
16299.7552018-10-18半年频道 • 半年频道(定向)KB 4462932
16299.7262018-10-09半年频道 • 半年频道(定向)KB 4462918
16299.6992018-09-26半年频道 • 半年频道(定向)KB 4457136
16299.6662018-09-17半年频道 • 半年频道(定向)KB 4464217
16299.6652018-09-11半年频道 • 半年频道(定向)KB 4457142
16299.6372018-08-30半年频道 • 半年频道(定向)KB 4343893
16299.6112018-08-14半年频道 • 半年频道(定向)KB 4343897
16299.5792018-07-24半年频道 • 半年频道(定向)KB 4338817
16299.5512018-07-16半年频道 • 半年频道(定向)KB 4345420
16299.5472018-07-10半年频道 • 半年频道(定向)KB 4338825
16299.5222018-06-21半年频道 • 半年频道(定向)KB 4284822
16299.4922018-06-12半年频道 • 半年频道(定向)KB 4284819
16299.4612018-05-21半年频道 • 半年频道(定向)KB 4103714
16299.4312018-05-08半年频道 • 半年频道(定向)KB 4103727
16299.4022018-04-23半年频道 • 半年频道(定向)KB 4093105
16299.3712018-04-10半年频道 • 半年频道(定向)KB 4093112
16299.3342018-03-22半年频道 • 半年频道(定向)KB 4089848
16299.3092018-03-13半年频道 • 半年频道(定向)KB 4088776
16299.2512018-03-05半年频道 • 半年频道(定向)KB 4090913
16299.2482018-02-13半年频道 • 半年频道(定向)KB 4074588
16299.2142018-01-31半年频道 • 半年频道(定向)KB 4058258
16299.2012018-01-18半年频道 • 半年频道(定向)KB 4073291
16299.1942018-01-17半年频道 • 半年频道(定向)KB 4073290
16299.1922018-01-03半年频道 • 半年频道(定向)KB 4056892
16299.1252017-12-12半年频道 • 半年频道(定向)KB 4054517
16299.982017-11-30半年频道(定向)KB 4051963
16299.642017-11-14半年频道(定向)KB 4048955
16299.192017-10-17半年频道(定向)KB 4043961

 Version 1703 (OS build 15063) – 服务终止

OS build上市日期服务选项知识库文章
15063.21082019-10-08半年频道 • CBKB 4520010
15063.20792019-10-03半年频道 • CBKB 4524151
15063.20782019-09-24半年频道 • CBKB 4516059
15063.20462019-09-23半年频道 • CBKB 4522011
15063.20452019-09-10半年频道 • CBKB 4516068
15063.20212019-08-17半年频道 • CBKB 4512474
15063.19882019-08-13半年频道 • CBKB 4512507
15063.19552019-07-16半年频道 • CBKB 4507467
15063.19282019-07-09半年频道 • CBKB 4507450
15063.18982019-06-26半年频道 • CBKB 4509476
15063.18972019-06-18半年频道 • CBKB 4503289
15063.18682019-06-11半年频道 • CBKB 4503279
15063.18392019-05-28半年频道 • CBKB 4499162
15063.18082019-05-19半年频道 • CBKB 4505055
15063.18052019-05-14半年频道 • CBKB 4499181
15063.17852019-05-02半年频道 • CBKB 4502112
15063.17842019-04-25半年频道 • CBKB 4493436
15063.17462019-04-09半年频道 • CBKB 4493474
15063.17162019-03-19半年频道 • CBKB 4489888
15063.16892019-03-12半年频道 • CBKB 4489871
15063.16592019-02-19半年频道 • CBKB 4487011
15063.16312019-02-12半年频道 • CBKB 4487020
15063.15962019-01-15半年频道 • CBKB 4480959
15063.15632019-01-08半年频道 • CBKB 4480973
15063.15082018-12-19半年频道 • CBKB 4483230
15063.15062018-12-11半年频道 • CBKB 4471327
15063.14782018-11-27半年频道 • CBKB 4467699
15063.14462018-11-13半年频道 • CBKB 4467696
15063.14182018-10-18半年频道 • CBKB 4462939
15063.13872018-10-09半年频道 • CBKB 4462937
15063.13562018-09-20半年频道 • CBKB 4457141
15063.13242018-09-11半年频道 • CBKB 4457138
15063.12922018-08-30半年频道 • CBKB 4343889
15063.12662018-08-14半年频道 • CBKB 4343885
15063.12352018-07-24半年频道 • CBKB 4338827
15063.12092018-07-16半年频道 • CBKB 4345419
15063.12062018-07-10半年频道 • CBKB 4338826
15063.11822018-06-21半年频道 • CBKB 4284830
15063.11552018-06-12半年频道 • CBKB 4284874
15063.11122018-05-17半年频道 • CBKB 4103722
15063.10882018-05-08半年频道 • CBKB 4103731
15063.10582018-04-17半年频道 • CBKB 4093117
15063.10292018-04-10半年频道 • CBKB 4093107
15063.9942018-03-22半年频道 • CBKB 4088891
15063.9662018-03-13半年频道 • CBKB 4088782
15063.9362018-03-08半年频道 • CBKB 4092077
15063.9362018-02-22半年频道 • CBKB 4077528
15063.9092018-02-13半年频道 • CBKB 4074592
15063.8772018-01-17半年频道 • CBKB 4057144
15063.8502018-01-03半年频道 • CBKB 4056891
15063.7862017-12-12半年频道 • CBKB 4053580
15063.7292017-11-22半年频道 • CBKB 4055254
15063.7262017-11-14半年频道 • CBKB 4048954
15063.6752017-11-02半年频道 • CBKB 4049370
15063.6742017-10-10半年频道 • CBKB 4041676
15063.6322017-09-25半年频道 • CBKB 4040724
15063.6082017-09-12半年频道 • CBKB 4038788
15063.5402017-08-08半年频道 • CBKB 4034674
15063.5022017-08-01半年频道 • CBKB 4032188
15063.4832017-07-11半年频道 • CBKB 4025342
15063.4472017-06-27CBKB 4022716
15063.4132017-06-13CBKB 4022725
15063.3322017-05-26CBKB 4020102
15063.2962017-05-09CBKB 4016871
15063.2502017-04-25CBKB 4016240
15063.1382017-04-11CBKB 4015583

 Version 1607 (OS build 14393)

OS build上市日期服务选项知识库文章
14393.37552020-06-18CBB • CB • LTSBKB 4567517
14393.37502020-06-09CBB • CB • LTSBKB 4561616
14393.36862020-05-12CBB • CB • LTSBKB 4556813
14393.36592020-04-21CBB • CB • LTSBKB 4550947
14393.36302020-04-14CBB • CB • LTSBKB 4550929
14393.35952020-03-17CBB • CB • LTSBKB 4541329
14393.35642020-03-10CBB • CB • LTSBKB 4540670
14393.35422020-02-25CBB • CB • LTSBKB 4537806
14393.35042020-02-11CBB • CB • LTSBKB 4537764
14393.34742020-01-23CBB • CB • LTSBKB 4534307
14393.34432020-01-14CBB • CB • LTSBKB 4534271
14393.33842019-12-10CBB • CB • LTSBKB 4530689
14393.33262019-11-12CBB • CB • LTSBKB 4525236
14393.33002019-10-15CBB • CB • LTSBKB 4519979
14393.32742019-10-08CBB • CB • LTSBKB 4519998
14393.32432019-10-03CBB • CB • LTSBKB 4524152
14393.32422019-09-24CBB • CB • LTSBKB 4516061
14393.32062019-09-23CBB • CB • LTSBKB 4522010
14393.32042019-09-10CBB • CB • LTSBKB 4516044
14393.31812019-08-17CBB • CB • LTSBKB 4512495
14393.31442019-08-13CBB • CB • LTSBKB 4512517
14393.31152019-07-16CBB • CB • LTSBKB 4507459
14393.30852019-07-09CBB • CB • LTSBKB 4507460
14393.30562019-06-27CBB • CB • LTSBKB 4509475
14393.30532019-06-18CBB • CB • LTSBKB 4503294
14393.30252019-06-11CBB • CB • LTSBKB 4503267
14393.29992019-05-23CBB • CB • LTSBKB 4499177
14393.29722019-05-19CBB • CB • LTSBKB 4505052
14393.29692019-05-14CBB • CB • LTSBKB 4494440
14393.29412019-04-25CBB • CB • LTSBKB 4493473
14393.29082019-04-25CBB • CB • LTSBKB 4499418
14393.29062019-04-09CBB • CB • LTSB

Step to UEFI (215)AudioPkg 测试

GitHub 上的John Davis开发出了能够在 UEFI Shell下播放声音的驱动AudioPkg。具体项目可以在 https://github.com/Goldfish64/AudioPkg 看到(从19年开始我就开始关注他的项目,但是一直没有实验成功。现在他这个项目完全 Move 到另外的项目中了)。偶然之间我发现需要将当前系统的 Audio 设置为 (非SST。区别上简单的说就是 Intel 做出来一个 HD-Audio 的标准,然后又改进出来另外一套称作 SST 的标准,在 SST中大量使用 DSP ,更节省 CPU 更节省电力。唯一的问题是相比前者外界不知道如何实现只能通过Intel 驱动来实现播放)。

AudioPkg在 EDK2 201903 下面使用 build -a X64 -p AudioPkg\AudioPkg.dsc 会遇到如下错误:

c:\buildbs\stable201903\AudioPkg\Platform\BootChimeDxe\BootChimeDxe.c(163): error C2220: warning treated as error - no 'object' file generated
c:\buildbs\stable201903\AudioPkg\Platform\BootChimeDxe\BootChimeDxe.c(163): warning C4244: 'function': conversion from 'UINTN' to 'UINT8', possible loss of data
c:\buildbs\stable201903\AudioPkg\Application\BootChimeCfg\BootChimeCfg.c(415): error C2220: warning treated as error - no 'object' file generated
c:\buildbs\stable201903\AudioPkg\Application\BootChimeCfg\BootChimeCfg.c(415): warning C4244: 'function': conversion from 'UINTN' to 'UINT8', possible loss of data
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Vc\bin\x86_amd64\cl.exe"' : return code '0x2'
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Vc\bin\x86_amd64\cl.exe"' : return code '0x2'

解决方法是通过在出现问题代码对应的INF 中添加编译开关忽略之:

[BuildOptions]
MSFT:*_*_X64_CC_FLAGS          = /wd4054 /wd4055 /wd4152

最终修改后的代码可以在这里下载:

编译后的 X64 EFI 可以在这里下载:

再次强调:如果你发现实体机Shell 下无法运行,很可能是因为 Setup 中选择了 Intel SST 导致的,请修改为非Intel SST 的项目。

测试的视频:

获得 ModernStandby ResumeTime 的方法

微软大力推广 MS的一个原因是这个功能能够让系统更快的从睡眠状态醒来,因此,需要有一种方法来测量这个时间。

在微软的网站上有介绍使用 Windows Performance Analyzer的方法【参考1】,这里用实例介绍一下。对于WPA 的安装,可以在【参考4】看到。

1.到 WPA 的安装目录下使用 wpr -start Power 开始记录

wpr 开始记录和停止记录的命令

2.使用 Power Button 让系统进入MS,推荐十五分钟以上,然后使用  wpr -stop MSA.etl 生成记录文件“msa.etl”

WPA 记录结果

3.双机打开这个文件后,展开 System Activitiy,在右侧寻找 “Microsoft-Windows-PDC”项目:

WPA 查看Microsoft-Windows-PDC

4.在下面可以找到 “ExitFromConnectedStandbyStart”和 “ExitFromConnectedStandbEnd ” 两项:

“ExitFromConnectedStandbyStart”和 “ExitFromConnectedStandbEnd ”

5.其中给出的时间差值就是 Resume 花费的时间,这里是 1967.822568100 – 1967.029685499=0.792882601秒。

差值就是我们需要的 Resume time
  1. https://docs.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-resume-performance
  2. https://docs.microsoft.com/en-us/windows-hardware/design/device-experiences/using-windows-performance-analyzer-to-analyze-modern-standby-issues#capture-a-wpa-trace
  3. https://docs.microsoft.com/en-us/windows-hardware/design/device-experiences/modern-standby-wi-fi-connected-scenarios
  4. http://www.lab-z.com/wpainst/