]> git.proxmox.com Git - mirror_edk2.git/blob - QuarkPlatformPkg/Readme.md
aa9d9856bd160cd38510c8e491d33db46c369313
[mirror_edk2.git] / QuarkPlatformPkg / Readme.md
1 # **EDK II firmware for Intel(R) Quark SoC X1000 based platforms**
2
3 ## **Features**
4 * UEFI firmware image with ability to enable/disable major features such as
5 - Logging
6 - Source level debug using [Intel(R) UEFI Development Kit Debugger Tool](
7 https://firmware.intel.com/develop/intel-uefi-tools-and-utilities/intel-uefi-development-kit-debugger-tool)
8 - Boot Performance Measurements
9 - UEFI Secure Boot with Physical Presence
10 - TCG Measured Boot using TPM 1.2 hardware devices on I2C bus
11 * Minimal firmware image for initial power-on and debug
12 * UEFI Shell built into FLASH image
13 * UEFI Linux operating system boot support from Micro SD FLASH
14 * Hardware Support
15 - [Intel(R) Quark SoC X1000 CPU](
16 http://www.intel.com/content/www/us/en/embedded/products/quark/quark-x1000-datasheet.html)
17 - [Intel(R) Galileo Development Board](
18 http://www.intel.com/content/www/us/en/embedded/products/galileo/galileo-g1-datasheet.html)
19 - [Intel(R) Galileo Gen 2 Development Board](
20 http://www.intel.com/content/www/us/en/embedded/products/galileo/galileo-overview.html)
21 - HPET Timer
22 - Real Time Clock
23 * Major I/O Subsystems
24 - PCI including support for Mini PCI Express Cards
25 - USB using EHCI and OHCI host controllers
26 - Micro SD FLASH with FAT file system support
27 - Serial UART up to 921600 baud for console, logging, and debug
28 * ACPI Tables with ACPI S3 sleep state support
29 * SMBIOS Tables
30
31 ## **Windows Build Instructions**
32
33 ### Pre-requisites
34
35 * GIT client: Available from https://git-scm.com/downloads
36 * Microsoft Visual Studio.
37 - Visual Studio 2015 recommended and is used in the examples below.
38 * Microsoft Windows Driver Development Kit 3790.1830
39 - http://download.microsoft.com/download/9/0/f/90f019ac-8243-48d3-91cf-81fc4093ecfd/1830_usa_ddk.iso
40 - Mount ISO image
41 - Right click on ```x86\kitsetup.exe``` & choose **Run as administrator**
42 - Install to C:\WINDDK\3790.1830
43 - Uncheck all Component Groups
44 - Expand Build Environment Component
45 - Check Windows Driver Development Kit 16-bit Additional Build Tools
46 - Install
47 * ASL compiler: Available from http://www.acpica.org
48 - Install into ```C:\ASL``` to match default tools_def.txt configuration.
49 * Python 2.7: Available from http://www.python.org
50
51 Create a new directory for an EDK II WORKSPACE.
52
53 The code block below shows the GIT clone operations required to pull the EDK II
54 source tree and the edk2-non-osi repository that provides a binary file for the
55 Quark Remote Management Unit (RMU).
56
57 Next it sets environment variables that must be set before running
58 ```edksetup.bat```. Since content is being pulled from multiple repositories,
59 the EDK II [Multiple Workspace](
60 https://github.com/tianocore/tianocore.github.io/wiki/Multiple_Workspace)
61 feature is used.
62
63 Next, the EDK II BaseTools required to build firmware images are built.
64
65 Next, the ```edksetup.bat``` file is run to complete the initialization of an
66 EDK II build environment. Two example build commands are shown. The first one
67 in ```QuarkPlatformPlg/Quark.dsc``` builds a full UEFI firmware image that is
68 able to boot the built-in UEFI Shell and Linux from a micro SD FLASH card. The
69 second one in ```QuarkPlatformPkg/QuarkMin.dsc``` builds a minimal firmware
70 image that is useful for initial power-on and debug of new features.
71
72 ```cmd
73 git clone https://github.com/tianocore/edk2.git
74 git clone https://github.com/tianocore/edk2-non-osi.git
75
76 set PYTHON_HOME=c:\Python27
77 set WORKSPACE=%CD%
78 set PACKAGES_PATH=%WORKSPACE%\edk2;%WORKSPACE%\edk2-non-osi\Silicon\Intel
79 set EDK_TOOLS_PATH=%WORKSPACE%\edk2\BaseTools
80 cd %WORKSPACE%\edk2
81
82 BaseTools\toolsetup.bat Rebuild
83
84 edksetup.bat Rebuild
85
86 build -a IA32 -t VS2015x86 -p QuarkPlatformPkg/Quark.dsc
87 build -a IA32 -t VS2015x86 -p QuarkPlatformPkg/QuarkMin.dsc
88 ```
89
90 ## **Linux Build Instructions**
91
92 ### Pre-requisites
93
94 * GIT client
95 * GCC 4.9 compiler
96 * ASL compiler: Available from http://www.acpica.org.
97 * Python 2.7
98
99 Create a new directory for an EDK II WORKSPACE.
100
101 The code block below shows the GIT clone operations required to pull the EDK II
102 source tree and the edk2-non-osi repository that provides a binary file for the
103 Quark Remote Management Unit (RMU).
104
105 Next it sets environment variables that must be set before running
106 ```edksetup.bat```. Since content is being pulled from multiple repositories,
107 the EDK II [Multiple Workspace](
108 https://github.com/tianocore/tianocore.github.io/wiki/Multiple_Workspace)
109 feature is used.
110
111 Next, the EDK II BaseTools required to build firmware images are built.
112
113 Next, the ```edksetup.sh``` file is run to complete the initialization of an
114 EDK II build environment. Two example build commands are shown. The first one
115 in ```QuarkPlatformPlg/Quark.dsc``` builds a full UEFI firmware image that is
116 able to boot the built-in UEFI Shell and Linux from a micro SD FLASH card. The
117 second one in ```QuarkPlatformPkg/QuarkMin.dsc``` builds a minimal firmware
118 image that is useful for initial power-on and debug of new features.
119
120 ```sh
121 git clone https://github.com/tianocore/edk2.git
122 git clone https://github.com/tianocore/edk2-non-osi.git
123
124 export WORKSPACE=$PWD
125 export PACKAGES_PATH=$WORKSPACE/edk2:$WORKSPACE/edk2-non-osi/Silicon/Intel
126 export EDK_TOOLS_PATH=$WORKSPACE/edk2/BaseTools
127 cd $WORKSPACE/edk2
128
129 make -C BaseTools
130
131 . edksetup.sh BaseTools
132
133 build -a IA32 -t GCC49 -p QuarkPlatformPkg/Quark.dsc
134 build -a IA32 -t GCC49 -p QuarkPlatformPkg/QuarkMin.dsc
135 ```
136
137 ## **Build Features**
138
139 The table below contains a summary of the build flags to enable or disable
140 features on the build command line using ```-D``` flags.
141
142 | **Define Name** | **Default Value** | **Supported Values** |
143 | -------------------------- | ----------------- | -------------------- |
144 | ```GALILEO``` | GEN2 | GEN1, GEN2 |
145 | ```LOGGING``` | TRUE | TRUE, FALSE |
146 | ```SOURCE_DEBUG_ENABLE``` | FALSE | TRUE, FALSE |
147 | ```PERFORMANCE_ENABLE``` | FALSE | TRUE, FALSE |
148 | ```SECURE_BOOT_ENABLE``` | FALSE | TRUE, FALSE |
149 | ```MEASURED_BOOT_ENABLE``` | FALSE | TRUE, FALSE |
150 | ```TPM_12_HARDWARE``` | NONE | NONE, LPC, ATMEL_I2C, INFINEON_I2C |
151 | ```CAPSULE_ENABLE``` | FALSE | TRUE, FALSE |
152 | ```RECOVERY_ENABLE``` | FALSE | TRUE, FALSE |
153
154 * ```GALILEO``` - Used to specify the type of Intel(R) Galileo board type. The
155 default is ```GEN2``` for the [Intel(R) Galileo Gen 2 Development Board](
156 http://www.intel.com/content/www/us/en/embedded/products/galileo/galileo-overview.html).
157 The other supported value is ```GEN1``` for the [Intel(R) Galileo Development Board](
158 http://www.intel.com/content/www/us/en/embedded/products/galileo/galileo-g1-datasheet.html).
159 Add ```-D GALILEO=GEN1``` to the build command for [Intel(R) Galileo Development Board](
160 http://www.intel.com/content/www/us/en/embedded/products/galileo/galileo-g1-datasheet.html).
161
162 * ```LOGGING``` - Used to enable/disable logging messages from DEBUG() macros to
163 a serial UART. The default is TRUE for enabled when the BUILDTARGET is DEBUG
164 (```-b DEBUG```). The default is FALSE for disabled when the BUILDTARGET is
165 not DEBUG (e.g. ```-b RELEASE```). Add ```-D LOGGING``` to the build command
166 to force logging enabled. Add ```-D LOGGING=FALSE``` to force logging
167 disabled.
168
169 * ```SOURCE_DEBUG_ENABLE``` - Used to enable/disable source level debug using the
170 [Intel(R) UEFI Development Kit Debugger Tool](
171 https://firmware.intel.com/develop/intel-uefi-tools-and-utilities/intel-uefi-development-kit-debugger-tool).
172 The default is FALSE for disabled. Add ```-D SOURCE_DEBUG_ENABLE``` to the
173 build command line to enable source level debug.
174
175 * ```PERFORMANCE_ENABLE``` - Used to enable/disable boot performance measurement.
176 The default is FALSE for disabled. Add ```-D PERFORMANCE_ENABLE``` to the
177 build command line to enable boot performance measurement. When this feature
178 is enabled, both ```LOGGING``` and ```SOURCE_DEBUG_ENABLE``` are automatically
179 disabled so there is not boot time overhead from the serial UART for logging
180 messages or the debug agent.
181
182 * ```SECURE_BOOT_ENABLE``` - Used to enable/disable UEFI Secure Boot features.
183 The default is FALSE for disabled. Add ```-D SECURE_BOOT_ENABLE``` to the
184 build command line to enable UEFI Secure Boot features.
185
186 * ```MEASURED_BOOT_ENABLE``` - Used to enable/disable measurement of firmware
187 code and data into a TPM 1.2 hardware device. The default is FALSE for
188 disabled. Add ```-D MEASURED_BOOT_ENABLE``` to the build command line to
189 enable UEFI Secure Boot features.
190
191 * ```TPM_12_HARDWARE``` - Used to specify the type of TPM 1.2 hardware device
192 that is connected to the Galileo board. This define is valid if the measure
193 boot feature is enabled using ```-D MEASURED_BOOT_ENABLE```. The default is
194 NONE for no TPM 1.2 hardware device connected. Add ```-D TPM_12_HARDWARE=LPC```
195 for a TPM hardware device attached to an LPC bus (not supported on on Intel(R)
196 Quark SoC X1000). Add ```-D TPM_12_HARDWARE=ATMEL_I2C``` for an
197 [Atmel AT97SC3204T](http://www.atmel.com/devices/AT97SC3204T.aspx) or
198 [Atmel AT97SC3205T](http://www.atmel.com/images/atmel-8883s-tpm-at97sc3205t-datasheet-summary.pdf)
199 attached to the I2C bus of the Galileo Arduino header. Add
200 ```-D TPM_12_HARDWARE=INFINION_I2C``` for an [Infineon SLB9645](
201 http://www.infineon.com/dgdl/Infineon-TPM+SLB+9645-DS-v01_00-EN.pdf?fileId=5546d4625185e0e201518b83d0c63d7c)
202 attached to the I2C bus of the Galileo Arduino header. The ATMEL_I2C setting
203 has been tested with the [CryptoShield](https://www.sparkfun.com/products/13183)
204 available from [SparkFun](https://www.sparkfun.com/).
205
206 * ```CAPSULE_ENABLE``` - Used to enable/disable capsule update features.
207 The default is FALSE for disabled. Add ```-D CAPSULE_ENABLE``` to the
208 build command line to enable capsule update features.
209 The build process generate capsule update image - QUARKFIRMWAREUPDATECAPSULEFMPPKCS7.Cap.
210 The user need copy QUARKFIRMWAREUPDATECAPSULEFMPPKCS7.Cap and CapsuleApp.efi
211 to a storage media attached to the Quark Board.
212 Then the user can boot to shell and run ```CapsuleApp QUARKFIRMWAREUPDATECAPSULEFMPPKCS7.Cap```.
213 In next reboot, the system firmware is updated.
214
215 * ```RECOVERY_ENABLE``` - Used to enable/disable recovery features.
216 The default is FALSE for disabled. Add ```-D RECOVERY_ENABLE``` to the
217 build command line to enable recovery features.
218 The build process generates the recovery capsule image - QUARKREC.Cap.
219 Then the user need copy QUARKREC.Cap to a USB KEY, plug the USB KEY to the Quark Board.
220 In next boot, if a user runs ForceRecovery.efi in shell, or if a user presses the RESET button during power on, warm reset or REBOOT,
221 or if the FvMain is corrupted in flash, the system will boot into recovery mode.
222
223 ### **Example Build Commands**
224
225 Default build with logging enabled:
226
227 ```build -a IA32 -t VS2015x86 -p QuarkPlatformPkg/Quark.dsc```
228
229 Release build with logging disabled:
230
231 ```build -a IA32 -t VS2015x86 -p QuarkPlatformPkg/Quark.dsc -b RELEASE```
232
233 Enable source level debugging:
234
235 ```build -a IA32 -t VS2015x86 -p QuarkPlatformPkg/Quark.dsc -D SOURCE_DEBUG_ENABLE```
236
237 Enable boot performance metrics:
238
239 ```build -a IA32 -t VS2015x86 -p QuarkPlatformPkg/Quark.dsc -D PERFORMANCE_ENABLE```
240
241 Enable UEFI Secure Boot features:
242
243 ```build -a IA32 -t VS2015x86 -p QuarkPlatformPkg/Quark.dsc -D UEFI_SECURE_BOOT```
244
245 Enable UEFI Secure Boot and Measured Boot using Atmel I2C TPM hardware device:
246
247 ```build -a IA32 -t VS2015x86 -p QuarkPlatformPkg/Quark.dsc -D UEFI_SECURE_BOOT
248 -D MEASURED_BOOT_ENABLE -D TPM_12_HARDWARE=ATMEL_I2C```
249
250 ## **FLASH Update using DediProg SF100**
251
252 Once the sources have been downloaded, an EDK II build environment established,
253 and an EDK II firmware image has been built, the EDK II firmware image needs to
254 installed into the FLASH device on the target Galileo development board. One
255 way to do this is with the [Dediprog SF100 IC Programmer](
256 http://www.dediprog.com/pd/spi-flash-solution/SF100).
257
258 * Install the DediProg SF100 software.
259
260 * Connect the DediProg SF100 to the Galileo development board.
261
262 ![](https://github.com/tianocore/tianocore.github.io/wiki/Projects/QuarkPlatformPkg/Images/Dediprog.jpg)
263
264 * Make sure ```dpcmd.exe``` is in ```PATH```
265
266 ```PATH=%PATH%;"c:\Program Files (x86)\DediProg\SF100"```
267
268 * **NOTE**: It is recommended that the FLASH image that was shipped with the
269 Galileo development board be read and saved before updating FLASH image. The
270 command shown below read the FLASH image and saves it to the file
271 called ```GalileoOriginalFirmware.bin```.
272
273 ```dpcmd.exe -r GalileoOriginalFirmware.bin```
274
275 * Update FLASH image using either the DediProg SF100 GUI or ```dpcmd.exe```.
276 - Example update of Galileo firmware image when BUILDTARGET is DEBUG (default)
277
278 ```dpcmd.exe -u%WORKSPACE%\Build\Quark\DEBUG_VS2015x86\FV\QUARK.fd ```
279
280 - Example update of Galileo firmware image when BUILDTARGET is RELEASE
281 (```-b RELEASE```)
282
283 ```dpcmd.exe -u%WORKSPACE%\Build\Quark\RELEASE_VS2015x86\FV\QUARK.fd ```
284
285 ## **Setting up a Serial Console and Booting to UEFI Shell**
286
287 After the FLASH is updated on Galileo, a serial cable is connected between the
288 host system and the Galileo target. A serial terminal emulator (such as
289 [Tera Term](https://en.osdn.jp/projects/ttssh2/releases/)) can be used to see
290 the logging messages from DEBUG() macros and the serial console for the UEFI
291 Boot Manager, UEFI Shell, and operating system.
292
293 The default serial communication parameters for the Intel(R) Galileo Gen 2
294 Development Board is 921600,n,8,1 with no hardware flow control.
295
296 ![](https://github.com/tianocore/tianocore.github.io/wiki/Projects/QuarkPlatformPkg/Images/TeraTermSerialParameters.png)
297
298 The default serial communication parameters for the Intel(R) Galileo Development
299 Board is 461800,n,8,1 with no hardware flow control.
300
301 The following changes to the [Tera Term](https://en.osdn.jp/projects/ttssh2/releases/)
302 configuration files are recommended for UEFI serial console compatibility.
303 Some of the later use cases involve using the TCPIP mode, so some of these
304 recommendation apply to the TCPIP use cases.
305
306 * TERATERM.INI - Set terminal size to 80 x 25 and terminal settings to UTF8.
307
308 ![](https://github.com/tianocore/tianocore.github.io/wiki/Projects/QuarkPlatformPkg/Images/TeraTermTerminal.png)
309
310 * TERATERM.INI - Set font type to Terminal to support box drawing glyphs.
311
312 ![](https://github.com/tianocore/tianocore.github.io/wiki/Projects/QuarkPlatformPkg/Images/TeraTermFont.png)
313
314 * TERATERM.INI - Disable line mode to make TCPIP mode work like COM port mode.
315
316 ```ini
317 ; Line at a time mode
318 EnableLineMode=off
319 ```
320
321 * KEYBOARD.CNF - Disable VT function keys for F5..F10
322
323 ```ini
324 [VT function keys]
325 ;F6 key
326 ;F6=64
327 ;F7 key
328 ;F7=65
329 ;F8 key
330 ;F8=66
331 ;F9 key
332 ;F9=67
333 ;F10 key
334 ;F10=68
335 ```
336
337 * KEYBOARD.CNF - Disable X function keys for F1..F4
338
339 ```ini
340 [X function keys]
341 ; F1 key
342 XF1=off
343 ; F2 key
344 ;XF2=60
345 XF2=off
346 ; F3 key
347 ;XF3=61
348 XF3=off
349 ; F4 key
350 ;XF4=62
351 XF4=off
352 ; F5 key
353 ;XF5=63
354 ```
355
356 * KEYBOARD.CNF - Add UEFI serial console sequences for F1..F10
357
358 ```ini
359 [User keys]
360 User1=59,0,$1B[M
361 User2=60,0,$1B[N
362 User3=61,0,$1B[O
363 User4=62,0,$1B[P
364 User5=63,0,$1B[Q
365 User6=64,0,$1B[R
366 User7=65,0,$1B[S
367 User8=66,0,$1B[T
368 User9=67,0,$1B[U
369 User10=68,0,$1B[V
370 ```
371
372 Connect power adapter to Galileo development board, and the logging messages
373 should be seen, followed by 5 second countdown, followed by an automatic boot to
374 the built-in UEFI Shell.
375
376 ![](https://github.com/tianocore/tianocore.github.io/wiki/Projects/QuarkPlatformPkg/Images/UefiShell.png)
377
378 ## **Source Level Debug Using Intel(R) UEFI Development Kit Debugger Tool**
379
380 ### Pre-requisites
381
382 * Intel(R) UEFI Development Kit Debugger Tool User Manual for Ver 1.5 or higher:
383 Available from https://firmware.intel.com/develop/intel-uefi-tools-and-utilities/intel-uefi-development-kit-debugger-tool
384 * Intel(R) UEFI Development Kit Debugger Tool Ver 1.5 or higher: Available from
385 https://firmware.intel.com/develop/intel-uefi-tools-and-utilities/intel-uefi-development-kit-debugger-tool
386 * [Tera Term](https://en.osdn.jp/projects/ttssh2/releases/) or other serial
387 terminal emulator with TCPIP support
388
389 Follow instructions in Intel(R) UEFI Development Kit Debugger Tool User manual
390 to setup host system.
391
392 Build a firmware image with SOURCE_DEBUG_ENABLE enabled
393 (```-D SOURCE_DEBUG_ENABLE```). This will select the appropriate libraries,
394 debug agent, and PCDs for Galileo. Galileo does not support a USB 2.0 debug
395 port, so only the UART based communications library is used.
396
397 Use Dediprog SF100 to update the Galileo development board FLASH image.
398
399 Update the ```[Debug Port]``` section of the SoftDebugger.ini file with the host
400 side UART configuration settings. The following example uses COM5, which must
401 be updated with the COM port the Galileo target is attached. The following
402 example also shows a baud rate of 921600 which is correct for a Galileo Gen 2.
403 If a Galileo Gen 1 is being used, set the baud rate to 460800. By default, the
404 Galileo console is redirected to TCPIP port 20715.
405
406 ```ini
407 [Debug Port]
408 Channel = Serial
409 Port = COM5
410 FlowControl = 0
411 BaudRate = 921600
412 Server =
413 ```
414
415 Connect power adapter to Galileo development board and run a command script with
416 the contents below to start a Tera Term session on TCPIP port 20715 and start
417 the Intel(R) UEFI Development Kit Debugger Tool using UART connection between
418 the host and target and WinDbg. The REBOOT button on the Galileo development
419 board may need to be pressed for the debugger to perform the initial connect.
420
421 ```cmd
422 start "Console" /B "c:\Program Files (x86)\teraterm\ttermpro.exe" localhost:20715 /nossh
423 start "Debugger" /B "C:\Program Files (x86)\Intel\Intel(R) UEFI Development Kit Debugger Tool\eXdi.exe" /LaunchWinDbg
424 ```
425
426 The figure below should be seen when a connection is made. The SoftDebugger
427 Debug Console window shows the status of the connection between the host and the
428 target. The Tera Term window shows the console output from the SEC phase until
429 the debug agent is initialized. The WinDbg window shows that the debugger is
430 connected and the WinDbg application can be used for run control, breakpoint
431 management, and viewing call stacks, local variables, global variables, etc.
432
433 ![](https://github.com/tianocore/tianocore.github.io/wiki/Projects/QuarkPlatformPkg/Images/UdkDebugger.png)
434
435 ## **Debug Using Intel(R) System Debugger using OpenOCD**
436
437 Setup hardware and software components following the instructions in the article at:
438 https://software.intel.com/en-us/articles/using-intel-system-debugger-with-openocd
439
440 Connect power adapter to Galileo development board.
441
442 The following batch file starts Tera Term serial console on COM5 at 921600 baud,
443 starts OpenOCD using a Flyswatter2, and starts Intel(R) System Studio Debugger.
444 Select the **Connect** button to complete the host to target connection.
445
446 ```cmd
447 set OPENOCD="C:\Program Files (x86)\IntelSWTools\system_studio_for_windows_2016.0.023\debugger\openocd"
448 start "Console" /B "c:\Program Files (x86)\teraterm\ttermpro.exe" /C=5 /BAUD=921600
449 start "OpenOcd" /B %OPENOCD%\bin\openocd.exe -f ..\scripts\interface\ftdi\flyswatter2.cfg -f ..\scripts\board\quark_x10xx_board.cfg
450 call "C:\Program Files (x86)\IntelSWTools\System Debugger 2016\system_debugger\start_xdb_gdb_remote.bat"
451 ```
452
453 When **Reset Target** is selected, the Galileo development board does not always
454 halt at the first instruction at the reset vector. If debug is required from
455 the first instruction of the reset vector, then update the file
456 ```UefiCpuPkg/SecCore/Ia32/ResetVector.asm``` and change the two NOP
457 instructions at the label ```ResetHandler:``` to ```JMP $```. This puts the CPU
458 into a wait loop until the debugger is connected and the debugger is used to set
459 instruction pointer to the next instruction.
460
461 ```
462 ;
463 ; For IA32, the reset vector must be at 0xFFFFFFF0, i.e., 4G-16 byte
464 ; Execution starts here upon power-on/platform-reset.
465 ;
466 ResetHandler:
467 ; nop
468 ; nop
469 jmp $
470 ApStartup:
471 ;
472 ; Jmp Rel16 instruction
473 ; Use machine code directly in case of the assembler optimization
474 ; SEC entry point relative address will be fixed up by some build tool.
475 ;
476 ; Typically, SEC entry point is the function _ModuleEntryPoint() defined in
477 ; SecEntry.asm
478 ;
479 DB 0e9h
480 DW -3
481 ```
482
483 ## **Install, Configure, and Boot Linux**
484
485 * Download SD Card Linux Image: Available at
486 http://www.intel.com/content/www/us/en/support/boards-and-kits/intel-galileo-boards/000005614.html
487 * Extract the SD Card Linux Image to a FAT formatted Micro SD FLASH device
488 * Install Micro SD FLASH device into Galileo development board
489
490 Connect power adapter to Galileo development board and boot to the UEFI Shell.
491
492 From the UEFI Shell execute the following commands to copy the GRUB EFI boot
493 loader to ```\efi\boot\bootia32.efi```. This allows the UEFI Boot Manager, on
494 all future boots, to auto detect that the Micro SD FLASH device is bootable.
495
496 ```
497 Shell> connect -r
498 Shell> map -r
499 Shell> fs0:
500 FS0:> mkdir efi
501 FS0:> mkdir efi\boot
502 FS0:> cp grub.efi efi\boot\bootia32.efi
503 ```
504
505 The GRUB boot loader is set to a UART baud rate of 115200. A couple changes are
506 required to change the baud rate to 460800 for Galileo Gen 1 or 921600 for
507 Galileo Gen 2. From the UEFI Shell, execute the following commands to make a
508 backup copy and edit the GRUB configuration file.
509
510 ```
511 FS0:> cp boot\grub\grub.conf boot\grub\grub.conf.org
512 FS0:> edit boot\grub\grub.conf
513 ```
514
515 * Delete the lines associated with the boot option with the following title.
516
517 ```
518 title Clanton SVP kernel-SPI initrd-SPI IMR-On IO-APIC/HPET NoEMU
519 ```
520
521 * Replace the two instances of 115200 in the following line to 460800 for
522 Galileo Gen 1 or 921600 for Galileo Gen 2.
523
524 ```
525 kernel /bzImage root=/dev/ram0 console=ttyS1,115200n8 earlycon=uart8250,mmio32,$EARLY_CON_ADDR_REPLACE,115200n8 reboot=efi,warm apic=debug rw LABEL=boot debugshell=5 rootimage=image-full-galileo-clanton.ext3
526 ```
527 * Press F3 to save the file
528 * Run the ```exit``` command to exit from the UEFI Shell and return to the
529 UEFI Boot Manager
530 * Select **Boot Manager**
531 * Select **UEFI Misc Device** for the Micro SD FLASH device.
532 * GRUB should run and Linux should boot with serial log messages.
533 * When the serial log messages stop, change the Tera Term baud rate to 115200
534 * Login as ```root```. No password is required.
535 * Use ```vi``` to edit ```/etc/inittab```
536 * Change the baud rate of ttyS1 from 115200 to 460800 for Galileo Gen 1 or
537 921600 for Galileo Gen 2. The line that need to be updated is shown below
538
539 ```
540 S:2345:respawn:/sbin/getty 115200 ttyS1
541 ```
542
543 * Save the updated ```/etc/inittab```
544 * Run ```reboot -f``` to shutdown Linux and reboot the platform.
545 * Set the Tera Term baud rate back to 460800 for Galileo Gen 1 or 921600 for
546 Galileo Gen 2.
547
548 After these changes both the EDK II firmware and the Linux operating system use
549 the same baud rate.
550
551 ### **Testing ACPI S3 Sleep**
552
553 The ACPI S3 Sleep and Resume feature can be tested on a Galileo development
554 board using the Real Time Clock (RTC) for a wake event. The shell script shown
555 below arms the RTC wake alarm 10 seconds in the future and puts the system to
556 sleep. A shorter time in seconds can be passed in as the first argument to the
557 script, but do not use times shorter than 2 or 3 seconds.
558
559 **NOTE**: The stmmac module is unloaded because the module is not compatible
560 with S3 resume.
561
562 ```sh
563 #
564 # Unload NIC driver that causes S3 to fail
565 #
566 rmmod stmmac
567
568 #
569 # Disable RTC wake alarm
570 #
571 echo 0 > /sys/class/rtc/rtc0/wakealarm
572
573 #
574 # Compute wake time that is $1 seconds in the future
575 #
576 let WakeTime=`date '+%s'`
577 echo $WakeTime
578 if ["$1" = ""]; then
579 let WakeTime=$WakeTime+10
580 else
581 let WakeTime=$WakeTime+$1
582 fi
583 echo $WakeTime
584
585 #
586 # Enable RTC wake alarm $1 seconds in the future
587 #
588 echo $WakeTime > /sys/class/rtc/rtc0/wakealarm
589
590 #
591 # Put systems into ACPI S3 sleep state
592 #
593 echo mem > /sys/power/state
594 ```
595
596 ## **UEFI Secure Boot Feature and Physical Presence**
597
598 Build a firmware image with SECURE_BOOT_ENABLE enabled
599 (```-D SECURE_BOOT_ENABLE```). This builds in support for UEFI authenticated
600 variables, UEFI image verification, and UEFI Secure Boot configuration screens
601 in the Device Manager. In order to change the UEFI Secure Boot configuration,
602 the user must assert physical presence. The Galileo development board only has
603 two push buttons (REBOOT and RESET). The REBOOT button unconditionally reboots
604 the platform. The RESET button asserts the reset signal on the Arduino header
605 and is also connected to a GPIO pin, so the state of the RESET button can be
606 read. The user asserts physical presence by holding the RESET button while the
607 Galileo development board boots, or by holding the RESET button while selecting
608 the **Secure Boot Configuration** option in the Device Manager.
609
610 Use Dediprog SF100 to update the Galileo development board FLASH image.
611
612 Connect power adapter to Galileo development board and boot to the UEFI Boot
613 Manager by pressing F2 or running the ```exit``` command from the UEFI Shell.
614 Select **Device Manager** and then**Secure Boot Configuration**. Change
615 **Customize Secure Boot** to **Customized** and then select **Custom Secure Boot
616 Options**. If **Custom Secure Boot Options** can not be selected, then physical
617 presence was not asserted using one of two methods listed above. Assert
618 physical presence and try again.
619
620 The **Custom Secure Boot Options** screen allows the Galileo development board
621 to be enrolled into UEFI Secure Boot. See [How to Sign UEFI Drivers & Application V1.31](
622 http://sourceforge.net/projects/edk2/files/General%20Documentation/SigningUefiImages%20-v1dot31.pdf/download)
623 in the [SecurityPkg Wiki](https://github.com/tianocore/tianocore.github.io/wiki/SecurityPkg)
624 for details on how to complete the UEFI Secure Boot enrollment.
625
626 ## **Enable Measured Boot Feature using Atmel I2C TPM on CryptoShield**
627
628 Build a firmware image with MEASURED_BOOT_ENABLE enabled
629 (```-D MEASURED_BOOT_ENABLE```) and TPM_12_HARDWARE set to ATMEL_I2C
630 (```-D TMP_12_HARDWARE=ATMEL_I2C```). This builds in the TCG PEIM and DXE
631 modules and uses the library for the Atmel I2C TPM hardware device.
632
633 Use Dediprog SF100 to update the Galileo development board FLASH image.
634
635 Attach the CryptoShield to the Arduino header of the Galileo development board
636 as shown below.
637
638 ![](https://github.com/tianocore/tianocore.github.io/wiki/Projects/QuarkPlatformPkg/Images/GalileoCryptoShield.jpg)
639
640 Connect power adapter to Galileo development board and boot to the UEFI Shell.
641 In the boot logging messages, messages similar to the following should be seen
642 as the Atmel I2C TPM hardware device is detected and used to measure the
643 contents of firmware volumes and firmware tables.
644
645 ```
646 Loading PEIM at 0x0000FC75188 EntryPoint=0x0000FC75260 TrEEConfigPei.efi
647 PROGRESS CODE: V03020002 I0
648 TrEEConfiguration.TpmDevice from Setup: 1
649 DetectTpmDevice:
650 TpmDevice final: 1
651 TpmDevice PCD: 8B01E5B6-4F19-46E8-AB93-1C53671B90CC
652 . . .
653 Loading PEIM at 0x0000FC70190 EntryPoint=0x0000FC70260 TcgPei.efi
654 PROGRESS CODE: V03020002 I0
655 Install PPI: E9DB0D58-D48D-47F6-9C6E-6F40E86C7B41
656 Install PPI: A030D115-54DD-447B-9064-F206883D7CCC
657 PROGRESS CODE: V03020003 I0
658 The FV which is measured by TcgPei starts at: 0xFFF10000
659 The FV which is measured by TcgPei has the size: 0xF0000
660 The FV which is measured by TcgPei starts at: 0xFFD00000
661 The FV which is measured by TcgPei has the size: 0x1E0000
662 . . .
663 Loading driver at 0x0000F620000 EntryPoint=0x0000F620260 TcgDxe.efi
664 . . .
665 TPM TcgDxe Measure Data when ReadyToBoot
666 ```
667 See the [SecurityPkg Wiki](https://github.com/tianocore/tianocore.github.io/wiki/SecurityPkg)
668 for additional details on EDK II TPM support
669
670 ## **Measuring Boot Performance**
671
672 Build a firmware image with PERFORMANCE_ENABLE enabled
673 (```-D PERFORMANCE_ENABLE```). This builds in the UEFI Shell and the DP.EFI
674 (Dump Performance) into a firmware volume and also includes a simple file system
675 driver for firmware volumes so the DP.EFI command can be run out of the FLASH.
676
677 Use Dediprog SF100 to update the Galileo development board FLASH image.
678
679 Connect power adapter to Galileo development board and let it boot to the UEFI
680 Shell. Then use the REBOOT button or the ```reset``` UEFI Shell command to
681 reboot the Galileo development board. The first boot after a FLASH update does
682 extra work that is only performed one time. In order to get correct performance
683 measurements, use the 2nd or later boots. After the 2nd boot, run the
684 ```dp -s``` command. The output should look similar to the figure below.
685
686 ![](https://github.com/tianocore/tianocore.github.io/wiki/Projects/QuarkPlatformPkg/Images/DpCommand.png)