summaryrefslogtreecommitdiffstats
path: root/resources
diff options
context:
space:
mode:
authorMichał Masłowski <mtjm@mtjm.eu>2014-09-03 14:30:21 (EDT)
committer Michał Masłowski <mtjm@mtjm.eu>2014-09-03 14:30:21 (EDT)
commit96ca7ee67a36605a33de8d57eb8e8d3998bc6427 (patch)
tree07202c5fe7d366f50d9d17010f3bbf0a44c08ee8 /resources
parent4e8051dfaa0ba5617961481056eb7e79d7b50861 (diff)
parent9a321884379a71b5f0986fdfb97a2b6c5bdccd8a (diff)
downloadlibreboot-96ca7ee67a36605a33de8d57eb8e8d3998bc6427.zip
libreboot-96ca7ee67a36605a33de8d57eb8e8d3998bc6427.tar.gz
libreboot-96ca7ee67a36605a33de8d57eb8e8d3998bc6427.tar.bz2
Merge libreboot-6b6.
Conflicts: buildrom-withgrub
Diffstat (limited to 'resources')
-rw-r--r--resources/flashrom/patch/flashchips.c1282
-rw-r--r--resources/flashrom/patch/flashchips.c_lenovobios_macronix1282
-rw-r--r--resources/flashrom/patch/flashchips.c_lenovobios_sst1282
-rw-r--r--resources/grub/config/COPYING49
-rw-r--r--resources/grub/config/extra/common.cfg29
-rw-r--r--resources/grub/config/extra/txtmode.cfg0
-rw-r--r--resources/grub/config/extra/vesafb.cfg5
-rw-r--r--resources/grub/config/grub_memdisk.cfg25
-rw-r--r--resources/grub/config/macbook21/grub_usqwerty.cfg56
-rw-r--r--resources/grub/config/menuentries/common.cfg43
-rw-r--r--resources/grub/config/menuentries/txtmode.cfg9
-rw-r--r--resources/grub/config/menuentries/vesafb.cfg0
-rw-r--r--resources/grub/config/t60/grub_serial_usqwerty.cfg70
-rw-r--r--resources/grub/config/t60/grub_usqwerty.cfg60
-rw-r--r--resources/grub/config/x60/grub_serial_usqwerty.cfg70
-rw-r--r--resources/grub/config/x60/grub_usqwerty.cfg56
-rw-r--r--resources/grub/config/x60t/grub_serial_usqwerty.cfg70
-rw-r--r--resources/grub/config/x60t/grub_usqwerty.cfg56
-rw-r--r--resources/grubinvaders/patch/compile.sh.patch4
-rw-r--r--resources/grubinvaders/patch/diff.patch45
-rw-r--r--resources/libreboot/config/libpayload/config71
-rw-r--r--resources/libreboot/config/macbook21/config28
-rw-r--r--resources/libreboot/config/t60/config28
-rw-r--r--resources/libreboot/config/x60/config28
-rw-r--r--resources/libreboot/config/x60t/config35
-rw-r--r--resources/libreboot/patch/0000_t60_6723_and_6725_1_extension_textmode.git.diff12
-rw-r--r--resources/libreboot/patch/0000_x60t_digitizer_irda.git.diff525
-rw-r--r--resources/libreboot/patch/0001_i945_3dfix.git.diff37
-rw-r--r--resources/libreboot/patch/0001_t60_6731_6_extension_acpi_brightness.git.diff12
-rw-r--r--resources/libreboot/patch/0002_i945_6731_6_extension_fix_uneven_backlight.git.diff22
-rw-r--r--resources/libreboot/patch/0002_x60_backlight.diff4
-rw-r--r--resources/libreboot/patch/0003_t60_backlight.diff4
-rw-r--r--resources/libreboot/patch/gitdiff46
-rw-r--r--resources/memtest86/patch/Makefile81
-rw-r--r--resources/memtest86/patch/config.h52
-rw-r--r--resources/memtest86/patch/diff40
-rw-r--r--resources/seabios/config/config87
-rw-r--r--resources/utilities/README-i945-pwm4
-rwxr-xr-xresources/utilities/grub-assemble/gen.sh30
-rwxr-xr-xresources/utilities/grub-assemble/grub_memdisk_keymap25
-rw-r--r--resources/utilities/grub-assemble/keymap/COPYING (renamed from resources/grub/keymap/COPYING)0
-rw-r--r--resources/utilities/grub-assemble/keymap/frazerty.gkb (renamed from resources/grub/keymap/frazerty.gkb)bin2572 -> 2572 bytes
-rw-r--r--resources/utilities/grub-assemble/keymap/itqwerty.gkb (renamed from resources/grub/keymap/itqwerty.gkb)bin2572 -> 2572 bytes
-rw-r--r--resources/utilities/grub-assemble/keymap/original/frazerty (renamed from resources/grub/keymap/original/frazerty)0
-rw-r--r--resources/utilities/grub-assemble/keymap/original/itqwerty (copied from resources/grub/keymap/original/itqwerty)0
-rw-r--r--resources/utilities/grub-assemble/keymap/original/svenska (renamed from resources/grub/keymap/original/itqwerty)60
-rw-r--r--resources/utilities/grub-assemble/keymap/original/ukdvorak (renamed from resources/grub/keymap/original/ukdvorak)0
-rw-r--r--resources/utilities/grub-assemble/keymap/original/ukqwerty (renamed from resources/grub/keymap/original/ukqwerty)0
-rw-r--r--resources/utilities/grub-assemble/keymap/original/usdvorak (renamed from resources/grub/keymap/original/usdvorak)0
-rw-r--r--resources/utilities/grub-assemble/keymap/original/usqwerty (renamed from resources/grub/keymap/original/usqwerty)0
-rw-r--r--resources/utilities/grub-assemble/keymap/svenska.gkb (copied from resources/grub/keymap/ukqwerty.gkb)bin2572 -> 2572 bytes
-rw-r--r--resources/utilities/grub-assemble/keymap/ukdvorak.gkb (renamed from resources/grub/keymap/ukdvorak.gkb)bin2572 -> 2572 bytes
-rw-r--r--resources/utilities/grub-assemble/keymap/ukqwerty.gkb (renamed from resources/grub/keymap/ukqwerty.gkb)bin2572 -> 2572 bytes
-rw-r--r--resources/utilities/grub-assemble/keymap/usdvorak.gkb (renamed from resources/grub/keymap/usdvorak.gkb)bin2572 -> 2572 bytes
-rw-r--r--resources/utilities/grub-assemble/keymap/usqwerty.gkb (renamed from resources/grub/keymap/usqwerty.gkb)bin2572 -> 2572 bytes
m---------resources/utilities/i945-pwm0
-rwxr-xr-xresources/utilities/i945gpu/intel-regs.py21
57 files changed, 4206 insertions, 1539 deletions
diff --git a/resources/flashrom/patch/flashchips.c b/resources/flashrom/patch/flashchips.c
index bb24bdb..3660945 100644
--- a/resources/flashrom/patch/flashchips.c
+++ b/resources/flashrom/patch/flashchips.c
@@ -1382,7 +1382,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
.block_erasers =
@@ -1395,7 +1395,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_chip_block_jedec,
}
},
- .unlock = unlock_49fl00x,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -1994,7 +1994,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PREW,
.probe = probe_spi_at25f,
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -2477,7 +2477,7 @@ const struct flashchip flashchips[] = {
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PREW,
.probe = probe_spi_at45db,
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -3049,10 +3049,10 @@ const struct flashchip flashchips[] = {
.model_id = ATMEL_AT49LH002,
.total_size = 256,
.page_size = 0, /* unused */
- .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
+ .feature_bits = FEATURE_REGISTERMAP,
.tested = TEST_UNTESTED,
- .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
- .probe_timing = TIMING_FIXME,
+ .probe = probe_82802ab,
+ .probe_timing = TIMING_ZERO,
.block_erasers =
{
{
@@ -3062,16 +3062,88 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_82802ab,
+ .block_erase = NULL, /* TODO: Implement. */
}, {
.eraseblocks = {
{64 * 1024, 4},
},
+ .block_erase = erase_block_82802ab,
+ },
+ },
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
+ .write = write_82802ab,
+ .read = read_memmapped,
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Atmel",
+ .name = "AT49LH00B4",
+ .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
+ .manufacture_id = ATMEL_ID,
+ .model_id = ATMEL_AT49LH00B4,
+ .total_size = 512,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_REGISTERMAP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_82802ab,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 2},
+ {16 * 1024, 1},
+ {32 * 1024, 1},
+ {64 * 1024, 7},
+ },
+ .block_erase = NULL, /* TODO: Implement. */
+ }, {
+ .eraseblocks = {
+ {64 * 1024, 8},
+ },
+ .block_erase = erase_block_82802ab,
+ },
+ },
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
+ .write = write_82802ab,
+ .read = read_memmapped,
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Atmel",
+ .name = "AT49LH004",
+ .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
+ .manufacture_id = ATMEL_ID,
+ .model_id = ATMEL_AT49LH004,
+ .total_size = 512,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_REGISTERMAP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_82802ab,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 7},
+ {32 * 1024, 1},
+ {8 * 1024, 2},
+ {16 * 1024, 1},
+ },
+ .block_erase = erase_block_82802ab,
+ }, {
+ .eraseblocks = {
+ {64 * 1024, 8},
+ },
.block_erase = NULL, /* TODO: Implement. */
},
},
- .printlock = NULL, /* TODO */
- .unlock = NULL, /* unlock_82802ab() not correct(?) */
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -3086,7 +3158,7 @@ const struct flashchip flashchips[] = {
.total_size = 64,
.page_size = 0, /* unused */
.feature_bits = 0,
- .tested = TEST_OK_PR,
+ .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD },
.probe = probe_jedec, /* FIXME! */
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -4797,7 +4869,7 @@ const struct flashchip flashchips[] = {
.model_id = EON_EN29LV640B,
.total_size = 8192,
.page_size = 8192,
- .feature_bits = 0,
+ .feature_bits = FEATURE_ADDR_SHIFTED,
.tested = TEST_OK_PREW,
.probe = probe_en29lv640b,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
@@ -4808,10 +4880,10 @@ const struct flashchip flashchips[] = {
{8 * 1024, 8},
{64 * 1024, 127},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_block_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
.write = write_en29lv640b,
@@ -4820,6 +4892,120 @@ const struct flashchip flashchips[] = {
},
{
+ .vendor = "Eon",
+ .name = "EN29GL064(A)B",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL064B,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Eon",
+ .name = "EN29GL064(A)T",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL064T,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Eon",
+ .name = "EN29GL064H/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL064HL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Eon",
+ .name = "EN29GL128",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL128HL,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
.vendor = "Fujitsu",
.name = "MBM29F004BC",
.bustype = BUS_PARALLEL,
@@ -4892,10 +5078,10 @@ const struct flashchip flashchips[] = {
.model_id = FUJITSU_MBM29F400BC,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -4905,13 +5091,13 @@ const struct flashchip flashchips[] = {
{32 * 1024, 1},
{64 * 1024, 7},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
},
@@ -4924,10 +5110,10 @@ const struct flashchip flashchips[] = {
.model_id = FUJITSU_MBM29F400TC,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -4937,13 +5123,13 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
},
@@ -4958,8 +5144,8 @@ const struct flashchip flashchips[] = {
.page_size = 0,
.feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED,
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -4969,13 +5155,13 @@ const struct flashchip flashchips[] = {
{32 * 1024, 1},
{64 * 1024, 31},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_block_jedec,
}, {
.eraseblocks = { {2048 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt, /* Supports a fast mode too */
+ .write = write_jedec_1, /* Supports a fast mode too */
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
},
@@ -4990,8 +5176,8 @@ const struct flashchip flashchips[] = {
.page_size = 0,
.feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED,
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -5001,13 +5187,13 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_block_jedec,
}, {
.eraseblocks = { {2048 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt, /* Supports a fast mode too */
+ .write = write_jedec_1, /* Supports a fast mode too */
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
},
@@ -5247,7 +5433,7 @@ const struct flashchip flashchips[] = {
.page_size = 256,
/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PREW,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -5979,7 +6165,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
.block_erasers =
@@ -5989,7 +6175,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
},
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -6014,13 +6200,143 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
},
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
},
{
+ .vendor = "ISSI",
+ .name = "IS29GL064B",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL064B,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "ISSI",
+ .name = "IS29GL064T",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL064T,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "ISSI",
+ .name = "IS29GL064H/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL064HL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "ISSI",
+ .name = "IS29GL128H/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL128HL,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX23L1654",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX23L1654,
+ .total_size = 2048,
+ .page_size = 256,
+ .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {3000, 3600},
+ },
+
+ {
.vendor = "Macronix",
.name = "MX23L3254",
.bustype = BUS_SPI,
@@ -6038,6 +6354,38 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX23L6454",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX23L6454,
+ .total_size = 8192,
+ .page_size = 256,
+ .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX23L12854",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX23L12854,
+ .total_size = 16384,
+ .page_size = 256,
+ .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX25L512(E)/MX25V512(C)",
.bustype = BUS_SPI,
.manufacture_id = MACRONIX_ID,
@@ -6253,7 +6601,7 @@ const struct flashchip flashchips[] = {
.block_erase = spi_block_erase_c7,
},
},
- .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continously Program (CP) mode */
+ .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
@@ -6792,6 +7140,46 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX25U12835F",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX25U12835E,
+ .total_size = 16384,
+ .page_size = 256,
+ /* OTP: 512B total; enter 0xB1, exit 0xC1 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 4096} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 512} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ /* TODO: security register */
+ .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
+ .unlock = spi_disable_blockprotect_bp3_srwd,
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {1650, 2000},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX29F001B",
.bustype = BUS_PARALLEL,
.manufacture_id = MACRONIX_ID,
@@ -6922,6 +7310,70 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX29F022(N)B",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29F022B,
+ .total_size = 256,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {16 * 1024, 1},
+ {8 * 1024, 2},
+ {32 * 1024, 1},
+ {64 * 1024, 3},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {4500, 5500},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29F022(N)T",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29F022T,
+ .total_size = 256,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_OK_PREW,
+ .probe = probe_jedec,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 3},
+ {32 * 1024, 1},
+ {8 * 1024, 2},
+ {16 * 1024, 1},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {4500, 5500},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX29F040",
.bustype = BUS_PARALLEL,
.manufacture_id = MACRONIX_ID,
@@ -6949,6 +7401,207 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX29GL320EB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL320EB,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 63},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL320ET",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL320ET,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 63},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL320EH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL320EHL,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 64} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL640EB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL640EB,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL640ET",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL640ET,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL640EH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL640EHL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL128F",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL128F,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX29LV040",
.bustype = BUS_PARALLEL,
.manufacture_id = MACRONIX_ID,
@@ -6962,7 +7615,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
@@ -9024,7 +9677,7 @@ const struct flashchip flashchips[] = {
.total_size = 256,
.page_size = 16 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
.block_erasers =
@@ -9040,7 +9693,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_chip_block_jedec,
}
},
- .unlock = unlock_49fl00x,
+ .unlock = unlock_regspace2_uniform_32k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -9055,7 +9708,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
.block_erasers =
@@ -9071,7 +9724,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_chip_block_jedec,
}
},
- .unlock = unlock_49fl00x,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -9384,7 +10037,7 @@ const struct flashchip flashchips[] = {
.block_erase = NULL, /* 30 D0, only in A/A mux mode */
},
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -9563,9 +10216,9 @@ const struct flashchip flashchips[] = {
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
- .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
+ .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
.write = spi_chip_write_256,
- .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
.voltage = {2700, 3600},
},
@@ -9597,15 +10250,15 @@ const struct flashchip flashchips[] = {
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
- .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
+ .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
.write = spi_chip_write_256,
- .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Spansion",
- .name = "S25FL116K/S25FL216K",
+ .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
.bustype = BUS_SPI,
.manufacture_id = SPANSION_ID,
.model_id = SPANSION_S25FL216,
@@ -9632,9 +10285,9 @@ const struct flashchip flashchips[] = {
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
- .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
+ .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
.write = spi_chip_write_256,
- .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
.voltage = {2700, 3600},
},
@@ -9710,7 +10363,69 @@ const struct flashchip flashchips[] = {
{
.vendor = "Spansion",
- .name = "S25FL128S......0", /* uniform 256kB sectors */
+ .name = "S25FL128P......0", /* uniform 64 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 256,
+ .feature_bits = FEATURE_WRSR_WREN,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ .eraseblocks = { {64 * 1024, 256} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp3_srwd,
+ .unlock = spi_disable_blockprotect_bp3_srwd,
+ .write = spi_chip_write_256,
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL128P......1", /* uniform 256kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 256,
+ .feature_bits = FEATURE_WRSR_WREN,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ .eraseblocks = { {256 * 1024, 64} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_srwd,
+ .unlock = spi_disable_blockprotect_bp2_srwd,
+ .write = spi_chip_write_256,
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
.bustype = BUS_SPI,
.manufacture_id = SPANSION_ID,
.model_id = SPANSION_S25FL128,
@@ -9724,9 +10439,48 @@ const struct flashchip flashchips[] = {
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
- .eraseblocks = { {4 * 1024, 4096} },
+ /* This chip supports erasing of the 32 so-called "parameter sectors" with
+ * opcode 0x20. Trying to access an address outside these 4kB blocks does
+ * have no effect on the memory contents, but sets a flag in the SR.
+ .eraseblocks = {
+ {4 * 1024, 32},
+ {64 * 1024, 254} // inaccessible
+ },
.block_erase = spi_block_erase_20,
+ }, { */
+ .eraseblocks = { { 64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
}, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
+ .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL128S......1", /* uniform 256 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 512,
+ /* supports 4B addressing */
+ /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
.eraseblocks = { {256 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
@@ -9745,6 +10499,86 @@ const struct flashchip flashchips[] = {
},
{
+ .vendor = "Spansion",
+ .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 256,
+ /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
+ .tested = TEST_OK_PREW,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
+ * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
+ * effect on the memory contents, but sets a flag in the SR.
+ .eraseblocks = {
+ {4 * 1024, 32},
+ {64 * 1024, 254} // inaccessible
+ },
+ .block_erase = spi_block_erase_20,
+ }, { */
+ /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
+ .eraseblocks = {
+ {8 * 1024, 16},
+ {64 * 1024, 254} // inaccessible
+ },
+ .block_erase = spi_block_erase_40,
+ }, { */
+ .eraseblocks = { { 64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
+ .unlock = spi_disable_blockprotect_bp2_srwd,
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL129P......1", /* uniform 256 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 512,
+ /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ .eraseblocks = { {256 * 1024, 64} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
+ .unlock = spi_disable_blockprotect_bp2_srwd,
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
.vendor = "SST",
.name = "SST25LF020A",
.bustype = BUS_SPI,
@@ -9842,10 +10676,10 @@ const struct flashchip flashchips[] = {
{
.vendor = "SST",
- .name = "SST25VF512A",
+ .name = "SST25VF512(A)",
.bustype = BUS_SPI,
.manufacture_id = SST_ID,
- .model_id = SST_SST25VF512A_REMS,
+ .model_id = SST_SST25VF512_REMS,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EWSR,
@@ -9862,25 +10696,25 @@ const struct flashchip flashchips[] = {
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 2} },
- .block_erase = spi_block_erase_d8,
+ .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024, 1} },
- .block_erase = spi_block_erase_c7,
+ .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
},
},
.printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
- .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
.voltage = {2700, 3600},
},
{
.vendor = "SST",
- .name = "SST25VF010",
+ .name = "SST25VF010(A)",
.bustype = BUS_SPI,
.manufacture_id = SST_ID,
.model_id = SST_SST25VF010_REMS,
@@ -9900,19 +10734,19 @@ const struct flashchip flashchips[] = {
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 4} },
- .block_erase = spi_block_erase_d8,
+ .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024, 1} },
- .block_erase = spi_block_erase_c7,
+ .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
},
},
.printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
- .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
.voltage = {2700, 3600},
},
@@ -10926,7 +11760,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -10991,7 +11826,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11006,7 +11842,7 @@ const struct flashchip flashchips[] = {
.total_size = 2048,
.page_size = 4 * 1024,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
.block_erasers =
@@ -11024,7 +11860,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11129,7 +11966,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 1, /* 150ns */
.block_erasers =
@@ -11145,7 +11982,7 @@ const struct flashchip flashchips[] = {
.block_erase = NULL,
}
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11190,7 +12027,7 @@ const struct flashchip flashchips[] = {
.total_size = 2048,
.page_size = 4 * 1024,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PRE,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
.block_erasers =
@@ -11208,7 +12045,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11293,7 +12131,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
@@ -11314,10 +12152,10 @@ const struct flashchip flashchips[] = {
.model_id = ST_M29F400BB,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -11327,13 +12165,13 @@ const struct flashchip flashchips[] = {
{32 * 1024, 1},
{64 * 1024, 7},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
}
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
},
@@ -11346,10 +12184,10 @@ const struct flashchip flashchips[] = {
.model_id = ST_M29F400BT,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -11359,13 +12197,13 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
}
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
},
@@ -11385,7 +12223,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {16 * 1024, 8}, },
+ .eraseblocks = { {16 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {128 * 1024, 1} },
@@ -11412,7 +12250,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
@@ -11471,12 +12309,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
}
},
.write = write_82802ab,
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
},
@@ -11504,12 +12342,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
}
},
.write = write_82802ab,
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
},
@@ -11523,7 +12361,7 @@ const struct flashchip flashchips[] = {
.total_size = 1024,
.page_size = 0,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PRE,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_FIXME,
.block_erasers =
@@ -11537,11 +12375,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11570,11 +12409,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11589,9 +12429,9 @@ const struct flashchip flashchips[] = {
.total_size = 256,
.page_size = 0,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
+ .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
.block_erasers =
{
{
@@ -11602,9 +12442,13 @@ const struct flashchip flashchips[] = {
{16 * 1024, 1},
},
.block_erase = erase_block_82802ab,
+ }, {
+ .eraseblocks = { {256 * 1024, 1}, },
+ .block_erase = NULL, /* Only in A/A mux mode */
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11625,11 +12469,11 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 32}, },
+ .eraseblocks = { {64 * 1024, 32} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11650,11 +12494,11 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11669,17 +12513,17 @@ const struct flashchip flashchips[] = {
.total_size = 1024,
.page_size = 0,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11700,11 +12544,11 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11735,7 +12579,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -12794,6 +13639,207 @@ const struct flashchip flashchips[] = {
{
.vendor = "Winbond",
+ .name = "W29GL032CB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL032CB,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 63},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL032CT",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL032CT,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 63},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL032CH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL032CHL,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 64} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL064CB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL064CB,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL064CT",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL064CT,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL064CH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL064CHL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL128C",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL128CHL,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
.name = "W39F010",
.bustype = BUS_PARALLEL,
.manufacture_id = WINBOND_ID,
@@ -13003,7 +14049,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 10,
.block_erasers =
@@ -13020,7 +14066,7 @@ const struct flashchip flashchips[] = {
}
},
.printlock = printlock_w39v040fa,
- .unlock = unlock_sst_fwhub,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -13035,7 +14081,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 10,
.block_erasers =
@@ -13049,7 +14095,7 @@ const struct flashchip flashchips[] = {
}
},
.printlock = printlock_w39v040fb,
- .unlock = unlock_w39v040fb,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program */
@@ -13240,13 +14286,13 @@ const struct flashchip flashchips[] = {
.total_size = 1024,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 10,
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {1024 * 1024, 1} },
@@ -13254,7 +14300,7 @@ const struct flashchip flashchips[] = {
}
},
.printlock = printlock_w39v080fa,
- .unlock = unlock_w39v080fa,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program */
@@ -13275,7 +14321,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
diff --git a/resources/flashrom/patch/flashchips.c_lenovobios_macronix b/resources/flashrom/patch/flashchips.c_lenovobios_macronix
index 9a7ec32..b614d7a 100644
--- a/resources/flashrom/patch/flashchips.c_lenovobios_macronix
+++ b/resources/flashrom/patch/flashchips.c_lenovobios_macronix
@@ -1382,7 +1382,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
.block_erasers =
@@ -1395,7 +1395,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_chip_block_jedec,
}
},
- .unlock = unlock_49fl00x,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -1994,7 +1994,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PREW,
.probe = probe_spi_at25f,
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -2477,7 +2477,7 @@ const struct flashchip flashchips[] = {
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PREW,
.probe = probe_spi_at45db,
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -3049,10 +3049,10 @@ const struct flashchip flashchips[] = {
.model_id = ATMEL_AT49LH002,
.total_size = 256,
.page_size = 0, /* unused */
- .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
+ .feature_bits = FEATURE_REGISTERMAP,
.tested = TEST_UNTESTED,
- .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
- .probe_timing = TIMING_FIXME,
+ .probe = probe_82802ab,
+ .probe_timing = TIMING_ZERO,
.block_erasers =
{
{
@@ -3062,16 +3062,88 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_82802ab,
+ .block_erase = NULL, /* TODO: Implement. */
}, {
.eraseblocks = {
{64 * 1024, 4},
},
+ .block_erase = erase_block_82802ab,
+ },
+ },
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
+ .write = write_82802ab,
+ .read = read_memmapped,
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Atmel",
+ .name = "AT49LH00B4",
+ .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
+ .manufacture_id = ATMEL_ID,
+ .model_id = ATMEL_AT49LH00B4,
+ .total_size = 512,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_REGISTERMAP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_82802ab,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 2},
+ {16 * 1024, 1},
+ {32 * 1024, 1},
+ {64 * 1024, 7},
+ },
+ .block_erase = NULL, /* TODO: Implement. */
+ }, {
+ .eraseblocks = {
+ {64 * 1024, 8},
+ },
+ .block_erase = erase_block_82802ab,
+ },
+ },
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
+ .write = write_82802ab,
+ .read = read_memmapped,
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Atmel",
+ .name = "AT49LH004",
+ .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
+ .manufacture_id = ATMEL_ID,
+ .model_id = ATMEL_AT49LH004,
+ .total_size = 512,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_REGISTERMAP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_82802ab,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 7},
+ {32 * 1024, 1},
+ {8 * 1024, 2},
+ {16 * 1024, 1},
+ },
+ .block_erase = erase_block_82802ab,
+ }, {
+ .eraseblocks = {
+ {64 * 1024, 8},
+ },
.block_erase = NULL, /* TODO: Implement. */
},
},
- .printlock = NULL, /* TODO */
- .unlock = NULL, /* unlock_82802ab() not correct(?) */
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -3086,7 +3158,7 @@ const struct flashchip flashchips[] = {
.total_size = 64,
.page_size = 0, /* unused */
.feature_bits = 0,
- .tested = TEST_OK_PR,
+ .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD },
.probe = probe_jedec, /* FIXME! */
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -4797,7 +4869,7 @@ const struct flashchip flashchips[] = {
.model_id = EON_EN29LV640B,
.total_size = 8192,
.page_size = 8192,
- .feature_bits = 0,
+ .feature_bits = FEATURE_ADDR_SHIFTED,
.tested = TEST_OK_PREW,
.probe = probe_en29lv640b,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
@@ -4808,10 +4880,10 @@ const struct flashchip flashchips[] = {
{8 * 1024, 8},
{64 * 1024, 127},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_block_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
.write = write_en29lv640b,
@@ -4820,6 +4892,120 @@ const struct flashchip flashchips[] = {
},
{
+ .vendor = "Eon",
+ .name = "EN29GL064(A)B",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL064B,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Eon",
+ .name = "EN29GL064(A)T",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL064T,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Eon",
+ .name = "EN29GL064H/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL064HL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Eon",
+ .name = "EN29GL128",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL128HL,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
.vendor = "Fujitsu",
.name = "MBM29F004BC",
.bustype = BUS_PARALLEL,
@@ -4892,10 +5078,10 @@ const struct flashchip flashchips[] = {
.model_id = FUJITSU_MBM29F400BC,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -4905,13 +5091,13 @@ const struct flashchip flashchips[] = {
{32 * 1024, 1},
{64 * 1024, 7},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
},
@@ -4924,10 +5110,10 @@ const struct flashchip flashchips[] = {
.model_id = FUJITSU_MBM29F400TC,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -4937,13 +5123,13 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
},
@@ -4958,8 +5144,8 @@ const struct flashchip flashchips[] = {
.page_size = 0,
.feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED,
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -4969,13 +5155,13 @@ const struct flashchip flashchips[] = {
{32 * 1024, 1},
{64 * 1024, 31},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_block_jedec,
}, {
.eraseblocks = { {2048 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt, /* Supports a fast mode too */
+ .write = write_jedec_1, /* Supports a fast mode too */
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
},
@@ -4990,8 +5176,8 @@ const struct flashchip flashchips[] = {
.page_size = 0,
.feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED,
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -5001,13 +5187,13 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_block_jedec,
}, {
.eraseblocks = { {2048 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt, /* Supports a fast mode too */
+ .write = write_jedec_1, /* Supports a fast mode too */
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
},
@@ -5247,7 +5433,7 @@ const struct flashchip flashchips[] = {
.page_size = 256,
/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PREW,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -5979,7 +6165,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
.block_erasers =
@@ -5989,7 +6175,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
},
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -6014,13 +6200,143 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
},
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
},
{
+ .vendor = "ISSI",
+ .name = "IS29GL064B",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL064B,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "ISSI",
+ .name = "IS29GL064T",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL064T,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "ISSI",
+ .name = "IS29GL064H/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL064HL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "ISSI",
+ .name = "IS29GL128H/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL128HL,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX23L1654",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX23L1654,
+ .total_size = 2048,
+ .page_size = 256,
+ .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {3000, 3600},
+ },
+
+ {
.vendor = "Macronix",
.name = "MX23L3254",
.bustype = BUS_SPI,
@@ -6038,6 +6354,38 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX23L6454",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX23L6454,
+ .total_size = 8192,
+ .page_size = 256,
+ .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX23L12854",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX23L12854,
+ .total_size = 16384,
+ .page_size = 256,
+ .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX25L512(E)/MX25V512(C)",
.bustype = BUS_SPI,
.manufacture_id = MACRONIX_ID,
@@ -6327,7 +6675,7 @@ const struct flashchip flashchips[] = {
.block_erase = spi_block_erase_c7,
},
},
- .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continously Program (CP) mode */
+ .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_1,
.read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
@@ -6866,6 +7214,46 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX25U12835F",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX25U12835E,
+ .total_size = 16384,
+ .page_size = 256,
+ /* OTP: 512B total; enter 0xB1, exit 0xC1 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 4096} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 512} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ /* TODO: security register */
+ .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
+ .unlock = spi_disable_blockprotect_bp3_srwd,
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {1650, 2000},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX29F001B",
.bustype = BUS_PARALLEL,
.manufacture_id = MACRONIX_ID,
@@ -6996,6 +7384,70 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX29F022(N)B",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29F022B,
+ .total_size = 256,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {16 * 1024, 1},
+ {8 * 1024, 2},
+ {32 * 1024, 1},
+ {64 * 1024, 3},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {4500, 5500},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29F022(N)T",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29F022T,
+ .total_size = 256,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_OK_PREW,
+ .probe = probe_jedec,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 3},
+ {32 * 1024, 1},
+ {8 * 1024, 2},
+ {16 * 1024, 1},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {4500, 5500},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX29F040",
.bustype = BUS_PARALLEL,
.manufacture_id = MACRONIX_ID,
@@ -7023,6 +7475,207 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX29GL320EB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL320EB,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 63},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL320ET",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL320ET,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 63},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL320EH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL320EHL,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 64} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL640EB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL640EB,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL640ET",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL640ET,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL640EH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL640EHL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL128F",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL128F,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX29LV040",
.bustype = BUS_PARALLEL,
.manufacture_id = MACRONIX_ID,
@@ -7036,7 +7689,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
@@ -9098,7 +9751,7 @@ const struct flashchip flashchips[] = {
.total_size = 256,
.page_size = 16 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
.block_erasers =
@@ -9114,7 +9767,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_chip_block_jedec,
}
},
- .unlock = unlock_49fl00x,
+ .unlock = unlock_regspace2_uniform_32k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -9129,7 +9782,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
.block_erasers =
@@ -9145,7 +9798,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_chip_block_jedec,
}
},
- .unlock = unlock_49fl00x,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -9458,7 +10111,7 @@ const struct flashchip flashchips[] = {
.block_erase = NULL, /* 30 D0, only in A/A mux mode */
},
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -9637,9 +10290,9 @@ const struct flashchip flashchips[] = {
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
- .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
+ .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
.write = spi_chip_write_256,
- .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
.voltage = {2700, 3600},
},
@@ -9671,15 +10324,15 @@ const struct flashchip flashchips[] = {
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
- .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
+ .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
.write = spi_chip_write_256,
- .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Spansion",
- .name = "S25FL116K/S25FL216K",
+ .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
.bustype = BUS_SPI,
.manufacture_id = SPANSION_ID,
.model_id = SPANSION_S25FL216,
@@ -9706,9 +10359,9 @@ const struct flashchip flashchips[] = {
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
- .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
+ .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
.write = spi_chip_write_256,
- .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
.voltage = {2700, 3600},
},
@@ -9784,7 +10437,69 @@ const struct flashchip flashchips[] = {
{
.vendor = "Spansion",
- .name = "S25FL128S......0", /* uniform 256kB sectors */
+ .name = "S25FL128P......0", /* uniform 64 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 256,
+ .feature_bits = FEATURE_WRSR_WREN,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ .eraseblocks = { {64 * 1024, 256} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp3_srwd,
+ .unlock = spi_disable_blockprotect_bp3_srwd,
+ .write = spi_chip_write_256,
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL128P......1", /* uniform 256kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 256,
+ .feature_bits = FEATURE_WRSR_WREN,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ .eraseblocks = { {256 * 1024, 64} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_srwd,
+ .unlock = spi_disable_blockprotect_bp2_srwd,
+ .write = spi_chip_write_256,
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
.bustype = BUS_SPI,
.manufacture_id = SPANSION_ID,
.model_id = SPANSION_S25FL128,
@@ -9798,9 +10513,48 @@ const struct flashchip flashchips[] = {
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
- .eraseblocks = { {4 * 1024, 4096} },
+ /* This chip supports erasing of the 32 so-called "parameter sectors" with
+ * opcode 0x20. Trying to access an address outside these 4kB blocks does
+ * have no effect on the memory contents, but sets a flag in the SR.
+ .eraseblocks = {
+ {4 * 1024, 32},
+ {64 * 1024, 254} // inaccessible
+ },
.block_erase = spi_block_erase_20,
+ }, { */
+ .eraseblocks = { { 64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
}, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
+ .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL128S......1", /* uniform 256 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 512,
+ /* supports 4B addressing */
+ /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
.eraseblocks = { {256 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
@@ -9819,6 +10573,86 @@ const struct flashchip flashchips[] = {
},
{
+ .vendor = "Spansion",
+ .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 256,
+ /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
+ .tested = TEST_OK_PREW,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
+ * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
+ * effect on the memory contents, but sets a flag in the SR.
+ .eraseblocks = {
+ {4 * 1024, 32},
+ {64 * 1024, 254} // inaccessible
+ },
+ .block_erase = spi_block_erase_20,
+ }, { */
+ /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
+ .eraseblocks = {
+ {8 * 1024, 16},
+ {64 * 1024, 254} // inaccessible
+ },
+ .block_erase = spi_block_erase_40,
+ }, { */
+ .eraseblocks = { { 64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
+ .unlock = spi_disable_blockprotect_bp2_srwd,
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL129P......1", /* uniform 256 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 512,
+ /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ .eraseblocks = { {256 * 1024, 64} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
+ .unlock = spi_disable_blockprotect_bp2_srwd,
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
.vendor = "SST",
.name = "SST25LF020A",
.bustype = BUS_SPI,
@@ -9916,10 +10750,10 @@ const struct flashchip flashchips[] = {
{
.vendor = "SST",
- .name = "SST25VF512A",
+ .name = "SST25VF512(A)",
.bustype = BUS_SPI,
.manufacture_id = SST_ID,
- .model_id = SST_SST25VF512A_REMS,
+ .model_id = SST_SST25VF512_REMS,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EWSR,
@@ -9936,25 +10770,25 @@ const struct flashchip flashchips[] = {
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 2} },
- .block_erase = spi_block_erase_d8,
+ .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024, 1} },
- .block_erase = spi_block_erase_c7,
+ .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
},
},
.printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
- .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
.voltage = {2700, 3600},
},
{
.vendor = "SST",
- .name = "SST25VF010",
+ .name = "SST25VF010(A)",
.bustype = BUS_SPI,
.manufacture_id = SST_ID,
.model_id = SST_SST25VF010_REMS,
@@ -9974,19 +10808,19 @@ const struct flashchip flashchips[] = {
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 4} },
- .block_erase = spi_block_erase_d8,
+ .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024, 1} },
- .block_erase = spi_block_erase_c7,
+ .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
},
},
.printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
- .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
.voltage = {2700, 3600},
},
@@ -11000,7 +11834,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11065,7 +11900,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11080,7 +11916,7 @@ const struct flashchip flashchips[] = {
.total_size = 2048,
.page_size = 4 * 1024,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
.block_erasers =
@@ -11098,7 +11934,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11203,7 +12040,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 1, /* 150ns */
.block_erasers =
@@ -11219,7 +12056,7 @@ const struct flashchip flashchips[] = {
.block_erase = NULL,
}
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11264,7 +12101,7 @@ const struct flashchip flashchips[] = {
.total_size = 2048,
.page_size = 4 * 1024,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PRE,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
.block_erasers =
@@ -11282,7 +12119,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11367,7 +12205,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
@@ -11388,10 +12226,10 @@ const struct flashchip flashchips[] = {
.model_id = ST_M29F400BB,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -11401,13 +12239,13 @@ const struct flashchip flashchips[] = {
{32 * 1024, 1},
{64 * 1024, 7},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
}
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
},
@@ -11420,10 +12258,10 @@ const struct flashchip flashchips[] = {
.model_id = ST_M29F400BT,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -11433,13 +12271,13 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
}
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
},
@@ -11459,7 +12297,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {16 * 1024, 8}, },
+ .eraseblocks = { {16 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {128 * 1024, 1} },
@@ -11486,7 +12324,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
@@ -11545,12 +12383,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
}
},
.write = write_82802ab,
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
},
@@ -11578,12 +12416,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
}
},
.write = write_82802ab,
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
},
@@ -11597,7 +12435,7 @@ const struct flashchip flashchips[] = {
.total_size = 1024,
.page_size = 0,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PRE,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_FIXME,
.block_erasers =
@@ -11611,11 +12449,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11644,11 +12483,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11663,9 +12503,9 @@ const struct flashchip flashchips[] = {
.total_size = 256,
.page_size = 0,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
+ .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
.block_erasers =
{
{
@@ -11676,9 +12516,13 @@ const struct flashchip flashchips[] = {
{16 * 1024, 1},
},
.block_erase = erase_block_82802ab,
+ }, {
+ .eraseblocks = { {256 * 1024, 1}, },
+ .block_erase = NULL, /* Only in A/A mux mode */
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11699,11 +12543,11 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 32}, },
+ .eraseblocks = { {64 * 1024, 32} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11724,11 +12568,11 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11743,17 +12587,17 @@ const struct flashchip flashchips[] = {
.total_size = 1024,
.page_size = 0,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11774,11 +12618,11 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11809,7 +12653,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -12868,6 +13713,207 @@ const struct flashchip flashchips[] = {
{
.vendor = "Winbond",
+ .name = "W29GL032CB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL032CB,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 63},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL032CT",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL032CT,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 63},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL032CH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL032CHL,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 64} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL064CB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL064CB,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL064CT",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL064CT,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL064CH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL064CHL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL128C",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL128CHL,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
.name = "W39F010",
.bustype = BUS_PARALLEL,
.manufacture_id = WINBOND_ID,
@@ -13077,7 +14123,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 10,
.block_erasers =
@@ -13094,7 +14140,7 @@ const struct flashchip flashchips[] = {
}
},
.printlock = printlock_w39v040fa,
- .unlock = unlock_sst_fwhub,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -13109,7 +14155,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 10,
.block_erasers =
@@ -13123,7 +14169,7 @@ const struct flashchip flashchips[] = {
}
},
.printlock = printlock_w39v040fb,
- .unlock = unlock_w39v040fb,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program */
@@ -13314,13 +14360,13 @@ const struct flashchip flashchips[] = {
.total_size = 1024,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 10,
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {1024 * 1024, 1} },
@@ -13328,7 +14374,7 @@ const struct flashchip flashchips[] = {
}
},
.printlock = printlock_w39v080fa,
- .unlock = unlock_w39v080fa,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program */
@@ -13349,7 +14395,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
diff --git a/resources/flashrom/patch/flashchips.c_lenovobios_sst b/resources/flashrom/patch/flashchips.c_lenovobios_sst
index cdb65f1..df3c853 100644
--- a/resources/flashrom/patch/flashchips.c_lenovobios_sst
+++ b/resources/flashrom/patch/flashchips.c_lenovobios_sst
@@ -1382,7 +1382,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
.block_erasers =
@@ -1395,7 +1395,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_chip_block_jedec,
}
},
- .unlock = unlock_49fl00x,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -1994,7 +1994,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 256,
.feature_bits = FEATURE_WRSR_WREN,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PREW,
.probe = probe_spi_at25f,
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -2477,7 +2477,7 @@ const struct flashchip flashchips[] = {
/* does not support EWSR nor WREN and has no writable status register bits whatsoever */
/* OTP: 128B total, 64B pre-programmed; read 0x77; write 0x9B */
.feature_bits = FEATURE_OTP,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PREW,
.probe = probe_spi_at45db,
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -3049,10 +3049,10 @@ const struct flashchip flashchips[] = {
.model_id = ATMEL_AT49LH002,
.total_size = 256,
.page_size = 0, /* unused */
- .feature_bits = FEATURE_REGISTERMAP, /* TODO: LPC OK too? */
+ .feature_bits = FEATURE_REGISTERMAP,
.tested = TEST_UNTESTED,
- .probe = probe_82802ab, /* TODO: 0xff cmd not documented? */
- .probe_timing = TIMING_FIXME,
+ .probe = probe_82802ab,
+ .probe_timing = TIMING_ZERO,
.block_erasers =
{
{
@@ -3062,16 +3062,88 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_82802ab,
+ .block_erase = NULL, /* TODO: Implement. */
}, {
.eraseblocks = {
{64 * 1024, 4},
},
+ .block_erase = erase_block_82802ab,
+ },
+ },
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
+ .write = write_82802ab,
+ .read = read_memmapped,
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Atmel",
+ .name = "AT49LH00B4",
+ .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
+ .manufacture_id = ATMEL_ID,
+ .model_id = ATMEL_AT49LH00B4,
+ .total_size = 512,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_REGISTERMAP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_82802ab,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 2},
+ {16 * 1024, 1},
+ {32 * 1024, 1},
+ {64 * 1024, 7},
+ },
+ .block_erase = NULL, /* TODO: Implement. */
+ }, {
+ .eraseblocks = {
+ {64 * 1024, 8},
+ },
+ .block_erase = erase_block_82802ab,
+ },
+ },
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
+ .write = write_82802ab,
+ .read = read_memmapped,
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Atmel",
+ .name = "AT49LH004",
+ .bustype = BUS_LPC | BUS_FWH, /* A/A Mux */
+ .manufacture_id = ATMEL_ID,
+ .model_id = ATMEL_AT49LH004,
+ .total_size = 512,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_REGISTERMAP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_82802ab,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 7},
+ {32 * 1024, 1},
+ {8 * 1024, 2},
+ {16 * 1024, 1},
+ },
+ .block_erase = erase_block_82802ab,
+ }, {
+ .eraseblocks = {
+ {64 * 1024, 8},
+ },
.block_erase = NULL, /* TODO: Implement. */
},
},
- .printlock = NULL, /* TODO */
- .unlock = NULL, /* unlock_82802ab() not correct(?) */
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -3086,7 +3158,7 @@ const struct flashchip flashchips[] = {
.total_size = 64,
.page_size = 0, /* unused */
.feature_bits = 0,
- .tested = TEST_OK_PR,
+ .tested = {.probe = OK, .read = OK, .erase = BAD, .write = BAD },
.probe = probe_jedec, /* FIXME! */
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -4797,7 +4869,7 @@ const struct flashchip flashchips[] = {
.model_id = EON_EN29LV640B,
.total_size = 8192,
.page_size = 8192,
- .feature_bits = 0,
+ .feature_bits = FEATURE_ADDR_SHIFTED,
.tested = TEST_OK_PREW,
.probe = probe_en29lv640b,
.probe_timing = TIMING_ZERO, /* Datasheet has no timing info specified */
@@ -4808,10 +4880,10 @@ const struct flashchip flashchips[] = {
{8 * 1024, 8},
{64 * 1024, 127},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_block_jedec,
}, {
.eraseblocks = { {8 * 1024 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
.write = write_en29lv640b,
@@ -4820,6 +4892,120 @@ const struct flashchip flashchips[] = {
},
{
+ .vendor = "Eon",
+ .name = "EN29GL064(A)B",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL064B,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Eon",
+ .name = "EN29GL064(A)T",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL064T,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Eon",
+ .name = "EN29GL064H/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL064HL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Eon",
+ .name = "EN29GL128",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = EON_ID,
+ .model_id = EON_EN29GL128HL,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
.vendor = "Fujitsu",
.name = "MBM29F004BC",
.bustype = BUS_PARALLEL,
@@ -4892,10 +5078,10 @@ const struct flashchip flashchips[] = {
.model_id = FUJITSU_MBM29F400BC,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -4905,13 +5091,13 @@ const struct flashchip flashchips[] = {
{32 * 1024, 1},
{64 * 1024, 7},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
},
@@ -4924,10 +5110,10 @@ const struct flashchip flashchips[] = {
.model_id = FUJITSU_MBM29F400TC,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_AAA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -4937,13 +5123,13 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4750, 5250}, /* 4.75-5.25V for type -55, others 4.5-5.5V */
},
@@ -4958,8 +5144,8 @@ const struct flashchip flashchips[] = {
.page_size = 0,
.feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED,
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -4969,13 +5155,13 @@ const struct flashchip flashchips[] = {
{32 * 1024, 1},
{64 * 1024, 31},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_block_jedec,
}, {
.eraseblocks = { {2048 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt, /* Supports a fast mode too */
+ .write = write_jedec_1, /* Supports a fast mode too */
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
},
@@ -4990,8 +5176,8 @@ const struct flashchip flashchips[] = {
.page_size = 0,
.feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_SHORT_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED,
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -5001,13 +5187,13 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_block_jedec,
}, {
.eraseblocks = { {2048 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
},
},
- .write = write_m29f400bt, /* Supports a fast mode too */
+ .write = write_jedec_1, /* Supports a fast mode too */
.read = read_memmapped,
.voltage = {3000, 3600}, /* 3.0-3.6V for type -70, others 2.7-3.6V */
},
@@ -5247,7 +5433,7 @@ const struct flashchip flashchips[] = {
.page_size = 256,
/* OTP: 1024B total, 256B reserved; read 0x48; write 0x42, erase 0x44 (B version only) */
.feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PREW,
.probe = probe_spi_rdid,
.probe_timing = TIMING_ZERO,
.block_erasers =
@@ -5979,7 +6165,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine does not use probe_timing (82802ab.c) */
.block_erasers =
@@ -5989,7 +6175,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
},
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -6014,13 +6200,143 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
},
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
},
{
+ .vendor = "ISSI",
+ .name = "IS29GL064B",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL064B,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "ISSI",
+ .name = "IS29GL064T",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL064T,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "ISSI",
+ .name = "IS29GL064H/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL064HL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "ISSI",
+ .name = "IS29GL128H/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = ISSI_ID,
+ .model_id = ISSI_PMC_IS29GL128HL,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX23L1654",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX23L1654,
+ .total_size = 2048,
+ .page_size = 256,
+ .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .write = NULL, /* MX23L1654 is a mask ROM, so it is read-only */
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {3000, 3600},
+ },
+
+ {
.vendor = "Macronix",
.name = "MX23L3254",
.bustype = BUS_SPI,
@@ -6038,6 +6354,38 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX23L6454",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX23L6454,
+ .total_size = 8192,
+ .page_size = 256,
+ .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .write = NULL, /* MX23L6454 is a mask ROM, so it is read-only */
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX23L12854",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX23L12854,
+ .total_size = 16384,
+ .page_size = 256,
+ .tested = {.probe = NT, .read = NT, .erase = NA, .write = NA},
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .write = NULL, /* MX23L12854 is a mask ROM, so it is read-only */
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {3000, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX25L512(E)/MX25V512(C)",
.bustype = BUS_SPI,
.manufacture_id = MACRONIX_ID,
@@ -6327,7 +6675,7 @@ const struct flashchip flashchips[] = {
.block_erase = spi_block_erase_c7,
},
},
- .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continously Program (CP) mode */
+ .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6: Continuously Program (CP) mode */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_256,
.read = spi_chip_read, /* Fast read (0x0B), dual I/O supported */
@@ -6866,6 +7214,46 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX25U12835F",
+ .bustype = BUS_SPI,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX25U12835E,
+ .total_size = 16384,
+ .page_size = 256,
+ /* OTP: 512B total; enter 0xB1, exit 0xC1 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP | FEATURE_QPI,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {4 * 1024, 4096} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {32 * 1024, 512} },
+ .block_erase = spi_block_erase_52,
+ }, {
+ .eraseblocks = { {64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ /* TODO: security register */
+ .printlock = spi_prettyprint_status_register_bp3_srwd, /* bit6 is quad enable */
+ .unlock = spi_disable_blockprotect_bp3_srwd,
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {1650, 2000},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX29F001B",
.bustype = BUS_PARALLEL,
.manufacture_id = MACRONIX_ID,
@@ -6996,6 +7384,70 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX29F022(N)B",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29F022B,
+ .total_size = 256,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {16 * 1024, 1},
+ {8 * 1024, 2},
+ {32 * 1024, 1},
+ {64 * 1024, 3},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {4500, 5500},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29F022(N)T",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29F022T,
+ .total_size = 256,
+ .page_size = 0, /* unused */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_OK_PREW,
+ .probe = probe_jedec,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 3},
+ {32 * 1024, 1},
+ {8 * 1024, 2},
+ {16 * 1024, 1},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {256 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ }
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {4500, 5500},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX29F040",
.bustype = BUS_PARALLEL,
.manufacture_id = MACRONIX_ID,
@@ -7023,6 +7475,207 @@ const struct flashchip flashchips[] = {
{
.vendor = "Macronix",
+ .name = "MX29GL320EB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL320EB,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 63},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL320ET",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL320ET,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 63},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL320EH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL320EHL,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 64} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL640EB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL640EB,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL640ET",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL640ET,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL640EH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL640EHL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
+ .name = "MX29GL128F",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = MACRONIX_ID,
+ .model_id = MACRONIX_MX29GL128F,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Macronix",
.name = "MX29LV040",
.bustype = BUS_PARALLEL,
.manufacture_id = MACRONIX_ID,
@@ -7036,7 +7689,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
@@ -9098,7 +9751,7 @@ const struct flashchip flashchips[] = {
.total_size = 256,
.page_size = 16 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
.block_erasers =
@@ -9114,7 +9767,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_chip_block_jedec,
}
},
- .unlock = unlock_49fl00x,
+ .unlock = unlock_regspace2_uniform_32k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -9129,7 +9782,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = TIMING_ZERO, /* routine is wrapper to probe_jedec (pm49fl00x.c) */
.block_erasers =
@@ -9145,7 +9798,7 @@ const struct flashchip flashchips[] = {
.block_erase = erase_chip_block_jedec,
}
},
- .unlock = unlock_49fl00x,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -9458,7 +10111,7 @@ const struct flashchip flashchips[] = {
.block_erase = NULL, /* 30 D0, only in A/A mux mode */
},
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -9637,9 +10290,9 @@ const struct flashchip flashchips[] = {
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
- .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
+ .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
.write = spi_chip_write_256,
- .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
.voltage = {2700, 3600},
},
@@ -9671,15 +10324,15 @@ const struct flashchip flashchips[] = {
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
- .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
+ .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
.write = spi_chip_write_256,
- .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
.voltage = {2700, 3600},
},
{
.vendor = "Spansion",
- .name = "S25FL116K/S25FL216K",
+ .name = "S25FL116K/S25FL216K", /* FIXME: separate them */
.bustype = BUS_SPI,
.manufacture_id = SPANSION_ID,
.model_id = SPANSION_S25FL216,
@@ -9706,9 +10359,9 @@ const struct flashchip flashchips[] = {
}
},
.printlock = spi_prettyprint_status_register_bp3_srwd,
- .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
+ .unlock = spi_disable_blockprotect_bp3_srwd, /* #WP pin write-protects SRWP bit. */
.write = spi_chip_write_256,
- .read = spi_chip_read, /* Fast read (0x0B), dual I/O (0x3B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and dual I/O (0x3B) supported */
.voltage = {2700, 3600},
},
@@ -9784,7 +10437,69 @@ const struct flashchip flashchips[] = {
{
.vendor = "Spansion",
- .name = "S25FL128S......0", /* uniform 256kB sectors */
+ .name = "S25FL128P......0", /* uniform 64 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 256,
+ .feature_bits = FEATURE_WRSR_WREN,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ .eraseblocks = { {64 * 1024, 256} },
+ .block_erase = spi_block_erase_20,
+ }, {
+ .eraseblocks = { {64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp3_srwd,
+ .unlock = spi_disable_blockprotect_bp3_srwd,
+ .write = spi_chip_write_256,
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL128P......1", /* uniform 256kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 256,
+ .feature_bits = FEATURE_WRSR_WREN,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ .eraseblocks = { {256 * 1024, 64} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_srwd,
+ .unlock = spi_disable_blockprotect_bp2_srwd,
+ .write = spi_chip_write_256,
+ .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL128S......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
.bustype = BUS_SPI,
.manufacture_id = SPANSION_ID,
.model_id = SPANSION_S25FL128,
@@ -9798,9 +10513,48 @@ const struct flashchip flashchips[] = {
.probe_timing = TIMING_ZERO,
.block_erasers = {
{
- .eraseblocks = { {4 * 1024, 4096} },
+ /* This chip supports erasing of the 32 so-called "parameter sectors" with
+ * opcode 0x20. Trying to access an address outside these 4kB blocks does
+ * have no effect on the memory contents, but sets a flag in the SR.
+ .eraseblocks = {
+ {4 * 1024, 32},
+ {64 * 1024, 254} // inaccessible
+ },
.block_erase = spi_block_erase_20,
+ }, { */
+ .eraseblocks = { { 64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
}, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: SR2 and many others */
+ .unlock = spi_disable_blockprotect_bp2_srwd, /* TODO: various other locks */
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL128S......1", /* uniform 256 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 512,
+ /* supports 4B addressing */
+ /* OTP: 1024B total, 32B reserved; read 0x4B; write 0x42 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
.eraseblocks = { {256 * 1024, 64} },
.block_erase = spi_block_erase_d8,
}, {
@@ -9819,6 +10573,86 @@ const struct flashchip flashchips[] = {
},
{
+ .vendor = "Spansion",
+ .name = "S25FL129P......0", /* hybrid: 32 (top or bottom) 4 kB sub-sectors + 64 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 256,
+ /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
+ .tested = TEST_OK_PREW,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ /* FIXME: This chip supports erasing of the 32 so-called "parameter sectors" with
+ * opcode 0x20. Trying to access an address outside these 4kB blocks does have no
+ * effect on the memory contents, but sets a flag in the SR.
+ .eraseblocks = {
+ {4 * 1024, 32},
+ {64 * 1024, 254} // inaccessible
+ },
+ .block_erase = spi_block_erase_20,
+ }, { */
+ /* FIXME: Additionally it also supports erase opcode 40h for the respective 2*4 kB pairs
+ .eraseblocks = {
+ {8 * 1024, 16},
+ {64 * 1024, 254} // inaccessible
+ },
+ .block_erase = spi_block_erase_40,
+ }, { */
+ .eraseblocks = { { 64 * 1024, 256} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
+ .unlock = spi_disable_blockprotect_bp2_srwd,
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Spansion",
+ .name = "S25FL129P......1", /* uniform 256 kB sectors */
+ .bustype = BUS_SPI,
+ .manufacture_id = SPANSION_ID,
+ .model_id = SPANSION_S25FL128,
+ .total_size = 16384,
+ .page_size = 512,
+ /* OTP: 506B total, 16B reserved; read 0x4B; write 0x42 */
+ .feature_bits = FEATURE_WRSR_WREN | FEATURE_OTP,
+ .tested = TEST_UNTESTED,
+ .probe = probe_spi_rdid,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers = {
+ {
+ .eraseblocks = { {256 * 1024, 64} },
+ .block_erase = spi_block_erase_d8,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_60,
+ }, {
+ .eraseblocks = { { 16384 * 1024, 1} },
+ .block_erase = spi_block_erase_c7,
+ }
+ },
+ .printlock = spi_prettyprint_status_register_bp2_ep_srwd, /* TODO: Configuration register */
+ .unlock = spi_disable_blockprotect_bp2_srwd,
+ .write = spi_chip_write_256, /* Multi I/O supported */
+ .read = spi_chip_read, /* Fast read (0x0B) and multi I/O supported */
+ .voltage = {2700, 3600},
+ },
+
+ {
.vendor = "SST",
.name = "SST25LF020A",
.bustype = BUS_SPI,
@@ -9916,10 +10750,10 @@ const struct flashchip flashchips[] = {
{
.vendor = "SST",
- .name = "SST25VF512A",
+ .name = "SST25VF512(A)",
.bustype = BUS_SPI,
.manufacture_id = SST_ID,
- .model_id = SST_SST25VF512A_REMS,
+ .model_id = SST_SST25VF512_REMS,
.total_size = 64,
.page_size = 256,
.feature_bits = FEATURE_WRSR_EWSR,
@@ -9936,25 +10770,25 @@ const struct flashchip flashchips[] = {
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 2} },
- .block_erase = spi_block_erase_d8,
+ .block_erase = spi_block_erase_d8, /* Supported by SST25VF512A only */
}, {
.eraseblocks = { {64 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {64 * 1024, 1} },
- .block_erase = spi_block_erase_c7,
+ .block_erase = spi_block_erase_c7, /* Supported by SST25VF512A only */
},
},
.printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
- .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF512A only */
.voltage = {2700, 3600},
},
{
.vendor = "SST",
- .name = "SST25VF010",
+ .name = "SST25VF010(A)",
.bustype = BUS_SPI,
.manufacture_id = SST_ID,
.model_id = SST_SST25VF010_REMS,
@@ -9974,19 +10808,19 @@ const struct flashchip flashchips[] = {
.block_erase = spi_block_erase_52,
}, {
.eraseblocks = { {32 * 1024, 4} },
- .block_erase = spi_block_erase_d8,
+ .block_erase = spi_block_erase_d8, /* Supported by SST25VF010A only */
}, {
.eraseblocks = { {128 * 1024, 1} },
.block_erase = spi_block_erase_60,
}, {
.eraseblocks = { {128 * 1024, 1} },
- .block_erase = spi_block_erase_c7,
+ .block_erase = spi_block_erase_c7, /* Supported by SST25VF010A only */
},
},
.printlock = spi_prettyprint_status_register_sst25, /* FIXME: No BP2 & 3 */
.unlock = spi_disable_blockprotect,
.write = spi_chip_write_1, /* AAI supported, but opcode is 0xAF */
- .read = spi_chip_read, /* Fast read (0x0B) supported */
+ .read = spi_chip_read, /* Fast read (0x0B) supported by SST25VF010A only */
.voltage = {2700, 3600},
},
@@ -11000,7 +11834,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11065,7 +11900,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11080,7 +11916,7 @@ const struct flashchip flashchips[] = {
.total_size = 2048,
.page_size = 4 * 1024,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
.block_erasers =
@@ -11098,7 +11934,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11203,7 +12040,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_EITHER_RESET | FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 1, /* 150ns */
.block_erasers =
@@ -11219,7 +12056,7 @@ const struct flashchip flashchips[] = {
.block_erase = NULL,
}
},
- .unlock = unlock_82802ab,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11264,7 +12101,7 @@ const struct flashchip flashchips[] = {
.total_size = 2048,
.page_size = 4 * 1024,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PRE,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
.block_erasers =
@@ -11282,7 +12119,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_49lfxxxc,
+ .printlock = printlock_regspace2_block_eraser_1,
+ .unlock = unlock_regspace2_block_eraser_1,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -11367,7 +12205,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
@@ -11388,10 +12226,10 @@ const struct flashchip flashchips[] = {
.model_id = ST_M29F400BB,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -11401,13 +12239,13 @@ const struct flashchip flashchips[] = {
{32 * 1024, 1},
{64 * 1024, 7},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
}
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
},
@@ -11420,10 +12258,10 @@ const struct flashchip flashchips[] = {
.model_id = ST_M29F400BT,
.total_size = 512,
.page_size = 64 * 1024,
- .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_EITHER_RESET,
+ .feature_bits = FEATURE_ADDR_SHIFTED | FEATURE_ADDR_2AA | FEATURE_EITHER_RESET,
.tested = TEST_UNTESTED,
- .probe = probe_m29f400bt,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (m29f400bt.c) */
+ .probe = probe_jedec,
+ .probe_timing = 10, // FIXME: check datasheet. Using the 10 us from probe_m29f400bt
.block_erasers =
{
{
@@ -11433,13 +12271,13 @@ const struct flashchip flashchips[] = {
{8 * 1024, 2},
{16 * 1024, 1},
},
- .block_erase = erase_block_shifted_jedec,
+ .block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
- .block_erase = erase_chip_block_shifted_jedec,
+ .block_erase = erase_chip_block_jedec,
}
},
- .write = write_m29f400bt,
+ .write = write_jedec_1,
.read = read_memmapped,
.voltage = {4500, 5500},
},
@@ -11459,7 +12297,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {16 * 1024, 8}, },
+ .eraseblocks = { {16 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {128 * 1024, 1} },
@@ -11486,7 +12324,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
@@ -11545,12 +12383,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
}
},
.write = write_82802ab,
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
},
@@ -11578,12 +12416,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
}
},
.write = write_82802ab,
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
},
@@ -11597,7 +12435,7 @@ const struct flashchip flashchips[] = {
.total_size = 1024,
.page_size = 0,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PRE,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_FIXME,
.block_erasers =
@@ -11611,11 +12449,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11644,11 +12483,12 @@ const struct flashchip flashchips[] = {
},
.block_erase = erase_sector_stm50,
}, {
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11663,9 +12503,9 @@ const struct flashchip flashchips[] = {
.total_size = 256,
.page_size = 0,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_UNTESTED,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
- .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (sst49lfxxxc.c) */
+ .probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
.block_erasers =
{
{
@@ -11676,9 +12516,13 @@ const struct flashchip flashchips[] = {
{16 * 1024, 1},
},
.block_erase = erase_block_82802ab,
+ }, {
+ .eraseblocks = { {256 * 1024, 1}, },
+ .block_erase = NULL, /* Only in A/A mux mode */
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11699,11 +12543,11 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 32}, },
+ .eraseblocks = { {64 * 1024, 32} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11724,11 +12568,11 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11743,17 +12587,17 @@ const struct flashchip flashchips[] = {
.total_size = 1024,
.page_size = 0,
.feature_bits = FEATURE_REGISTERMAP,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_82802ab,
.probe_timing = TIMING_IGNORED, /* routine doesn't use probe_timing (82802ab.c) */
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11774,11 +12618,11 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_uniform,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -11809,7 +12653,8 @@ const struct flashchip flashchips[] = {
.block_erase = erase_block_82802ab,
}
},
- .unlock = unlock_stm50_nonuniform,
+ .printlock = printlock_regspace2_block_eraser_0,
+ .unlock = unlock_regspace2_block_eraser_0,
.write = write_82802ab,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program & erase */
@@ -12868,6 +13713,207 @@ const struct flashchip flashchips[] = {
{
.vendor = "Winbond",
+ .name = "W29GL032CB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL032CB,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 63},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL032CT",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL032CT,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 63},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL032CH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL032CHL,
+ .total_size = 4096,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 64} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {4 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL064CB",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL064CB,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {8 * 1024, 8},
+ {64 * 1024, 127},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL064CT",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL064CT,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = {
+ {64 * 1024, 127},
+ {8 * 1024, 8},
+ },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL064CH/L",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL064CHL,
+ .total_size = 8192,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {64 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {8 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
+ .name = "W29GL128C",
+ .bustype = BUS_PARALLEL,
+ .manufacture_id = AMD_ID, /* WTF: "Industry Standard compatible Manufacturer ID code of 01h" */
+ .model_id = WINBOND_W29GL128CHL,
+ .total_size = 16384,
+ .page_size = 128 * 1024, /* actual page size is 16 */
+ .feature_bits = FEATURE_ADDR_2AA | FEATURE_SHORT_RESET,
+ .tested = TEST_UNTESTED,
+ .probe = probe_jedec_29gl,
+ .probe_timing = TIMING_ZERO,
+ .block_erasers =
+ {
+ {
+ .eraseblocks = { {128 * 1024, 128} },
+ .block_erase = erase_sector_jedec,
+ }, {
+ .eraseblocks = { {16 * 1024 * 1024, 1} },
+ .block_erase = erase_chip_block_jedec,
+ },
+ },
+ .write = write_jedec_1,
+ .read = read_memmapped,
+ .voltage = {2700, 3600},
+ },
+
+ {
+ .vendor = "Winbond",
.name = "W39F010",
.bustype = BUS_PARALLEL,
.manufacture_id = WINBOND_ID,
@@ -13077,7 +14123,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 10,
.block_erasers =
@@ -13094,7 +14140,7 @@ const struct flashchip flashchips[] = {
}
},
.printlock = printlock_w39v040fa,
- .unlock = unlock_sst_fwhub,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600},
@@ -13109,7 +14155,7 @@ const struct flashchip flashchips[] = {
.total_size = 512,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 10,
.block_erasers =
@@ -13123,7 +14169,7 @@ const struct flashchip flashchips[] = {
}
},
.printlock = printlock_w39v040fb,
- .unlock = unlock_w39v040fb,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program */
@@ -13314,13 +14360,13 @@ const struct flashchip flashchips[] = {
.total_size = 1024,
.page_size = 64 * 1024,
.feature_bits = FEATURE_REGISTERMAP | FEATURE_EITHER_RESET,
- .tested = TEST_OK_PREW,
+ .tested = TEST_OK_PR,
.probe = probe_jedec,
.probe_timing = 10,
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 16}, },
+ .eraseblocks = { {64 * 1024, 16} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {1024 * 1024, 1} },
@@ -13328,7 +14374,7 @@ const struct flashchip flashchips[] = {
}
},
.printlock = printlock_w39v080fa,
- .unlock = unlock_w39v080fa,
+ .unlock = unlock_regspace2_uniform_64k,
.write = write_jedec_1,
.read = read_memmapped,
.voltage = {3000, 3600}, /* Also has 12V fast program */
@@ -13349,7 +14395,7 @@ const struct flashchip flashchips[] = {
.block_erasers =
{
{
- .eraseblocks = { {64 * 1024, 8}, },
+ .eraseblocks = { {64 * 1024, 8} },
.block_erase = erase_sector_jedec,
}, {
.eraseblocks = { {512 * 1024, 1} },
diff --git a/resources/grub/config/COPYING b/resources/grub/config/COPYING
index 624c22d..05827f3 100644
--- a/resources/grub/config/COPYING
+++ b/resources/grub/config/COPYING
@@ -1,33 +1,18 @@
-The following files inside this directory:
+# GRUB configuration files under resources/grub/config/
- * grub_memdisk.cfg
- * macbook21/grub.cfg
- * macbook21/grub_dvorak.cfg
- * macbook21/grub_ukdvorak.cfg
- * macbook21/grub_ukqwerty.cfg
- * t60/grub.cfg
- * t60/grub_dvorak.cfg
- * t60/grub_ukdvorak.cfg
- * t60/grub_ukqwerty.cfg
- * t60/grub_serial.cfg
- * t60/grub_serial_dvorak.cfg
- * t60/grub_serial_ukdvorak.cfg
- * t60/grub_serial_ukqwerty.cfg
- * x60/grub.cfg
- * x60/grub_dvorak.cfg
- * x60/grub_ukdvorak.cfg
- * x60/grub_ukqwerty.cfg
- * x60/grub_serial.cfg
- * x60/grub_serial_dvorak.cfg
- * x60/grub_serial_ukdvorak.cfg
- * x60/grub_serial_ukqwerty.cfg
- * x60t/grub.cfg
- * x60t/grub_dvorak.cfg
- * x60t/grub_ukdvorak.cfg
- * x60t/grub_ukqwerty.cfg
- * x60t/grub_serial.cfg
- * x60t/grub_serial_dvorak.cfg
- * x60t/grub_serial_ukdvorak.cfg
- * x60t/grub_serial_ukqwerty.cfg
-
-Look inside each file for copyright information
+#
+# Copyright (C) 2014 Francis Rowe
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
diff --git a/resources/grub/config/extra/common.cfg b/resources/grub/config/extra/common.cfg
new file mode 100644
index 0000000..09bd20a
--- /dev/null
+++ b/resources/grub/config/extra/common.cfg
@@ -0,0 +1,29 @@
+set prefix=(memdisk)/boot/grub
+
+insmod nativedisk
+insmod ehci
+insmod ohci
+insmod uhci
+insmod usb
+insmod usbserial_pl2303
+insmod usbserial_ftdi
+insmod usbserial_usbdebug
+
+# Serial and keyboard configuration, very important.
+serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1
+terminal_input --append serial
+terminal_output --append serial
+terminal_input --append at_keyboard
+
+gfxpayload=keep
+terminal_output --append gfxterm
+
+# Default to first option, automatically boot after 1 second
+set default="0"
+set timeout=1
+
+# This is useful when using 'cat' on long files on GRUB terminal
+set pager=1
+
+# Play a beep on startup
+play 480 440 1
diff --git a/resources/grub/config/extra/txtmode.cfg b/resources/grub/config/extra/txtmode.cfg
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/resources/grub/config/extra/txtmode.cfg
diff --git a/resources/grub/config/extra/vesafb.cfg b/resources/grub/config/extra/vesafb.cfg
new file mode 100644
index 0000000..bcad5cb
--- /dev/null
+++ b/resources/grub/config/extra/vesafb.cfg
@@ -0,0 +1,5 @@
+insmod jpeg
+
+background_image (cbfsdisk)/background.jpg
+loadfont (cbfsdisk)/dejavusansmono.pf2
+
diff --git a/resources/grub/config/grub_memdisk.cfg b/resources/grub/config/grub_memdisk.cfg
index fbac687..c9f22ff 100644
--- a/resources/grub/config/grub_memdisk.cfg
+++ b/resources/grub/config/grub_memdisk.cfg
@@ -1,28 +1,3 @@
-#
-# configuration file for GRUB memdisk which sits inside the grub.elf payload included inside the ROM image
-#
-# Copyright (C) 2014 Francis Rowe
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-# Serial and keyboard configuration, very important.
-serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1
-terminal_input --append serial
-terminal_output --append serial
-terminal_input --append at_keyboard #add keyboard support.
-
set prefix=(memdisk)/boot/grub
set root='cbfsdisk'
diff --git a/resources/grub/config/macbook21/grub_usqwerty.cfg b/resources/grub/config/macbook21/grub_usqwerty.cfg
deleted file mode 100644
index 5f52384..0000000
--- a/resources/grub/config/macbook21/grub_usqwerty.cfg
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# GRUB configuration file which sits inside the root CBFS (coreboot filesystem)
-#
-# Copyright (C) 2014 Francis Rowe
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-set default="0"
-set timeout=1
-set pager=1
-
-background_image (cbfsdisk)/gnulove.jpg
-loadfont (cbfsdisk)/dejavusansmono.pf2
-
-menuentry 'Load Operating System' {
- linux (ahci0,1)/vmlinuz root=/dev/sda1
- initrd (ahci0,1)/initrd.img
-}
-menuentry 'Parse ISOLINUX menu (USB)' {
- set root='usb0'
- syslinux_configfile -i (usb0)/isolinux/isolinux.cfg
-}
-menuentry 'Search for GRUB configuration on internal storage' {
- insmod regexp
- insmod ahci
- insmod part_msdos
- for x in (ahci0,*) ; do
- if [ -f "$x/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /grub/grub.cfg
- unset superusers
- }
- fi
- if [ -f "$x/boot/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /boot/grub/grub.cfg
- unset superusers
- }
- fi
- done
-}
-
diff --git a/resources/grub/config/menuentries/common.cfg b/resources/grub/config/menuentries/common.cfg
new file mode 100644
index 0000000..ec476fd
--- /dev/null
+++ b/resources/grub/config/menuentries/common.cfg
@@ -0,0 +1,43 @@
+menuentry 'Load Operating System' {
+ set root='ahci0,msdos1'
+ linux /vmlinuz root=/dev/sda1
+ initrd /initrd.img
+}
+menuentry 'Parse ISOLINUX menu (USB)' {
+ set root='usb0'
+ syslinux_configfile -i (usb0)/isolinux/isolinux.cfg
+}
+menuentry 'Parse ISOLINUX menu (CD)' {
+ set root='ata0'
+ syslinux_configfile -i (ata0)/isolinux/isolinux.cfg
+}
+menuentry 'Load SeaBIOS' {
+ set root='cbfsdisk'
+ chainloader /bios.bin.elf
+}
+menuentry 'Switch to grubtest.cfg' {
+ set root='cbfsdisk'
+ configfile (cbfsdisk)/grubtest.cfg
+}
+menuentry 'Search for GRUB configuration on internal storage' {
+ insmod regexp
+ insmod ahci
+ insmod part_msdos
+ for x in (ahci0,*) ; do
+ if [ -f "$x/grub/grub.cfg" ] ; then
+ submenu "Load Config from $x" $x {
+ root=$2
+ source /grub/grub.cfg
+ unset superusers
+ }
+ fi
+ if [ -f "$x/boot/grub/grub.cfg" ] ; then
+ submenu "Load Config from $x" $x {
+ root=$2
+ source /boot/grub/grub.cfg
+ unset superusers
+ }
+ fi
+ done
+}
+
diff --git a/resources/grub/config/menuentries/txtmode.cfg b/resources/grub/config/menuentries/txtmode.cfg
new file mode 100644
index 0000000..087886e
--- /dev/null
+++ b/resources/grub/config/menuentries/txtmode.cfg
@@ -0,0 +1,9 @@
+menuentry 'Load GRUB Invaders' {
+ set root='cbfsdisk'
+ chainloader /invaders.exec
+}
+menuentry 'Load MemTest86+' {
+ set root='cbfsdisk'
+ chainloader /memtest
+}
+
diff --git a/resources/grub/config/menuentries/vesafb.cfg b/resources/grub/config/menuentries/vesafb.cfg
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/resources/grub/config/menuentries/vesafb.cfg
diff --git a/resources/grub/config/t60/grub_serial_usqwerty.cfg b/resources/grub/config/t60/grub_serial_usqwerty.cfg
deleted file mode 100644
index 34ce198..0000000
--- a/resources/grub/config/t60/grub_serial_usqwerty.cfg
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# GRUB configuration file which sits inside the root CBFS (coreboot filesystem)
-#
-# Copyright (C) 2014 Francis Rowe
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-# Serial and keyboard configuration, very important.
-serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1
-terminal_input --append serial
-terminal_output --append serial
-terminal_input --append at_keyboard #add keyboard support.
-
-set default="0"
-set timeout=1
-set pager=1
-
-background_image (cbfsdisk)/background.jpg
-loadfont (cbfsdisk)/dejavusansmono.pf2
-
-menuentry 'Load Operating System' {
- linux (ahci0,1)/vmlinuz root=/dev/sda1
- initrd (ahci0,1)/initrd.img
-}
-menuentry 'Parse ISOLINUX menu (USB)' {
- set root='usb0'
- syslinux_configfile -i (usb0)/isolinux/isolinux.cfg
-}
-menuentry 'Parse ISOLINUX menu (CD)' {
- set root='ata0'
- syslinux_configfile -i (ata0)/isolinux/isolinux.cfg
-}
-menuentry 'Load MemTest86+ (serial port, baud 115200)' {
- set root='cbfsdisk'
- chainloader /memtest
-}
-menuentry 'Search for GRUB configuration on internal storage' {
- insmod regexp
- insmod ahci
- insmod part_msdos
- for x in (ahci0,*) ; do
- if [ -f "$x/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /grub/grub.cfg
- unset superusers
- }
- fi
- if [ -f "$x/boot/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /boot/grub/grub.cfg
- unset superusers
- }
- fi
- done
-}
-
diff --git a/resources/grub/config/t60/grub_usqwerty.cfg b/resources/grub/config/t60/grub_usqwerty.cfg
deleted file mode 100644
index 4fa2e43..0000000
--- a/resources/grub/config/t60/grub_usqwerty.cfg
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-# GRUB configuration file which sits inside the root CBFS (coreboot filesystem)
-#
-# Copyright (C) 2014 Francis Rowe
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-set default="0"
-set timeout=1
-set pager=1
-
-background_image (cbfsdisk)/background.jpg
-loadfont (cbfsdisk)/dejavusansmono.pf2
-
-menuentry 'Load Operating System' {
- linux (ahci0,1)/vmlinuz root=/dev/sda1
- initrd (ahci0,1)/initrd.img
-}
-menuentry 'Parse ISOLINUX menu (USB)' {
- set root='usb0'
- syslinux_configfile -i (usb0)/isolinux/isolinux.cfg
-}
-menuentry 'Parse ISOLINUX menu (CD)' {
- set root='ata0'
- syslinux_configfile -i (ata0)/isolinux/isolinux.cfg
-}
-menuentry 'Search for GRUB configuration on internal storage' {
- insmod regexp
- insmod ahci
- insmod part_msdos
- for x in (ahci0,*) ; do
- if [ -f "$x/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /grub/grub.cfg
- unset superusers
- }
- fi
- if [ -f "$x/boot/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /boot/grub/grub.cfg
- unset superusers
- }
- fi
- done
-}
-
diff --git a/resources/grub/config/x60/grub_serial_usqwerty.cfg b/resources/grub/config/x60/grub_serial_usqwerty.cfg
deleted file mode 100644
index 34ce198..0000000
--- a/resources/grub/config/x60/grub_serial_usqwerty.cfg
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# GRUB configuration file which sits inside the root CBFS (coreboot filesystem)
-#
-# Copyright (C) 2014 Francis Rowe
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-# Serial and keyboard configuration, very important.
-serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1
-terminal_input --append serial
-terminal_output --append serial
-terminal_input --append at_keyboard #add keyboard support.
-
-set default="0"
-set timeout=1
-set pager=1
-
-background_image (cbfsdisk)/background.jpg
-loadfont (cbfsdisk)/dejavusansmono.pf2
-
-menuentry 'Load Operating System' {
- linux (ahci0,1)/vmlinuz root=/dev/sda1
- initrd (ahci0,1)/initrd.img
-}
-menuentry 'Parse ISOLINUX menu (USB)' {
- set root='usb0'
- syslinux_configfile -i (usb0)/isolinux/isolinux.cfg
-}
-menuentry 'Parse ISOLINUX menu (CD)' {
- set root='ata0'
- syslinux_configfile -i (ata0)/isolinux/isolinux.cfg
-}
-menuentry 'Load MemTest86+ (serial port, baud 115200)' {
- set root='cbfsdisk'
- chainloader /memtest
-}
-menuentry 'Search for GRUB configuration on internal storage' {
- insmod regexp
- insmod ahci
- insmod part_msdos
- for x in (ahci0,*) ; do
- if [ -f "$x/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /grub/grub.cfg
- unset superusers
- }
- fi
- if [ -f "$x/boot/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /boot/grub/grub.cfg
- unset superusers
- }
- fi
- done
-}
-
diff --git a/resources/grub/config/x60/grub_usqwerty.cfg b/resources/grub/config/x60/grub_usqwerty.cfg
deleted file mode 100644
index cce7a44..0000000
--- a/resources/grub/config/x60/grub_usqwerty.cfg
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# GRUB configuration file which sits inside the root CBFS (coreboot filesystem)
-#
-# Copyright (C) 2014 Francis Rowe
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-set default="0"
-set timeout=1
-set pager=1
-
-background_image (cbfsdisk)/background.jpg
-loadfont (cbfsdisk)/dejavusansmono.pf2
-
-menuentry 'Load Operating System' {
- linux (ahci0,1)/vmlinuz root=/dev/sda1
- initrd (ahci0,1)/initrd.img
-}
-menuentry 'Parse ISOLINUX menu (USB)' {
- set root='usb0'
- syslinux_configfile -i (usb0)/isolinux/isolinux.cfg
-}
-menuentry 'Search for GRUB configuration on internal storage' {
- insmod regexp
- insmod ahci
- insmod part_msdos
- for x in (ahci0,*) ; do
- if [ -f "$x/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /grub/grub.cfg
- unset superusers
- }
- fi
- if [ -f "$x/boot/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /boot/grub/grub.cfg
- unset superusers
- }
- fi
- done
-}
-
diff --git a/resources/grub/config/x60t/grub_serial_usqwerty.cfg b/resources/grub/config/x60t/grub_serial_usqwerty.cfg
deleted file mode 100644
index 34ce198..0000000
--- a/resources/grub/config/x60t/grub_serial_usqwerty.cfg
+++ /dev/null
@@ -1,70 +0,0 @@
-#
-# GRUB configuration file which sits inside the root CBFS (coreboot filesystem)
-#
-# Copyright (C) 2014 Francis Rowe
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-# Serial and keyboard configuration, very important.
-serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1
-terminal_input --append serial
-terminal_output --append serial
-terminal_input --append at_keyboard #add keyboard support.
-
-set default="0"
-set timeout=1
-set pager=1
-
-background_image (cbfsdisk)/background.jpg
-loadfont (cbfsdisk)/dejavusansmono.pf2
-
-menuentry 'Load Operating System' {
- linux (ahci0,1)/vmlinuz root=/dev/sda1
- initrd (ahci0,1)/initrd.img
-}
-menuentry 'Parse ISOLINUX menu (USB)' {
- set root='usb0'
- syslinux_configfile -i (usb0)/isolinux/isolinux.cfg
-}
-menuentry 'Parse ISOLINUX menu (CD)' {
- set root='ata0'
- syslinux_configfile -i (ata0)/isolinux/isolinux.cfg
-}
-menuentry 'Load MemTest86+ (serial port, baud 115200)' {
- set root='cbfsdisk'
- chainloader /memtest
-}
-menuentry 'Search for GRUB configuration on internal storage' {
- insmod regexp
- insmod ahci
- insmod part_msdos
- for x in (ahci0,*) ; do
- if [ -f "$x/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /grub/grub.cfg
- unset superusers
- }
- fi
- if [ -f "$x/boot/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /boot/grub/grub.cfg
- unset superusers
- }
- fi
- done
-}
-
diff --git a/resources/grub/config/x60t/grub_usqwerty.cfg b/resources/grub/config/x60t/grub_usqwerty.cfg
deleted file mode 100644
index cce7a44..0000000
--- a/resources/grub/config/x60t/grub_usqwerty.cfg
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# GRUB configuration file which sits inside the root CBFS (coreboot filesystem)
-#
-# Copyright (C) 2014 Francis Rowe
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-set default="0"
-set timeout=1
-set pager=1
-
-background_image (cbfsdisk)/background.jpg
-loadfont (cbfsdisk)/dejavusansmono.pf2
-
-menuentry 'Load Operating System' {
- linux (ahci0,1)/vmlinuz root=/dev/sda1
- initrd (ahci0,1)/initrd.img
-}
-menuentry 'Parse ISOLINUX menu (USB)' {
- set root='usb0'
- syslinux_configfile -i (usb0)/isolinux/isolinux.cfg
-}
-menuentry 'Search for GRUB configuration on internal storage' {
- insmod regexp
- insmod ahci
- insmod part_msdos
- for x in (ahci0,*) ; do
- if [ -f "$x/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /grub/grub.cfg
- unset superusers
- }
- fi
- if [ -f "$x/boot/grub/grub.cfg" ] ; then
- submenu "Load Config from $x" $x {
- root=$2
- source /boot/grub/grub.cfg
- unset superusers
- }
- fi
- done
-}
-
diff --git a/resources/grubinvaders/patch/compile.sh.patch b/resources/grubinvaders/patch/compile.sh.patch
new file mode 100644
index 0000000..0e7c3b8
--- /dev/null
+++ b/resources/grubinvaders/patch/compile.sh.patch
@@ -0,0 +1,4 @@
+6c6
+< CFLAGS="-fno-builtin -nostdinc -O2 -I. -Wall -Werror"
+---
+> CFLAGS="-fno-builtin -nostdinc -O2 -I. -Wall -Werror -fno-stack-protector"
diff --git a/resources/grubinvaders/patch/diff.patch b/resources/grubinvaders/patch/diff.patch
new file mode 100644
index 0000000..2867dea
--- /dev/null
+++ b/resources/grubinvaders/patch/diff.patch
@@ -0,0 +1,45 @@
+diff -ur invaders/clean.sh invaders-fixed/clean.sh
+--- invaders/clean.sh 2001-05-21 22:43:13.000000000 +0200
++++ invaders-fixed/clean.sh 2009-04-13 17:03:14.000000000 +0200
+@@ -2,4 +2,4 @@
+
+ set -e
+ set -v
+-rm -f *.o *~ invaders.exec
++rm -f *.o *~ invaders.exec invaders
+diff -ur invaders/compile.sh invaders-fixed/compile.sh
+--- invaders/compile.sh 2001-05-21 22:26:46.000000000 +0200
++++ invaders-fixed/compile.sh 2009-04-13 16:59:44.000000000 +0200
+@@ -4,7 +4,7 @@
+ set -v
+
+ CFLAGS="-fno-builtin -nostdinc -O2 -I. -Wall -Werror"
+-LDFLAGS="-nostdlib -Wl,-N -Wl,-Ttext -Wl,100000"
++LDFLAGS="-nostdlib -Wl,-N -Wl,-Ttext -Wl,100000 -Wl,--build-id=none"
+ gcc $CFLAGS -c keyboard.c
+ gcc $CFLAGS -c delay.c
+ gcc $CFLAGS -c common.c
+diff -ur invaders/video.c invaders-fixed/video.c
+--- invaders/video.c 2001-05-13 15:56:33.000000000 +0200
++++ invaders-fixed/video.c 2009-04-13 17:01:22.000000000 +0200
+@@ -36,7 +36,7 @@
+ video_putchar(x+1,y,hextab[hex&15]);
+ };
+
+-void video_putstring(int32 x, int32 y, uint8 *str)
++void video_putstring(int32 x, int32 y, char *str)
+ {
+ while (*str) video_putchar(x++,y,*(str++));
+ };
+diff -ur invaders/video.h invaders-fixed/video.h
+--- invaders/video.h 2001-05-13 15:56:33.000000000 +0200
++++ invaders-fixed/video.h 2009-04-13 17:01:05.000000000 +0200
+@@ -8,7 +8,7 @@
+ void video_putchar(int32 x, int32 y, uint8 code);
+ void video_fill(int32 x, int32 y, int32 width, int32 height, uint8 code);
+ void video_puthex8(int32 x, int32 y, uint8 hex);
+-void video_putstring(int32 x, int32 y, uint8 *str);
++void video_putstring(int32 x, int32 y, char *str);
+
+ // immediate effect
+ void video_update();
diff --git a/resources/libreboot/config/libpayload/config b/resources/libreboot/config/libpayload/config
new file mode 100644
index 0000000..28e1b8b
--- /dev/null
+++ b/resources/libreboot/config/libpayload/config
@@ -0,0 +1,71 @@
+#
+# Automatically generated make config: don't edit
+# libpayload version: 0.2.0
+# Sun Aug 24 05:04:19 2014
+#
+
+#
+# Generic Options
+#
+# CONFIG_LP_EXPERIMENTAL is not set
+# CONFIG_LP_OBSOLETE is not set
+# CONFIG_LP_DEVELOPER is not set
+# CONFIG_LP_CHROMEOS is not set
+
+#
+# Architecture Options
+#
+# CONFIG_LP_ARCH_ARMV7 is not set
+CONFIG_LP_ARCH_X86=y
+# CONFIG_LP_MEMMAP_RAM_ONLY is not set
+CONFIG_LP_MULTIBOOT=y
+
+#
+# Standard Libraries
+#
+CONFIG_LP_LIBC=y
+CONFIG_LP_CURSES=y
+CONFIG_LP_TINYCURSES=y
+# CONFIG_LP_PDCURSES is not set
+CONFIG_LP_CBFS=y
+CONFIG_LP_LZMA=y
+
+#
+# Console Options
+#
+# CONFIG_LP_SKIP_CONSOLE_INIT is not set
+CONFIG_LP_CBMEM_CONSOLE=y
+CONFIG_LP_SERIAL_CONSOLE=y
+CONFIG_LP_X86_SERIAL_CONSOLE=y
+CONFIG_LP_SERIAL_IOBASE=0x3f8
+# CONFIG_LP_SERIAL_SET_SPEED is not set
+# CONFIG_LP_SERIAL_ACS_FALLBACK is not set
+CONFIG_LP_VIDEO_CONSOLE=y
+CONFIG_LP_VGA_VIDEO_CONSOLE=y
+# CONFIG_LP_GEODELX_VIDEO_CONSOLE is not set
+# CONFIG_LP_COREBOOT_VIDEO_CONSOLE is not set
+CONFIG_LP_PC_KEYBOARD=y
+CONFIG_LP_PC_KEYBOARD_LAYOUT_US=y
+# CONFIG_LP_PC_KEYBOARD_LAYOUT_DE is not set
+
+#
+# Drivers
+#
+CONFIG_LP_PCI=y
+CONFIG_LP_NVRAM=y
+# CONFIG_LP_RTC_PORT_EXTENDED_VIA is not set
+CONFIG_LP_SPEAKER=y
+CONFIG_LP_STORAGE=y
+# CONFIG_LP_STORAGE_64BIT_LBA is not set
+CONFIG_LP_STORAGE_ATA=y
+CONFIG_LP_STORAGE_ATAPI=y
+CONFIG_LP_STORAGE_AHCI=y
+CONFIG_LP_STORAGE_AHCI_ONLY_TESTED=y
+# CONFIG_LP_USB is not set
+# CONFIG_LP_USB_GEN_HUB is not set
+CONFIG_LP_USB_PCI=y
+# CONFIG_LP_USB_MEMORY is not set
+# CONFIG_LP_BIG_ENDIAN is not set
+CONFIG_LP_LITTLE_ENDIAN=y
+CONFIG_LP_IO_ADDRESS_SPACE=y
+CONFIG_LP_ARCH_SPECIFIC_OPTIONS=y
diff --git a/resources/libreboot/config/macbook21/config b/resources/libreboot/config/macbook21/config
index 63af035..2bb0cb7 100644
--- a/resources/libreboot/config/macbook21/config
+++ b/resources/libreboot/config/macbook21/config
@@ -19,7 +19,7 @@ CONFIG_COMPRESS_RAMSTAGE=y
CONFIG_INCLUDE_CONFIG_FILE=y
CONFIG_EARLY_CBMEM_INIT=y
# CONFIG_BROKEN_CAR_MIGRATE is not set
-# CONFIG_DYNAMIC_CBMEM is not set
+CONFIG_DYNAMIC_CBMEM=y
# CONFIG_COLLECT_TIMESTAMPS is not set
# CONFIG_USE_BLOBS is not set
# CONFIG_COVERAGE is not set
@@ -111,14 +111,15 @@ CONFIG_VGA_BIOS_ID="8086,27a2"
CONFIG_DRIVERS_PS2_KEYBOARD=y
# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set
# CONFIG_VGA_BIOS is not set
+# CONFIG_CONSOLE_POST is not set
# CONFIG_UDELAY_IO is not set
CONFIG_DCACHE_RAM_BASE=0xffdf8000
CONFIG_DCACHE_RAM_SIZE=0x8000
CONFIG_ACPI_SSDTX_NUM=0
+# CONFIG_BOARD_APPLE_MACBOOK11 is not set
CONFIG_BOARD_APPLE_MACBOOK21=y
CONFIG_MMCONF_BASE_ADDRESS=0xf0000000
CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="Apple Inc."
-CONFIG_SEABIOS_PS2_TIMEOUT=3000
# CONFIG_PCI_64BIT_PREF_MEM is not set
CONFIG_UART_FOR_CONSOLE=0
CONFIG_ID_SECTION_OFFSET=0x80
@@ -128,8 +129,11 @@ CONFIG_ID_SECTION_OFFSET=0x80
CONFIG_STACK_SIZE=0x1000
CONFIG_CACHE_ROM_SIZE_OVERRIDE=0
CONFIG_CBFS_SIZE=0x200000
+CONFIG_POST_IO=y
+CONFIG_POST_DEVICE=y
+CONFIG_SEABIOS_PS2_TIMEOUT=0
CONFIG_MAINBOARD_VERSION="1.0"
-CONFIG_CPU_ADDR_BITS=32
+CONFIG_CPU_ADDR_BITS=36
CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8
# CONFIG_USBDEBUG is not set
CONFIG_MAXIMUM_SUPPORTED_FREQUENCY=0
@@ -168,6 +172,8 @@ CONFIG_HPET_ADDRESS=0xfed00000
# CONFIG_ARCH_BOOTBLOCK_ARMV7 is not set
# CONFIG_ARCH_ROMSTAGE_ARMV7 is not set
# CONFIG_ARCH_RAMSTAGE_ARMV7 is not set
+# CONFIG_CPU_HAS_BOOTBLOCK_INIT is not set
+# CONFIG_MAINBOARD_HAS_BOOTBLOCK_INIT is not set
# CONFIG_MAINBOARD_HAS_CHROMEOS is not set
CONFIG_BOOTBLOCK_SIMPLE=y
# CONFIG_BOOTBLOCK_NORMAL is not set
@@ -189,7 +195,6 @@ CONFIG_BOOTBLOCK_SOURCE="bootblock_simple.c"
CONFIG_SOCKET_SPECIFIC_OPTIONS=y
CONFIG_XIP_ROM_SIZE=0x10000
# CONFIG_CPU_AMD_AGESA is not set
-CONFIG_HIGH_SCRATCH_MEMORY_SIZE=0x0
CONFIG_CPU_INTEL_MODEL_6EX=y
CONFIG_CPU_INTEL_MODEL_6FX=y
CONFIG_SMM_TSEG_SIZE=0
@@ -261,18 +266,20 @@ CONFIG_SOUTHBRIDGE_INTEL_I82801GX=y
#
# SoC
#
+# CONFIG_SOC_NVIDIA_TEGRA124 is not set
#
# Devices
#
CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y
-# CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG is not set
+CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG=y
CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y
# CONFIG_VGA_ROM_RUN is not set
# CONFIG_ON_DEVICE_ROM_RUN is not set
# CONFIG_PCI_OPTION_ROM_RUN_REALMODE is not set
# CONFIG_PCI_OPTION_ROM_RUN_YABEL is not set
# CONFIG_MULTIPLE_VGA_ADAPTERS is not set
+# CONFIG_SPD_CACHE is not set
CONFIG_PCI=y
# CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT is not set
CONFIG_PCIX_PLUGIN_SUPPORT=y
@@ -292,6 +299,7 @@ CONFIG_PCI_BUS_SEGN_BITS=0
#
# Display
#
+# CONFIG_FRAMEBUFFER_KEEP_VESA_MODE is not set
#
# PXE ROM
@@ -304,6 +312,7 @@ CONFIG_SUBSYSTEM_DEVICE_ID=0x0000
# Generic Drivers
#
# CONFIG_DRIVERS_I2C_RTD2132 is not set
+# CONFIG_I2C_TPM is not set
# CONFIG_INTEL_DP is not set
# CONFIG_INTEL_DDI is not set
CONFIG_INTEL_EDID=y
@@ -311,7 +320,7 @@ CONFIG_INTEL_EDID=y
# CONFIG_DRIVERS_LENOVO_WACOM is not set
# CONFIG_DRIVER_MAXIM_MAX77686 is not set
# CONFIG_DRIVER_PARADE_PS8625 is not set
-# CONFIG_TPM is not set
+# CONFIG_LPC_TPM is not set
# CONFIG_DRIVERS_SIL_3114 is not set
# CONFIG_SPI_FLASH is not set
# CONFIG_DRIVER_TI_TPS65090 is not set
@@ -325,6 +334,7 @@ CONFIG_DRIVERS_UART_8250IO=y
CONFIG_HAVE_USBDEBUG=y
# CONFIG_HAVE_USBDEBUG_OPTIONS is not set
# CONFIG_DRIVER_XPOWERS_AXP209 is not set
+# CONFIG_TPM is not set
CONFIG_MMCONF_SUPPORT_DEFAULT=y
CONFIG_MMCONF_SUPPORT=y
# CONFIG_BOOTMODE_STRAPS is not set
@@ -362,11 +372,10 @@ CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set
# CONFIG_NO_POST is not set
# CONFIG_CMOS_POST is not set
-# CONFIG_POST_IO is not set
-CONFIG_POST_DEVICE=y
CONFIG_POST_DEVICE_NONE=y
# CONFIG_POST_DEVICE_LPC is not set
# CONFIG_POST_DEVICE_PCI_PCIE is not set
+CONFIG_POST_IO_PORT=0x80
CONFIG_HAVE_ACPI_RESUME=y
# CONFIG_HAVE_ACPI_SLIC is not set
CONFIG_HAVE_HARD_RESET=y
@@ -378,10 +387,9 @@ CONFIG_HAVE_SMI_HANDLER=y
# CONFIG_PCI_IO_CFG_EXT is not set
CONFIG_IOAPIC=y
CONFIG_USE_WATCHDOG_ON_BOOT=y
-# CONFIG_VGA is not set
+CONFIG_VGA=y
# CONFIG_GFXUMA is not set
# CONFIG_RELOCATABLE_MODULES is not set
-# CONFIG_HAVE_REFCODE_BLOB is not set
CONFIG_HAVE_ACPI_TABLES=y
CONFIG_HAVE_MP_TABLE=y
CONFIG_HAVE_PIRQ_TABLE=y
diff --git a/resources/libreboot/config/t60/config b/resources/libreboot/config/t60/config
index d5754ff..395d555 100644
--- a/resources/libreboot/config/t60/config
+++ b/resources/libreboot/config/t60/config
@@ -19,7 +19,7 @@ CONFIG_COMPRESS_RAMSTAGE=y
CONFIG_INCLUDE_CONFIG_FILE=y
CONFIG_EARLY_CBMEM_INIT=y
# CONFIG_BROKEN_CAR_MIGRATE is not set
-# CONFIG_DYNAMIC_CBMEM is not set
+CONFIG_DYNAMIC_CBMEM=y
# CONFIG_COLLECT_TIMESTAMPS is not set
# CONFIG_USE_BLOBS is not set
# CONFIG_COVERAGE is not set
@@ -111,13 +111,13 @@ CONFIG_VGA_BIOS_ID="8086,27a2"
CONFIG_DRIVERS_PS2_KEYBOARD=y
# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set
# CONFIG_VGA_BIOS is not set
+# CONFIG_CONSOLE_POST is not set
# CONFIG_UDELAY_IO is not set
CONFIG_DCACHE_RAM_BASE=0xffdf8000
CONFIG_DCACHE_RAM_SIZE=0x8000
CONFIG_ACPI_SSDTX_NUM=0
CONFIG_MMCONF_BASE_ADDRESS=0xf0000000
CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO"
-CONFIG_SEABIOS_PS2_TIMEOUT=3000
# CONFIG_PCI_64BIT_PREF_MEM is not set
CONFIG_UART_FOR_CONSOLE=0
CONFIG_ID_SECTION_OFFSET=0x80
@@ -127,14 +127,18 @@ CONFIG_ID_SECTION_OFFSET=0x80
CONFIG_STACK_SIZE=0x1000
CONFIG_CACHE_ROM_SIZE_OVERRIDE=0
CONFIG_CBFS_SIZE=0x200000
+CONFIG_POST_IO=y
+CONFIG_POST_DEVICE=y
# CONFIG_BOARD_LENOVO_X60 is not set
+# CONFIG_BOARD_LENOVO_X200 is not set
# CONFIG_BOARD_LENOVO_X201 is not set
# CONFIG_BOARD_LENOVO_X230 is not set
# CONFIG_BOARD_LENOVO_T520 is not set
# CONFIG_BOARD_LENOVO_T530 is not set
CONFIG_BOARD_LENOVO_T60=y
+CONFIG_SEABIOS_PS2_TIMEOUT=3000
CONFIG_MAINBOARD_VERSION="ThinkPad T60"
-CONFIG_CPU_ADDR_BITS=32
+CONFIG_CPU_ADDR_BITS=36
CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8
# CONFIG_USBDEBUG is not set
CONFIG_MAXIMUM_SUPPORTED_FREQUENCY=0
@@ -173,6 +177,8 @@ CONFIG_HPET_ADDRESS=0xfed00000
# CONFIG_ARCH_BOOTBLOCK_ARMV7 is not set
# CONFIG_ARCH_ROMSTAGE_ARMV7 is not set
# CONFIG_ARCH_RAMSTAGE_ARMV7 is not set
+# CONFIG_CPU_HAS_BOOTBLOCK_INIT is not set
+# CONFIG_MAINBOARD_HAS_BOOTBLOCK_INIT is not set
# CONFIG_MAINBOARD_HAS_CHROMEOS is not set
CONFIG_BOOTBLOCK_SIMPLE=y
# CONFIG_BOOTBLOCK_NORMAL is not set
@@ -194,7 +200,6 @@ CONFIG_BOOTBLOCK_SOURCE="bootblock_simple.c"
CONFIG_SOCKET_SPECIFIC_OPTIONS=y
CONFIG_XIP_ROM_SIZE=0x10000
# CONFIG_CPU_AMD_AGESA is not set
-CONFIG_HIGH_SCRATCH_MEMORY_SIZE=0x0
CONFIG_CPU_INTEL_MODEL_6EX=y
CONFIG_CPU_INTEL_MODEL_6FX=y
CONFIG_SMM_TSEG_SIZE=0
@@ -273,18 +278,20 @@ CONFIG_EC_LENOVO_PMH7=y
#
# SoC
#
+# CONFIG_SOC_NVIDIA_TEGRA124 is not set
#
# Devices
#
CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y
-# CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG is not set
+CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG=y
CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y
# CONFIG_VGA_ROM_RUN is not set
# CONFIG_ON_DEVICE_ROM_RUN is not set
# CONFIG_PCI_OPTION_ROM_RUN_REALMODE is not set
# CONFIG_PCI_OPTION_ROM_RUN_YABEL is not set
# CONFIG_MULTIPLE_VGA_ADAPTERS is not set
+# CONFIG_SPD_CACHE is not set
CONFIG_PCI=y
# CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT is not set
CONFIG_PCIX_PLUGIN_SUPPORT=y
@@ -304,6 +311,7 @@ CONFIG_PCI_BUS_SEGN_BITS=0
#
# Display
#
+# CONFIG_FRAMEBUFFER_KEEP_VESA_MODE is not set
#
# PXE ROM
@@ -316,6 +324,7 @@ CONFIG_SUBSYSTEM_DEVICE_ID=0x0000
# Generic Drivers
#
# CONFIG_DRIVERS_I2C_RTD2132 is not set
+# CONFIG_I2C_TPM is not set
CONFIG_DRIVERS_ICS_954309=y
# CONFIG_INTEL_DP is not set
# CONFIG_INTEL_DDI is not set
@@ -324,7 +333,7 @@ CONFIG_INTEL_EDID=y
# CONFIG_DRIVERS_LENOVO_WACOM is not set
# CONFIG_DRIVER_MAXIM_MAX77686 is not set
# CONFIG_DRIVER_PARADE_PS8625 is not set
-# CONFIG_TPM is not set
+# CONFIG_LPC_TPM is not set
# CONFIG_DRIVERS_SIL_3114 is not set
# CONFIG_SPI_FLASH is not set
# CONFIG_DRIVER_TI_TPS65090 is not set
@@ -338,6 +347,7 @@ CONFIG_DRIVERS_UART_8250IO=y
CONFIG_HAVE_USBDEBUG=y
# CONFIG_HAVE_USBDEBUG_OPTIONS is not set
# CONFIG_DRIVER_XPOWERS_AXP209 is not set
+# CONFIG_TPM is not set
CONFIG_MMCONF_SUPPORT_DEFAULT=y
CONFIG_MMCONF_SUPPORT=y
# CONFIG_BOOTMODE_STRAPS is not set
@@ -375,11 +385,10 @@ CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set
# CONFIG_NO_POST is not set
# CONFIG_CMOS_POST is not set
-# CONFIG_POST_IO is not set
-CONFIG_POST_DEVICE=y
CONFIG_POST_DEVICE_NONE=y
# CONFIG_POST_DEVICE_LPC is not set
# CONFIG_POST_DEVICE_PCI_PCIE is not set
+CONFIG_POST_IO_PORT=0x80
CONFIG_HAVE_ACPI_RESUME=y
# CONFIG_HAVE_ACPI_SLIC is not set
CONFIG_HAVE_HARD_RESET=y
@@ -391,10 +400,9 @@ CONFIG_HAVE_SMI_HANDLER=y
# CONFIG_PCI_IO_CFG_EXT is not set
CONFIG_IOAPIC=y
CONFIG_USE_WATCHDOG_ON_BOOT=y
-# CONFIG_VGA is not set
+CONFIG_VGA=y
# CONFIG_GFXUMA is not set
# CONFIG_RELOCATABLE_MODULES is not set
-# CONFIG_HAVE_REFCODE_BLOB is not set
CONFIG_HAVE_ACPI_TABLES=y
CONFIG_HAVE_MP_TABLE=y
CONFIG_HAVE_PIRQ_TABLE=y
diff --git a/resources/libreboot/config/x60/config b/resources/libreboot/config/x60/config
index fe56ceb..374a4c2 100644
--- a/resources/libreboot/config/x60/config
+++ b/resources/libreboot/config/x60/config
@@ -19,7 +19,7 @@ CONFIG_COMPRESS_RAMSTAGE=y
CONFIG_INCLUDE_CONFIG_FILE=y
CONFIG_EARLY_CBMEM_INIT=y
# CONFIG_BROKEN_CAR_MIGRATE is not set
-# CONFIG_DYNAMIC_CBMEM is not set
+CONFIG_DYNAMIC_CBMEM=y
# CONFIG_COLLECT_TIMESTAMPS is not set
# CONFIG_USE_BLOBS is not set
# CONFIG_COVERAGE is not set
@@ -111,13 +111,13 @@ CONFIG_VGA_BIOS_ID="8086,27a2"
CONFIG_DRIVERS_PS2_KEYBOARD=y
# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set
# CONFIG_VGA_BIOS is not set
+# CONFIG_CONSOLE_POST is not set
# CONFIG_UDELAY_IO is not set
CONFIG_DCACHE_RAM_BASE=0xffdf8000
CONFIG_DCACHE_RAM_SIZE=0x8000
CONFIG_ACPI_SSDTX_NUM=0
CONFIG_MMCONF_BASE_ADDRESS=0xf0000000
CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO"
-CONFIG_SEABIOS_PS2_TIMEOUT=3000
# CONFIG_PCI_64BIT_PREF_MEM is not set
CONFIG_UART_FOR_CONSOLE=0
CONFIG_ID_SECTION_OFFSET=0x80
@@ -127,14 +127,18 @@ CONFIG_ID_SECTION_OFFSET=0x80
CONFIG_STACK_SIZE=0x1000
CONFIG_CACHE_ROM_SIZE_OVERRIDE=0
CONFIG_CBFS_SIZE=0x200000
+CONFIG_POST_IO=y
+CONFIG_POST_DEVICE=y
CONFIG_BOARD_LENOVO_X60=y
+# CONFIG_BOARD_LENOVO_X200 is not set
# CONFIG_BOARD_LENOVO_X201 is not set
# CONFIG_BOARD_LENOVO_X230 is not set
# CONFIG_BOARD_LENOVO_T520 is not set
# CONFIG_BOARD_LENOVO_T530 is not set
# CONFIG_BOARD_LENOVO_T60 is not set
+CONFIG_SEABIOS_PS2_TIMEOUT=3000
CONFIG_MAINBOARD_VERSION="ThinkPad X60s"
-CONFIG_CPU_ADDR_BITS=32
+CONFIG_CPU_ADDR_BITS=36
CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8
# CONFIG_USBDEBUG is not set
CONFIG_MAXIMUM_SUPPORTED_FREQUENCY=0
@@ -173,6 +177,8 @@ CONFIG_HPET_ADDRESS=0xfed00000
# CONFIG_ARCH_BOOTBLOCK_ARMV7 is not set
# CONFIG_ARCH_ROMSTAGE_ARMV7 is not set
# CONFIG_ARCH_RAMSTAGE_ARMV7 is not set
+# CONFIG_CPU_HAS_BOOTBLOCK_INIT is not set
+# CONFIG_MAINBOARD_HAS_BOOTBLOCK_INIT is not set
# CONFIG_MAINBOARD_HAS_CHROMEOS is not set
CONFIG_BOOTBLOCK_SIMPLE=y
# CONFIG_BOOTBLOCK_NORMAL is not set
@@ -194,7 +200,6 @@ CONFIG_BOOTBLOCK_SOURCE="bootblock_simple.c"
CONFIG_SOCKET_SPECIFIC_OPTIONS=y
CONFIG_XIP_ROM_SIZE=0x10000
# CONFIG_CPU_AMD_AGESA is not set
-CONFIG_HIGH_SCRATCH_MEMORY_SIZE=0x0
CONFIG_CPU_INTEL_MODEL_6EX=y
CONFIG_CPU_INTEL_MODEL_6FX=y
CONFIG_SMM_TSEG_SIZE=0
@@ -273,18 +278,20 @@ CONFIG_EC_LENOVO_PMH7=y
#
# SoC
#
+# CONFIG_SOC_NVIDIA_TEGRA124 is not set
#
# Devices
#
CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y
-# CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG is not set
+CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG=y
CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y
# CONFIG_VGA_ROM_RUN is not set
# CONFIG_ON_DEVICE_ROM_RUN is not set
# CONFIG_PCI_OPTION_ROM_RUN_REALMODE is not set
# CONFIG_PCI_OPTION_ROM_RUN_YABEL is not set
# CONFIG_MULTIPLE_VGA_ADAPTERS is not set
+# CONFIG_SPD_CACHE is not set
CONFIG_PCI=y
# CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT is not set
CONFIG_PCIX_PLUGIN_SUPPORT=y
@@ -304,6 +311,7 @@ CONFIG_PCI_BUS_SEGN_BITS=0
#
# Display
#
+# CONFIG_FRAMEBUFFER_KEEP_VESA_MODE is not set
#
# PXE ROM
@@ -316,6 +324,7 @@ CONFIG_SUBSYSTEM_DEVICE_ID=0x0000
# Generic Drivers
#
# CONFIG_DRIVERS_I2C_RTD2132 is not set
+# CONFIG_I2C_TPM is not set
CONFIG_DRIVERS_ICS_954309=y
# CONFIG_INTEL_DP is not set
# CONFIG_INTEL_DDI is not set
@@ -327,7 +336,7 @@ CONFIG_DIGITIZER_AUTODETECT=y
# CONFIG_DIGITIZER_ABSENT is not set
# CONFIG_DRIVER_MAXIM_MAX77686 is not set
# CONFIG_DRIVER_PARADE_PS8625 is not set
-# CONFIG_TPM is not set
+# CONFIG_LPC_TPM is not set
# CONFIG_DRIVERS_SIL_3114 is not set
# CONFIG_SPI_FLASH is not set
# CONFIG_DRIVER_TI_TPS65090 is not set
@@ -341,6 +350,7 @@ CONFIG_DRIVERS_UART_8250IO=y
CONFIG_HAVE_USBDEBUG=y
# CONFIG_HAVE_USBDEBUG_OPTIONS is not set
# CONFIG_DRIVER_XPOWERS_AXP209 is not set
+# CONFIG_TPM is not set
CONFIG_MMCONF_SUPPORT_DEFAULT=y
CONFIG_MMCONF_SUPPORT=y
# CONFIG_BOOTMODE_STRAPS is not set
@@ -378,11 +388,10 @@ CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set
# CONFIG_NO_POST is not set
# CONFIG_CMOS_POST is not set
-# CONFIG_POST_IO is not set
-CONFIG_POST_DEVICE=y
CONFIG_POST_DEVICE_NONE=y
# CONFIG_POST_DEVICE_LPC is not set
# CONFIG_POST_DEVICE_PCI_PCIE is not set
+CONFIG_POST_IO_PORT=0x80
CONFIG_HAVE_ACPI_RESUME=y
# CONFIG_HAVE_ACPI_SLIC is not set
CONFIG_HAVE_HARD_RESET=y
@@ -394,10 +403,9 @@ CONFIG_HAVE_SMI_HANDLER=y
# CONFIG_PCI_IO_CFG_EXT is not set
CONFIG_IOAPIC=y
CONFIG_USE_WATCHDOG_ON_BOOT=y
-# CONFIG_VGA is not set
+CONFIG_VGA=y
# CONFIG_GFXUMA is not set
# CONFIG_RELOCATABLE_MODULES is not set
-# CONFIG_HAVE_REFCODE_BLOB is not set
CONFIG_HAVE_ACPI_TABLES=y
CONFIG_HAVE_MP_TABLE=y
CONFIG_HAVE_PIRQ_TABLE=y
diff --git a/resources/libreboot/config/x60t/config b/resources/libreboot/config/x60t/config
index f698057..4621343 100644
--- a/resources/libreboot/config/x60t/config
+++ b/resources/libreboot/config/x60t/config
@@ -19,7 +19,7 @@ CONFIG_COMPRESS_RAMSTAGE=y
CONFIG_INCLUDE_CONFIG_FILE=y
CONFIG_EARLY_CBMEM_INIT=y
# CONFIG_BROKEN_CAR_MIGRATE is not set
-# CONFIG_DYNAMIC_CBMEM is not set
+CONFIG_DYNAMIC_CBMEM=y
# CONFIG_COLLECT_TIMESTAMPS is not set
# CONFIG_USE_BLOBS is not set
# CONFIG_COVERAGE is not set
@@ -111,30 +111,31 @@ CONFIG_VGA_BIOS_ID="8086,27a2"
CONFIG_DRIVERS_PS2_KEYBOARD=y
# CONFIG_ONBOARD_VGA_IS_PRIMARY is not set
# CONFIG_VGA_BIOS is not set
+# CONFIG_CONSOLE_POST is not set
# CONFIG_UDELAY_IO is not set
CONFIG_DCACHE_RAM_BASE=0xffdf8000
CONFIG_DCACHE_RAM_SIZE=0x8000
CONFIG_ACPI_SSDTX_NUM=0
CONFIG_MMCONF_BASE_ADDRESS=0xf0000000
CONFIG_MAINBOARD_SMBIOS_MANUFACTURER="LENOVO"
-CONFIG_SEABIOS_PS2_TIMEOUT=3000
# CONFIG_PCI_64BIT_PREF_MEM is not set
CONFIG_UART_FOR_CONSOLE=0
CONFIG_ID_SECTION_OFFSET=0x80
-# CONFIG_BOARD_EMULATION_QEMU_X86_I440FX is not set
-# CONFIG_BOARD_EMULATION_QEMU_X86_Q35 is not set
-# CONFIG_BOARD_EMULATION_QEMU_ARMV7 is not set
CONFIG_STACK_SIZE=0x1000
CONFIG_CACHE_ROM_SIZE_OVERRIDE=0
CONFIG_CBFS_SIZE=0x200000
+CONFIG_POST_IO=y
+CONFIG_POST_DEVICE=y
CONFIG_BOARD_LENOVO_X60=y
+# CONFIG_BOARD_LENOVO_X200 is not set
# CONFIG_BOARD_LENOVO_X201 is not set
# CONFIG_BOARD_LENOVO_X230 is not set
# CONFIG_BOARD_LENOVO_T520 is not set
# CONFIG_BOARD_LENOVO_T530 is not set
# CONFIG_BOARD_LENOVO_T60 is not set
+CONFIG_SEABIOS_PS2_TIMEOUT=3000
CONFIG_MAINBOARD_VERSION="ThinkPad X60 Tablet"
-CONFIG_CPU_ADDR_BITS=32
+CONFIG_CPU_ADDR_BITS=36
CONFIG_DEFAULT_CONSOLE_LOGLEVEL=8
# CONFIG_USBDEBUG is not set
CONFIG_MAXIMUM_SUPPORTED_FREQUENCY=0
@@ -173,6 +174,8 @@ CONFIG_HPET_ADDRESS=0xfed00000
# CONFIG_ARCH_BOOTBLOCK_ARMV7 is not set
# CONFIG_ARCH_ROMSTAGE_ARMV7 is not set
# CONFIG_ARCH_RAMSTAGE_ARMV7 is not set
+# CONFIG_CPU_HAS_BOOTBLOCK_INIT is not set
+# CONFIG_MAINBOARD_HAS_BOOTBLOCK_INIT is not set
# CONFIG_MAINBOARD_HAS_CHROMEOS is not set
CONFIG_BOOTBLOCK_SIMPLE=y
# CONFIG_BOOTBLOCK_NORMAL is not set
@@ -194,7 +197,6 @@ CONFIG_BOOTBLOCK_SOURCE="bootblock_simple.c"
CONFIG_SOCKET_SPECIFIC_OPTIONS=y
CONFIG_XIP_ROM_SIZE=0x10000
# CONFIG_CPU_AMD_AGESA is not set
-CONFIG_HIGH_SCRATCH_MEMORY_SIZE=0x0
CONFIG_CPU_INTEL_MODEL_6EX=y
CONFIG_CPU_INTEL_MODEL_6FX=y
CONFIG_SMM_TSEG_SIZE=0
@@ -273,18 +275,18 @@ CONFIG_EC_LENOVO_PMH7=y
#
# SoC
#
+# CONFIG_SOC_NVIDIA_TEGRA124 is not set
#
# Devices
#
CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT=y
-# CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG is not set
+CONFIG_MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG=y
CONFIG_MAINBOARD_DO_NATIVE_VGA_INIT=y
# CONFIG_VGA_ROM_RUN is not set
# CONFIG_ON_DEVICE_ROM_RUN is not set
-# CONFIG_PCI_OPTION_ROM_RUN_REALMODE is not set
-# CONFIG_PCI_OPTION_ROM_RUN_YABEL is not set
# CONFIG_MULTIPLE_VGA_ADAPTERS is not set
+# CONFIG_SPD_CACHE is not set
CONFIG_PCI=y
# CONFIG_HYPERTRANSPORT_PLUGIN_SUPPORT is not set
CONFIG_PCIX_PLUGIN_SUPPORT=y
@@ -304,6 +306,7 @@ CONFIG_PCI_BUS_SEGN_BITS=0
#
# Display
#
+# CONFIG_FRAMEBUFFER_KEEP_VESA_MODE is not set
#
# PXE ROM
@@ -316,6 +319,7 @@ CONFIG_SUBSYSTEM_DEVICE_ID=0x0000
# Generic Drivers
#
# CONFIG_DRIVERS_I2C_RTD2132 is not set
+# CONFIG_I2C_TPM is not set
CONFIG_DRIVERS_ICS_954309=y
# CONFIG_INTEL_DP is not set
# CONFIG_INTEL_DDI is not set
@@ -327,7 +331,7 @@ CONFIG_DIGITIZER_PRESENT=y
# CONFIG_DIGITIZER_ABSENT is not set
# CONFIG_DRIVER_MAXIM_MAX77686 is not set
# CONFIG_DRIVER_PARADE_PS8625 is not set
-# CONFIG_TPM is not set
+# CONFIG_LPC_TPM is not set
# CONFIG_DRIVERS_SIL_3114 is not set
# CONFIG_SPI_FLASH is not set
# CONFIG_DRIVER_TI_TPS65090 is not set
@@ -341,6 +345,7 @@ CONFIG_DRIVERS_UART_8250IO=y
CONFIG_HAVE_USBDEBUG=y
# CONFIG_HAVE_USBDEBUG_OPTIONS is not set
# CONFIG_DRIVER_XPOWERS_AXP209 is not set
+# CONFIG_TPM is not set
CONFIG_MMCONF_SUPPORT_DEFAULT=y
CONFIG_MMCONF_SUPPORT=y
# CONFIG_BOOTMODE_STRAPS is not set
@@ -378,11 +383,10 @@ CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y
# CONFIG_DEFAULT_CONSOLE_LOGLEVEL_0 is not set
# CONFIG_NO_POST is not set
# CONFIG_CMOS_POST is not set
-# CONFIG_POST_IO is not set
-CONFIG_POST_DEVICE=y
CONFIG_POST_DEVICE_NONE=y
# CONFIG_POST_DEVICE_LPC is not set
# CONFIG_POST_DEVICE_PCI_PCIE is not set
+CONFIG_POST_IO_PORT=0x80
CONFIG_HAVE_ACPI_RESUME=y
# CONFIG_HAVE_ACPI_SLIC is not set
CONFIG_HAVE_HARD_RESET=y
@@ -394,10 +398,9 @@ CONFIG_HAVE_SMI_HANDLER=y
# CONFIG_PCI_IO_CFG_EXT is not set
CONFIG_IOAPIC=y
CONFIG_USE_WATCHDOG_ON_BOOT=y
-# CONFIG_VGA is not set
+CONFIG_VGA=y
# CONFIG_GFXUMA is not set
# CONFIG_RELOCATABLE_MODULES is not set
-# CONFIG_HAVE_REFCODE_BLOB is not set
CONFIG_HAVE_ACPI_TABLES=y
CONFIG_HAVE_MP_TABLE=y
CONFIG_HAVE_PIRQ_TABLE=y
@@ -420,8 +423,6 @@ CONFIG_PAYLOAD_ELF=y
# CONFIG_PAYLOAD_FILO is not set
# CONFIG_PAYLOAD_GRUB2 is not set
# CONFIG_PAYLOAD_TIANOCORE is not set
-# CONFIG_SEABIOS_STABLE is not set
-# CONFIG_SEABIOS_MASTER is not set
# CONFIG_SEABIOS_THREAD_OPTIONROMS is not set
CONFIG_PAYLOAD_FILE="grub.elf"
CONFIG_COMPRESSED_PAYLOAD_LZMA=y
diff --git a/resources/libreboot/patch/0000_t60_6723_and_6725_1_extension_textmode.git.diff b/resources/libreboot/patch/0000_t60_6723_and_6725_1_extension_textmode.git.diff
new file mode 100644
index 0000000..7f20c1f
--- /dev/null
+++ b/resources/libreboot/patch/0000_t60_6723_and_6725_1_extension_textmode.git.diff
@@ -0,0 +1,12 @@
+diff --git a/src/mainboard/lenovo/t60/Kconfig b/src/mainboard/lenovo/t60/Kconfig
+index 5903c8b..e2638d8 100644
+--- a/src/mainboard/lenovo/t60/Kconfig
++++ b/src/mainboard/lenovo/t60/Kconfig
+@@ -20,6 +20,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
+ select HAVE_ACPI_TABLES
+ select HAVE_ACPI_RESUME
+ select MAINBOARD_HAS_NATIVE_VGA_INIT
++ select MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG
+ select H8_DOCK_EARLY_INIT
+ select HAVE_CMOS_DEFAULT
+ select INTEL_EDID
diff --git a/resources/libreboot/patch/0000_x60t_digitizer_irda.git.diff b/resources/libreboot/patch/0000_x60t_digitizer_irda.git.diff
deleted file mode 100644
index 11010d5..0000000
--- a/resources/libreboot/patch/0000_x60t_digitizer_irda.git.diff
+++ /dev/null
@@ -1,525 +0,0 @@
-diff --git a/src/drivers/Kconfig b/src/drivers/Kconfig
-index 874ec75..42d1583 100644
---- a/src/drivers/Kconfig
-+++ b/src/drivers/Kconfig
-@@ -26,6 +26,7 @@ source src/drivers/i2c/Kconfig
- source src/drivers/ics/Kconfig
- source src/drivers/intel/Kconfig
- source src/drivers/ipmi/Kconfig
-+source src/drivers/lenovo/Kconfig
- source src/drivers/maxim/Kconfig
- source src/drivers/parade/Kconfig
- if PC80_SYSTEM
-diff --git a/src/drivers/Makefile.inc b/src/drivers/Makefile.inc
-index 66fe7b8..cb26643 100644
---- a/src/drivers/Makefile.inc
-+++ b/src/drivers/Makefile.inc
-@@ -23,6 +23,7 @@ subdirs-y += emulation
- subdirs-y += generic
- subdirs-y += i2c
- subdirs-y += intel
-+subdirs-y += lenovo
- subdirs-y += maxim
- subdirs-y += net
- subdirs-y += parade
-diff --git a/src/drivers/lenovo/Kconfig b/src/drivers/lenovo/Kconfig
-index e69de29..30bacb9 100644
---- a/src/drivers/lenovo/Kconfig
-+++ b/src/drivers/lenovo/Kconfig
-@@ -0,0 +1,29 @@
-+config DRIVERS_LENOVO_WACOM
-+ bool
-+ default n
-+
-+if DRIVERS_LENOVO_WACOM
-+
-+choice
-+ prompt "Digitizer"
-+ default DIGITIZER_AUTODETECT
-+
-+config DIGITIZER_AUTODETECT
-+ bool "Autodetect"
-+ help
-+ The presence of digitizer is inferred from model number stored in
-+ AT24RF chip.
-+
-+config DIGITIZER_PRESENT
-+ bool "Present"
-+ help
-+ The digitizer is assumed to be present.
-+
-+config DIGITIZER_ABSENT
-+ bool "Absent"
-+ help
-+ The digitizer is assumed to be absent.
-+
-+endchoice
-+
-+endif
-diff --git a/src/drivers/lenovo/Makefile.inc b/src/drivers/lenovo/Makefile.inc
-index e69de29..c50db5b 100644
---- a/src/drivers/lenovo/Makefile.inc
-+++ b/src/drivers/lenovo/Makefile.inc
-@@ -0,0 +1 @@
-+ramstage-$(CONFIG_DRIVERS_LENOVO_WACOM) += wacom.c
-diff --git a/src/drivers/lenovo/lenovo.h b/src/drivers/lenovo/lenovo.h
-index e69de29..06b52e5 100644
---- a/src/drivers/lenovo/lenovo.h
-+++ b/src/drivers/lenovo/lenovo.h
-@@ -0,0 +1,4 @@
-+int drivers_lenovo_is_wacom_present(void);
-+void drivers_lenovo_serial_ports_ssdt_generate(const char *scope,
-+ int have_dock_serial,
-+ int have_infrared);
-diff --git a/src/drivers/lenovo/wacom.c b/src/drivers/lenovo/wacom.c
-index e69de29..ccccefd 100644
---- a/src/drivers/lenovo/wacom.c
-+++ b/src/drivers/lenovo/wacom.c
-@@ -0,0 +1,218 @@
-+/*
-+ * This file is part of the coreboot project.
-+ *
-+ * Copyright (C) 2014 Vladimir Serbinenko
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; version 2, or (at your
-+ * option) any later version, of the License.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-+ * MA 02110-1301 USA
-+ */
-+
-+#include <types.h>
-+#include <console/console.h>
-+#include <arch/acpi.h>
-+#include <arch/acpigen.h>
-+#include <device/device.h>
-+#include <device/pnp.h>
-+#include <string.h>
-+#include "lenovo.h"
-+#include "drivers/i2c/at24rf08c/lenovo.h"
-+
-+static const char tablet_numbers[][5] = {
-+ /* X60t. */
-+ "6363", "6364", "6365", "6366",
-+ "6367", "6368", "7762", "7763",
-+ "7764", "7767", "7768", "7769",
-+ /* X201t. */
-+ "0053", "0831", "2985", "3093",
-+ "3113", "3144", "3239", "4184",
-+ "7448", "7449", "7450", "7453",
-+ "2263", "2266",
-+};
-+
-+int
-+drivers_lenovo_is_wacom_present(void)
-+{
-+ const char *pn;
-+ int i;
-+ static int result = -1;
-+ device_t superio;
-+ u8 sioid;
-+
-+ if (result != -1)
-+ return result;
-+
-+ if (IS_ENABLED(CONFIG_DIGITIZER_PRESENT)) {
-+ printk (BIOS_INFO, "Digitizer state forced as present\n");
-+ return (result = 1);
-+ }
-+
-+ if (IS_ENABLED(CONFIG_DIGITIZER_ABSENT)) {
-+ printk (BIOS_INFO, "Digitizer state forced as absent\n");
-+ return (result = 0);
-+ }
-+
-+ superio = dev_find_slot_pnp (0x164e, 3);
-+ if (!superio) {
-+ printk (BIOS_INFO, "No Super I/O, skipping wacom\n");
-+ return (result = 0);
-+ }
-+
-+ /* Probe ID. */
-+ sioid = pnp_read_config(superio, 0x20);
-+ if (sioid == 0xff) {
-+ printk (BIOS_INFO, "Super I/O probe failed, skipping wacom\n");
-+ return (result = 0);
-+ }
-+
-+ pn = lenovo_mainboard_partnumber();
-+ if (!pn)
-+ return (result = 0);
-+ printk (BIOS_DEBUG, "Lenovo P/N is %s\n", pn);
-+ for (i = 0; i < ARRAY_SIZE (tablet_numbers); i++)
-+ if (memcmp (tablet_numbers[i], pn, 4) == 0) {
-+ printk (BIOS_DEBUG, "Lenovo P/N %s is a tablet\n", pn);
-+ return (result = 1);
-+ }
-+ printk (BIOS_DEBUG, "Lenovo P/N %s is not a tablet\n", pn);
-+ return (result = 0);
-+}
-+
-+void
-+drivers_lenovo_serial_ports_ssdt_generate(const char *scope,
-+ int have_dock_serial,
-+ int have_infrared)
-+{
-+ int scopelen, devicelen, reslen, methodlen;
-+
-+ scopelen = acpigen_write_scope(scope);
-+
-+ if (drivers_lenovo_is_wacom_present()) {
-+ /* Device op. */
-+ scopelen += acpigen_emit_byte(0x5b);
-+ scopelen += acpigen_emit_byte(0x82);
-+ devicelen = acpigen_write_len_f();
-+ devicelen += acpigen_emit_namestring("DTR");
-+
-+ devicelen += acpigen_write_name("_HID");
-+ devicelen += acpigen_emit_eisaid("WACF004");
-+
-+ devicelen += acpigen_write_name("_CRS");
-+
-+ reslen = acpigen_write_resourcetemplate_header();
-+ reslen += acpigen_write_io16(0x200, 0x200, 1, 8, 1);
-+ reslen += acpigen_write_irq((1 << 5));
-+
-+ devicelen += reslen;
-+ devicelen += acpigen_write_resourcetemplate_footer(reslen);
-+
-+ /* method op */
-+ devicelen += acpigen_emit_byte(0x14);
-+ methodlen = acpigen_write_len_f();
-+ methodlen += acpigen_emit_namestring("_STA");
-+ /* no fnarg */
-+ methodlen += acpigen_emit_byte(0x00);
-+ /* return */
-+ methodlen += acpigen_emit_byte(0xa4);
-+ methodlen += acpigen_write_byte(0xf);
-+
-+ acpigen_patch_len(methodlen);
-+ devicelen += methodlen;
-+
-+ acpigen_patch_len(devicelen - 1);
-+ scopelen += devicelen;
-+ }
-+
-+ if (have_infrared) {
-+ /* Device op. */
-+ scopelen += acpigen_emit_byte(0x5b);
-+ scopelen += acpigen_emit_byte(0x82);
-+ devicelen = acpigen_write_len_f();
-+ devicelen += acpigen_emit_namestring("FIR");
-+
-+ devicelen += acpigen_write_name("_HID");
-+ devicelen += acpigen_emit_eisaid("IBM0071");
-+ devicelen += acpigen_write_name("_CID");
-+ devicelen += acpigen_emit_eisaid("PNP0511");
-+ devicelen += acpigen_write_name("_UID");
-+
-+ /* One */
-+ devicelen += acpigen_write_byte(0x1);
-+ devicelen += acpigen_write_name("_CRS");
-+
-+ reslen = acpigen_write_resourcetemplate_header();
-+ reslen += acpigen_write_io16(0x2f8, 0x2f8, 1, 8, 1);
-+ reslen += acpigen_write_irq(0x08);
-+
-+ devicelen += reslen;
-+ devicelen += acpigen_write_resourcetemplate_footer(reslen);
-+
-+ /* method op */
-+ devicelen += acpigen_emit_byte(0x14);
-+ methodlen = acpigen_write_len_f();
-+ methodlen += acpigen_emit_namestring("_STA");
-+ /* no fnarg */
-+ methodlen += acpigen_emit_byte(0x00);
-+ /* return */
-+ methodlen += acpigen_emit_byte(0xa4);
-+ methodlen += acpigen_write_byte(0xf);
-+ acpigen_patch_len(methodlen);
-+
-+ devicelen += methodlen;
-+
-+ acpigen_patch_len(devicelen - 1);
-+ scopelen += devicelen;
-+ }
-+
-+ if (have_dock_serial) {
-+ /* Device op. */
-+ scopelen += acpigen_emit_byte(0x5b);
-+ scopelen += acpigen_emit_byte(0x82);
-+ devicelen = acpigen_write_len_f();
-+ devicelen += acpigen_emit_namestring("COMA");
-+
-+ devicelen += acpigen_write_name("_HID");
-+ devicelen += acpigen_emit_eisaid("PNP0501");
-+ devicelen += acpigen_write_name("_UID");
-+ /* Byte */
-+ devicelen += acpigen_write_byte(0x2);
-+
-+ devicelen += acpigen_write_name("_CRS");
-+
-+ reslen = acpigen_write_resourcetemplate_header();
-+ reslen += acpigen_write_io16(0x3f8, 0x3f8, 1, 8, 1);
-+ reslen += acpigen_write_irq(1 << 4);
-+
-+ devicelen += reslen;
-+ devicelen += acpigen_write_resourcetemplate_footer(reslen);
-+
-+ /* method op */
-+ devicelen += acpigen_emit_byte(0x14);
-+ methodlen = acpigen_write_len_f();
-+ methodlen += acpigen_emit_namestring("_STA");
-+ /* no fnarg */
-+ methodlen += acpigen_emit_byte(0x00);
-+ /* return */
-+ methodlen += acpigen_emit_byte(0xa4);
-+ methodlen += acpigen_write_byte(0xf);
-+ acpigen_patch_len(methodlen);
-+
-+ devicelen += methodlen;
-+
-+ acpigen_patch_len(devicelen - 1);
-+ scopelen += devicelen;
-+ }
-+
-+ acpigen_patch_len(scopelen - 1);
-+}
-diff --git a/src/mainboard/lenovo/Kconfig b/src/mainboard/lenovo/Kconfig
-index c1dec85..583efc8 100644
---- a/src/mainboard/lenovo/Kconfig
-+++ b/src/mainboard/lenovo/Kconfig
-@@ -4,7 +4,7 @@ choice
- prompt "Mainboard model"
-
- config BOARD_LENOVO_X60
-- bool "ThinkPad X60 / X60s"
-+ bool "ThinkPad X60 / X60s / X60t"
- help
- The following X60 series ThinkPad machines have been verified to
- work correctly:
-@@ -13,7 +13,7 @@ config BOARD_LENOVO_X60
- ThinkPad X60 (Model 1709)
-
- config BOARD_LENOVO_X201
-- bool "ThinkPad X201"
-+ bool "ThinkPad X201 / X201s / X201t"
- help
- Lenovo X201 laptop. Consult wiki for details.
-
-diff --git a/src/mainboard/lenovo/t60/acpi/superio.asl b/src/mainboard/lenovo/t60/acpi/superio.asl
-index e69de29..41137ce 100644
---- a/src/mainboard/lenovo/t60/acpi/superio.asl
-+++ b/src/mainboard/lenovo/t60/acpi/superio.asl
-@@ -0,0 +1,16 @@
-+ Device (FIR) // Infrared
-+ {
-+ Name(_HID, EISAID("IBM0071"))
-+ Name(_CID, EISAID("PNP0511"))
-+
-+ Name(_CRS, ResourceTemplate()
-+ {
-+ IO (Decode16, 0x2f8, 0x2f8, 0x01, 0x08)
-+ IRQNoFlags () {3}
-+ })
-+
-+ Method (_STA, 0)
-+ {
-+ Return (0xf)
-+ }
-+ }
-diff --git a/src/mainboard/lenovo/t60/devicetree.cb b/src/mainboard/lenovo/t60/devicetree.cb
-index 54b7da3..f13cb3a 100644
---- a/src/mainboard/lenovo/t60/devicetree.cb
-+++ b/src/mainboard/lenovo/t60/devicetree.cb
-@@ -153,6 +153,10 @@ chip northbridge/intel/i945
- chip superio/nsc/pc87382
- device pnp 164e.2 on # IR
- io 0x60 = 0x2f8
-+ irq 0x29 = 0xb0
-+ irq 0x70 = 0x3
-+ drq 0x74 = 0x1
-+ irq 0xf0 = 0x82
- end
-
- device pnp 164e.3 off # Serial Port
-diff --git a/src/mainboard/lenovo/t60/romstage.c b/src/mainboard/lenovo/t60/romstage.c
-index dae917c..237e967 100644
---- a/src/mainboard/lenovo/t60/romstage.c
-+++ b/src/mainboard/lenovo/t60/romstage.c
-@@ -79,7 +79,7 @@ static void ich7_enable_lpc(void)
- // decode range
- pci_write_config16(PCI_DEV(0, 0x1f, 0), 0x80, 0x0210);
- // decode range
-- pci_write_config16(PCI_DEV(0, 0x1f, 0), 0x82, 0x1f0d);
-+ pci_write_config16(PCI_DEV(0, 0x1f, 0), 0x82, 0x1f0f);
-
- /* range 0x1600 - 0x167f */
- pci_write_config16(PCI_DEV(0, 0x1f, 0), 0x84, 0x1601);
-diff --git a/src/mainboard/lenovo/x201/Kconfig b/src/mainboard/lenovo/x201/Kconfig
-index 50df47b..61038c4 100644
---- a/src/mainboard/lenovo/x201/Kconfig
-+++ b/src/mainboard/lenovo/x201/Kconfig
-@@ -17,6 +17,8 @@ config BOARD_SPECIFIC_OPTIONS # dummy
- select EARLY_CBMEM_INIT
- select MAINBOARD_HAS_NATIVE_VGA_INIT
- select MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG
-+ select SUPERIO_NSC_PC87382
-+ select DRIVERS_LENOVO_WACOM
-
- config MAINBOARD_DIR
- string
-@@ -28,7 +30,7 @@ config MAINBOARD_PART_NUMBER
-
- config MAINBOARD_VERSION
- string
-- default "ThinkPad X201"
-+ default "ThinkPad X201 / X201s / X201t"
-
- config MAINBOARD_VENDOR
- string
-diff --git a/src/mainboard/lenovo/x201/acpi_tables.c b/src/mainboard/lenovo/x201/acpi_tables.c
-index 165de0d..710e369 100644
---- a/src/mainboard/lenovo/x201/acpi_tables.c
-+++ b/src/mainboard/lenovo/x201/acpi_tables.c
-@@ -31,6 +31,7 @@
- #include <device/pci.h>
- #include <device/pci_ids.h>
- #include "southbridge/intel/ibexpeak/nvs.h"
-+#include "drivers/lenovo/lenovo.h"
-
- extern const unsigned char AmlCode[];
- #if CONFIG_HAVE_ACPI_SLIC
-@@ -93,6 +94,7 @@ unsigned long acpi_fill_ssdt_generator(unsigned long current,
- const char *oem_table_id)
- {
- generate_cpu_entries();
-+ drivers_lenovo_serial_ports_ssdt_generate("\\_SB.PCI0.LPCB", 0, 0);
- return (unsigned long)(acpigen_get_current());
- }
-
-diff --git a/src/mainboard/lenovo/x201/devicetree.cb b/src/mainboard/lenovo/x201/devicetree.cb
-index 9053f89..1db5bf0 100644
---- a/src/mainboard/lenovo/x201/devicetree.cb
-+++ b/src/mainboard/lenovo/x201/devicetree.cb
-@@ -143,6 +143,20 @@ chip northbridge/intel/nehalem
- end
- device pci 1f.0 on # PCI-LPC bridge
- subsystemid 0x17aa 0x2166
-+ chip superio/nsc/pc87382
-+ device pnp 164e.3 on # Digitizer
-+ io 0x60 = 0x200
-+ irq 0x29 = 0xb0
-+ irq 0x70 = 0x5
-+ irq 0xf0 = 0x82
-+ end
-+ # IR, not connected
-+ device pnp 164e.2 off end
-+ # GPIO, not connected
-+ device pnp 164e.7 off end
-+ # DLPC, not connected
-+ device pnp 164e.19 off end
-+ end
- end
- device pci 1f.2 on # IDE/SATA
- subsystemid 0x17aa 0x2168
-diff --git a/src/mainboard/lenovo/x201/romstage.c b/src/mainboard/lenovo/x201/romstage.c
-index 1237a5c..f74b441 100644
---- a/src/mainboard/lenovo/x201/romstage.c
-+++ b/src/mainboard/lenovo/x201/romstage.c
-@@ -53,7 +53,7 @@ static void pch_enable_lpc(void)
- /* Enable EC, PS/2 Keyboard/Mouse */
- pci_write_config16(PCH_LPC_DEV, LPC_EN,
- CNF2_LPC_EN | CNF1_LPC_EN | MC_LPC_EN | KBC_LPC_EN |
-- COMA_LPC_EN);
-+ COMA_LPC_EN | GAMEL_LPC_EN);
-
- pci_write_config32(PCH_LPC_DEV, LPC_GEN1_DEC, 0x7c1601);
- pci_write_config32(PCH_LPC_DEV, LPC_GEN2_DEC, 0xc15e1);
-diff --git a/src/mainboard/lenovo/x60/Kconfig b/src/mainboard/lenovo/x60/Kconfig
-index b0d7a06..3c708cd 100644
---- a/src/mainboard/lenovo/x60/Kconfig
-+++ b/src/mainboard/lenovo/x60/Kconfig
-@@ -24,6 +24,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
- select MAINBOARD_HAS_NATIVE_VGA_INIT
- select EARLY_CBMEM_INIT
- select H8_DOCK_EARLY_INIT
-+ select DRIVERS_LENOVO_WACOM
- select INTEL_EDID
-
- config MAINBOARD_DIR
-@@ -40,7 +41,7 @@ config DCACHE_RAM_SIZE
-
- config MAINBOARD_PART_NUMBER
- string
-- default "ThinkPad X60 / X60s"
-+ default "ThinkPad X60 / X60s / X60t"
-
- config MMCONF_BASE_ADDRESS
- hex
-diff --git a/src/mainboard/lenovo/x60/acpi_tables.c b/src/mainboard/lenovo/x60/acpi_tables.c
-index f6ed4ae..c8fce7f 100644
---- a/src/mainboard/lenovo/x60/acpi_tables.c
-+++ b/src/mainboard/lenovo/x60/acpi_tables.c
-@@ -29,6 +29,7 @@
- #include <device/device.h>
- #include <device/pci.h>
- #include <device/pci_ids.h>
-+#include "drivers/lenovo/lenovo.h"
-
- extern const unsigned char AmlCode[];
- #if CONFIG_HAVE_ACPI_SLIC
-@@ -86,6 +87,7 @@ unsigned long acpi_fill_madt(unsigned long current)
- unsigned long acpi_fill_ssdt_generator(unsigned long current, const char *oem_table_id)
- {
- generate_cpu_entries();
-+ drivers_lenovo_serial_ports_ssdt_generate("\\_SB.PCI0.LPCB", 1, 1);
- return (unsigned long) (acpigen_get_current());
- }
-
-diff --git a/src/mainboard/lenovo/x60/devicetree.cb b/src/mainboard/lenovo/x60/devicetree.cb
-index dc1c5da..6f9d5d9 100644
---- a/src/mainboard/lenovo/x60/devicetree.cb
-+++ b/src/mainboard/lenovo/x60/devicetree.cb
-@@ -130,10 +130,17 @@ chip northbridge/intel/i945
- chip superio/nsc/pc87382
- device pnp 164e.2 on # IR
- io 0x60 = 0x2f8
-+ irq 0x29 = 0xb0
-+ irq 0x70 = 0x3
-+ drq 0x74 = 0x1
-+ irq 0xf0 = 0x82
- end
-
-- device pnp 164e.3 off # Serial Port
-- io 0x60 = 0x3f8
-+ device pnp 164e.3 on # Digitizer
-+ io 0x60 = 0x200
-+ irq 0x29 = 0xb0
-+ irq 0x70 = 0x5
-+ irq 0xf0 = 0x82
- end
-
- device pnp 164e.7 on # GPIO
-diff --git a/src/mainboard/lenovo/x60/romstage.c b/src/mainboard/lenovo/x60/romstage.c
-index 1198fb2..8eca464 100644
---- a/src/mainboard/lenovo/x60/romstage.c
-+++ b/src/mainboard/lenovo/x60/romstage.c
-@@ -86,7 +86,7 @@ static void ich7_enable_lpc(void)
- // decode range
- pci_write_config16(PCI_DEV(0, 0x1f, 0), 0x80, 0x0210);
- // decode range
-- pci_write_config16(PCI_DEV(0, 0x1f, 0), 0x82, 0x1f0d);
-+ pci_write_config16(PCI_DEV(0, 0x1f, 0), 0x82, 0x1f0f);
-
- /* range 0x1600 - 0x167f */
- pci_write_config16(PCI_DEV(0, 0x1f, 0), 0x84, 0x1601);
diff --git a/resources/libreboot/patch/0001_i945_3dfix.git.diff b/resources/libreboot/patch/0001_i945_3dfix.git.diff
deleted file mode 100644
index f417339..0000000
--- a/resources/libreboot/patch/0001_i945_3dfix.git.diff
+++ /dev/null
@@ -1,37 +0,0 @@
-diff --git a/src/northbridge/intel/i945/gma.c b/src/northbridge/intel/i945/gma.c
-index 4dd2ccf..5dbaff3 100644
---- a/src/northbridge/intel/i945/gma.c
-+++ b/src/northbridge/intel/i945/gma.c
-@@ -33,6 +33,8 @@
-
- #define GDRST 0xc0
-
-+#define BSM 0x5c
-+
- #define LVDS_CLOCK_A_POWERUP_ALL (3 << 8)
- #define LVDS_CLOCK_B_POWERUP_ALL (3 << 4)
- #define LVDS_CLOCK_BOTH_POWERUP_ALL (3 << 2)
-@@ -51,11 +53,19 @@
- static int gtt_setup(unsigned int mmiobase)
- {
- unsigned long PGETBL_save;
--
-- PGETBL_save = read32(mmiobase + PGETBL_CTL) & ~PGETBL_ENABLED;
-+ unsigned long tom; // top of memory
-+
-+ /*
-+ * The Video BIOS places the GTT right below top of memory.
-+ * It is not documented in the Intel 945 datasheet, but the Intel
-+ * developers said that it is normally placed there.
-+ *
-+ * TODO: Add option to make the GTT size runtime
-+ * configurable
-+ */
-+ tom = pci_read_config8(dev_find_slot(0, PCI_DEVFN(0, 0)), TOLUD) << 24;
-+ PGETBL_save = tom - 256 * KiB;
- PGETBL_save |= PGETBL_ENABLED;
--
-- PGETBL_save |= pci_read_config32(dev_find_slot(0, PCI_DEVFN(2,0)), 0x5c) & 0xfffff000;
- PGETBL_save |= 2; /* set GTT to 256kb */
-
- write32(mmiobase + GFX_FLSH_CNTL, 0);
diff --git a/resources/libreboot/patch/0001_t60_6731_6_extension_acpi_brightness.git.diff b/resources/libreboot/patch/0001_t60_6731_6_extension_acpi_brightness.git.diff
new file mode 100644
index 0000000..4e36a6c
--- /dev/null
+++ b/resources/libreboot/patch/0001_t60_6731_6_extension_acpi_brightness.git.diff
@@ -0,0 +1,12 @@
+diff --git a/src/mainboard/lenovo/t60/devicetree.cb b/src/mainboard/lenovo/t60/devicetree.cb
+index 54b7da3..f187bfb 100644
+--- a/src/mainboard/lenovo/t60/devicetree.cb
++++ b/src/mainboard/lenovo/t60/devicetree.cb
+@@ -25,7 +25,6 @@ chip northbridge/intel/i945
+ register "gpu_hotplug" = "0x00000220"
+ register "gpu_lvds_use_spread_spectrum_clock" = "1"
+ register "gpu_lvds_is_dual_channel" = "1"
+- register "gpu_backlight" = "0x1280128"
+
+ device cpu_cluster 0 on
+ chip cpu/intel/socket_mFCPGA478
diff --git a/resources/libreboot/patch/0002_i945_6731_6_extension_fix_uneven_backlight.git.diff b/resources/libreboot/patch/0002_i945_6731_6_extension_fix_uneven_backlight.git.diff
new file mode 100644
index 0000000..eb8936e
--- /dev/null
+++ b/resources/libreboot/patch/0002_i945_6731_6_extension_fix_uneven_backlight.git.diff
@@ -0,0 +1,22 @@
+diff --git a/src/northbridge/intel/i945/acpi/igd.asl b/src/northbridge/intel/i945/acpi/igd.asl
+index 47b66a7..f9c8ef4 100644
+--- a/src/northbridge/intel/i945/acpi/igd.asl
++++ b/src/northbridge/intel/i945/acpi/igd.asl
+@@ -216,14 +216,14 @@ Device (GFX0)
+
+ Method (_BCM, 1, NotSerialized)
+ {
+- Store (ShiftLeft (Arg0, 4), ^^BCLV)
++ Store (ShiftLeft (Arg0, 9), ^^BCLV)
+ Store (0x80000000, ^^CR1)
+- Store (ShiftLeft (0x61, 4), ^^BCLM)
++ Store (ShiftLeft (0x61, 9), ^^BCLM)
+ }
+ Method (_BQC, 0, NotSerialized)
+ {
+ Store (^^BCLV, Local0)
+- ShiftRight (Local0, 4, Local0)
++ ShiftRight (Local0, 9, Local0)
+ Return (Local0)
+ }
+
diff --git a/resources/libreboot/patch/0002_x60_backlight.diff b/resources/libreboot/patch/0002_x60_backlight.diff
deleted file mode 100644
index d787db5..0000000
--- a/resources/libreboot/patch/0002_x60_backlight.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-28c28
-< register "gpu_backlight" = "0x1280128"
----
-> register "gpu_backlight" = "0x879F879E"
diff --git a/resources/libreboot/patch/0003_t60_backlight.diff b/resources/libreboot/patch/0003_t60_backlight.diff
deleted file mode 100644
index 2d1a396..0000000
--- a/resources/libreboot/patch/0003_t60_backlight.diff
+++ /dev/null
@@ -1,4 +0,0 @@
-28c28
-< register "gpu_backlight" = "0x1280128"
----
-> register "gpu_backlight" = "0x58BF58BE"
diff --git a/resources/libreboot/patch/gitdiff b/resources/libreboot/patch/gitdiff
new file mode 100644
index 0000000..db3218d
--- /dev/null
+++ b/resources/libreboot/patch/gitdiff
@@ -0,0 +1,46 @@
+diff --git a/src/mainboard/lenovo/t60/Kconfig b/src/mainboard/lenovo/t60/Kconfig
+index 5903c8b..e2638d8 100644
+--- a/src/mainboard/lenovo/t60/Kconfig
++++ b/src/mainboard/lenovo/t60/Kconfig
+@@ -20,6 +20,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
+ select HAVE_ACPI_TABLES
+ select HAVE_ACPI_RESUME
+ select MAINBOARD_HAS_NATIVE_VGA_INIT
++ select MAINBOARD_HAS_NATIVE_VGA_INIT_TEXTMODECFG
+ select H8_DOCK_EARLY_INIT
+ select HAVE_CMOS_DEFAULT
+ select INTEL_EDID
+diff --git a/src/mainboard/lenovo/t60/devicetree.cb b/src/mainboard/lenovo/t60/devicetree.cb
+index 54b7da3..f187bfb 100644
+--- a/src/mainboard/lenovo/t60/devicetree.cb
++++ b/src/mainboard/lenovo/t60/devicetree.cb
+@@ -25,7 +25,6 @@ chip northbridge/intel/i945
+ register "gpu_hotplug" = "0x00000220"
+ register "gpu_lvds_use_spread_spectrum_clock" = "1"
+ register "gpu_lvds_is_dual_channel" = "1"
+- register "gpu_backlight" = "0x1280128"
+
+ device cpu_cluster 0 on
+ chip cpu/intel/socket_mFCPGA478
+diff --git a/src/northbridge/intel/i945/acpi/igd.asl b/src/northbridge/intel/i945/acpi/igd.asl
+index 47b66a7..f9c8ef4 100644
+--- a/src/northbridge/intel/i945/acpi/igd.asl
++++ b/src/northbridge/intel/i945/acpi/igd.asl
+@@ -216,14 +216,14 @@ Device (GFX0)
+
+ Method (_BCM, 1, NotSerialized)
+ {
+- Store (ShiftLeft (Arg0, 4), ^^BCLV)
++ Store (ShiftLeft (Arg0, 9), ^^BCLV)
+ Store (0x80000000, ^^CR1)
+- Store (ShiftLeft (0x61, 4), ^^BCLM)
++ Store (ShiftLeft (0x61, 9), ^^BCLM)
+ }
+ Method (_BQC, 0, NotSerialized)
+ {
+ Store (^^BCLV, Local0)
+- ShiftRight (Local0, 4, Local0)
++ ShiftRight (Local0, 9, Local0)
+ Return (Local0)
+ }
+
diff --git a/resources/memtest86/patch/Makefile b/resources/memtest86/patch/Makefile
new file mode 100644
index 0000000..1a187b6
--- /dev/null
+++ b/resources/memtest86/patch/Makefile
@@ -0,0 +1,81 @@
+# Makefile for MemTest86+
+#
+# Author: Chris Brady
+# Created: January 1, 1996
+
+
+#
+# Path for the floppy disk device
+#
+FDISK=/dev/fd0
+
+AS=as -32
+CC=gcc
+
+CFLAGS= -Wall -march=i486 -m32 -O1 -fomit-frame-pointer -fno-builtin \
+ -ffreestanding -fPIC $(SMP_FL) -fno-stack-protector
+
+OBJS= head.o reloc.o main.o test.o init.o lib.o patn.o screen_buffer.o \
+ config.o cpuid.o linuxbios.o pci.o memsize.o spd.o error.o dmi.o controller.o \
+ smp.o vmem.o random.o
+
+
+all: clean memtest.bin memtest
+# scp memtest.bin root@192.168.0.12:/srv/tftp/mt86plus
+
+# Link it statically once so I know I don't have undefined
+# symbols and then link it dynamically so I have full
+# relocation information
+memtest_shared: $(OBJS) memtest_shared.lds Makefile
+ $(LD) --warn-constructors --warn-common -static -T memtest_shared.lds \
+ -o $@ $(OBJS) && \
+ $(LD) -shared -Bsymbolic -T memtest_shared.lds -o $@ $(OBJS)
+
+memtest_shared.bin: memtest_shared
+ objcopy -O binary $< memtest_shared.bin
+
+memtest: memtest_shared.bin memtest.lds
+ $(LD) -s -T memtest.lds -b binary memtest_shared.bin -o $@
+
+head.s: head.S config.h defs.h test.h
+ $(CC) -E -traditional $< -o $@
+
+bootsect.s: bootsect.S config.h defs.h
+ $(CC) -E -traditional $< -o $@
+
+setup.s: setup.S config.h defs.h
+ $(CC) -E -traditional $< -o $@
+
+memtest.bin: memtest_shared.bin bootsect.o setup.o memtest.bin.lds
+ $(LD) -T memtest.bin.lds bootsect.o setup.o -b binary \
+ memtest_shared.bin -o memtest.bin
+
+reloc.o: reloc.c
+ $(CC) -c $(CFLAGS) -fno-strict-aliasing reloc.c
+
+test.o: test.c
+ $(CC) -c -Wall -march=i486 -m32 -O0 -fomit-frame-pointer -fno-builtin -ffreestanding test.c
+
+random.o: random.c
+ $(CC) -c -Wall -march=i486 -m32 -O3 -fomit-frame-pointer -fno-builtin -ffreestanding random.c
+
+# rule for build number generation
+build_number:
+ sh make_buildnum.sh
+
+clean:
+ rm -f *.o *.s *.iso memtest.bin memtest memtest_shared \
+ memtest_shared.bin memtest.iso
+
+iso:
+ make all
+ ./makeiso.sh
+
+install: all
+ dd <memtest.bin >$(FDISK) bs=8192
+
+install-precomp:
+ dd <precomp.bin >$(FDISK) bs=8192
+
+dos: all
+ cat mt86+_loader memtest.bin > memtest.exe
diff --git a/resources/memtest86/patch/config.h b/resources/memtest86/patch/config.h
new file mode 100644
index 0000000..10ac525
--- /dev/null
+++ b/resources/memtest86/patch/config.h
@@ -0,0 +1,52 @@
+/*
+ * MemTest86+ V5 Specific code (GPL V2.0)
+ * By Samuel DEMEULEMEESTER, sdemeule@memtest.org
+ * http://www.canardpc.com - http://www.memtest.org
+ * ------------------------------------------------
+ * config.h - MemTest-86 Version 3.3
+ *
+ * Compile time configuration options
+ *
+ * Released under version 2 of the Gnu Public License.
+ * By Chris Brady
+ */
+
+/* CONSERVATIVE_SMP - If set to 0, SMP will be enabled by default */
+/* Might be enabled in future revision after extensive testing */
+/* In all cases, SMP is disabled by defaut on server platform */
+#define CONSERVATIVE_SMP 1
+
+/* BEEP_MODE - Beep on error. Default off, Change to 1 to enable */
+#define BEEP_MODE 1
+
+/* BEEP_END_NO_ERROR - Beep at end of each pass without error. Default off, Change to 1 to enable */
+#define BEEP_END_NO_ERROR 0
+
+/* PARITY_MEM - Enables support for reporting memory parity errors */
+/* Experimental, normally enabled */
+#define PARITY_MEM
+
+/* SERIAL_CONSOLE_DEFAULT - The default state of the serial console. */
+/* This is normally off since it slows down testing. Change to a 1 */
+/* to enable. */
+#define SERIAL_CONSOLE_DEFAULT 0
+
+/* SERIAL_TTY - The default serial port to use. 0=ttyS0, 1=ttyS1 */
+#define SERIAL_TTY 0
+
+/* SERIAL_BAUD_RATE - Baud rate for the serial console */
+#define SERIAL_BAUD_RATE 115200
+
+/* SCRN_DEBUG - extra check for SCREEN_BUFFER
+ */
+/* #define SCRN_DEBUG */
+
+/* APM - Turns off APM at boot time to avoid blanking the screen */
+/* Normally enabled */
+#define APM_OFF
+
+/* USB_WAR - Enables a workaround for errors caused by BIOS USB keyboard */
+/* and mouse support*/
+/* Normally enabled */
+#define USB_WAR
+
diff --git a/resources/memtest86/patch/diff b/resources/memtest86/patch/diff
deleted file mode 100644
index 0abd8d0..0000000
--- a/resources/memtest86/patch/diff
+++ /dev/null
@@ -1,40 +0,0 @@
-diff -rupN memtest86+-5.01_/config.h memtest86+-5.01/config.h
---- memtest86+-5.01_/config.h 2014-06-25 22:57:47.893476783 +0100
-+++ memtest86+-5.01/config.h 2014-06-25 22:59:01.269840630 +0100
-@@ -17,7 +17,7 @@
- #define CONSERVATIVE_SMP 1
-
- /* BEEP_MODE - Beep on error. Default off, Change to 1 to enable */
--#define BEEP_MODE 0
-+#define BEEP_MODE 1
-
- /* BEEP_END_NO_ERROR - Beep at end of each pass without error. Default off, Change to 1 to enable */
- #define BEEP_END_NO_ERROR 0
-@@ -29,13 +29,13 @@
- /* SERIAL_CONSOLE_DEFAULT - The default state of the serial console. */
- /* This is normally off since it slows down testing. Change to a 1 */
- /* to enable. */
--#define SERIAL_CONSOLE_DEFAULT 0
-+#define SERIAL_CONSOLE_DEFAULT 1
-
- /* SERIAL_TTY - The default serial port to use. 0=ttyS0, 1=ttyS1 */
- #define SERIAL_TTY 0
-
- /* SERIAL_BAUD_RATE - Baud rate for the serial console */
--#define SERIAL_BAUD_RATE 9600
-+#define SERIAL_BAUD_RATE 115200
-
- /* SCRN_DEBUG - extra check for SCREEN_BUFFER
- */
-diff -rupN memtest86+-5.01_/Makefile memtest86+-5.01/Makefile
---- memtest86+-5.01_/Makefile 2014-06-25 22:57:47.893476783 +0100
-+++ memtest86+-5.01/Makefile 2014-06-25 22:59:19.237929751 +0100
-@@ -21,7 +21,7 @@ OBJS= head.o reloc.o main.o test.o init.
-
-
- all: clean memtest.bin memtest
-- scp memtest.bin root@192.168.0.12:/srv/tftp/mt86plus
-+# scp memtest.bin root@192.168.0.12:/srv/tftp/mt86plus
-
- # Link it statically once so I know I don't have undefined
- # symbols and then link it dynamically so I have full
diff --git a/resources/seabios/config/config b/resources/seabios/config/config
new file mode 100644
index 0000000..4ef8137
--- /dev/null
+++ b/resources/seabios/config/config
@@ -0,0 +1,87 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# SeaBIOS Configuration
+#
+
+#
+# General Features
+#
+CONFIG_COREBOOT=y
+# CONFIG_QEMU is not set
+# CONFIG_CSM is not set
+# CONFIG_QEMU_HARDWARE is not set
+CONFIG_THREADS=y
+CONFIG_RELOCATE_INIT=y
+CONFIG_BOOTMENU=y
+CONFIG_BOOTSPLASH=y
+CONFIG_BOOTORDER=y
+CONFIG_COREBOOT_FLASH=y
+CONFIG_LZMA=y
+CONFIG_CBFS_LOCATION=0
+CONFIG_FLASH_FLOPPY=y
+CONFIG_ENTRY_EXTRASTACK=y
+CONFIG_MALLOC_UPPERMEMORY=y
+CONFIG_ROM_SIZE=0
+
+#
+# Hardware support
+#
+CONFIG_ATA=y
+# CONFIG_ATA_DMA is not set
+# CONFIG_ATA_PIO32 is not set
+CONFIG_AHCI=y
+CONFIG_MEGASAS=y
+CONFIG_FLOPPY=y
+CONFIG_PS2PORT=y
+CONFIG_USB=y
+CONFIG_USB_UHCI=y
+CONFIG_USB_OHCI=y
+CONFIG_USB_EHCI=y
+CONFIG_USB_XHCI=y
+CONFIG_USB_MSC=y
+CONFIG_USB_UAS=y
+CONFIG_USB_HUB=y
+CONFIG_USB_KEYBOARD=y
+CONFIG_USB_MOUSE=y
+CONFIG_SERIAL=y
+CONFIG_LPT=y
+CONFIG_PMTIMER=y
+
+#
+# BIOS interfaces
+#
+CONFIG_DRIVES=y
+CONFIG_CDROM_BOOT=y
+CONFIG_CDROM_EMU=y
+CONFIG_PCIBIOS=y
+CONFIG_APMBIOS=y
+CONFIG_PNPBIOS=y
+CONFIG_OPTIONROMS=y
+CONFIG_PMM=y
+CONFIG_BOOT=y
+CONFIG_KEYBOARD=y
+CONFIG_KBD_CALL_INT15_4F=y
+CONFIG_MOUSE=y
+CONFIG_S3_RESUME=y
+CONFIG_VGAHOOKS=y
+# CONFIG_DISABLE_A20 is not set
+
+#
+# VGA ROM
+#
+# CONFIG_NO_VGABIOS is not set
+# CONFIG_VGA_STANDARD_VGA is not set
+# CONFIG_VGA_CIRRUS is not set
+# CONFIG_VGA_BOCHS is not set
+# CONFIG_VGA_GEODEGX2 is not set
+# CONFIG_VGA_GEODELX is not set
+CONFIG_VGA_COREBOOT=y
+CONFIG_BUILD_VGABIOS=y
+CONFIG_VGA_ALLOCATE_EXTRA_STACK=y
+CONFIG_VGA_EXTRA_STACK_SIZE=512
+CONFIG_VGA_VBE=y
+
+#
+# Debugging
+#
+CONFIG_DEBUG_LEVEL=0
diff --git a/resources/utilities/README-i945-pwm b/resources/utilities/README-i945-pwm
new file mode 100644
index 0000000..4098635
--- /dev/null
+++ b/resources/utilities/README-i945-pwm
@@ -0,0 +1,4 @@
+git clone git://git.mtjm.eu/i945-pwm.git
+^ is where i945-pwm came from.
+
+The usual git commands apply.
diff --git a/resources/utilities/grub-assemble/gen.sh b/resources/utilities/grub-assemble/gen.sh
new file mode 100755
index 0000000..4f2b36a
--- /dev/null
+++ b/resources/utilities/grub-assemble/gen.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved. This file is offered as-is,
+# without any warranty.
+
+# TODO: Fail (and clean up) if GRUB isn't actually built. Error checking.
+
+# This is where GRUB is expected to be (outside of the grub-assemble, instead in main checkout)
+grubdir="../../../grub"
+
+# Modules
+# Unused. If wanting to add, put after --modules: --install-modules="$grub_install_modules" \
+# Added 'pata' because otherwise, error would appear on X60 saying 'error: no device connected'
+grub_install_modules="adler32 all_video archelp ata backtrace bitmap bitmap_scale cmp cpio_be cpio cpuid crc64 cs5536 div_test efiemu elf eval exfat extcmd file fshelp gettext gfxmenu gfxterm_background gfxterm_menu gptsync gzio hashsum hexdump http jpeg linux16 loadenv lzopio mda_text mmap mpi msdospart multiboot2 multiboot nativedisk net newc ntfscomp ntfs odc offsetio parttool png priority_queue procfs progress read relocator scsi search_fs_file search_fs_uuid search_label search setjmp setpci sleep squash4 tar terminfo testload testspeed tftp tga time trig tr true udf ufs1_be ufs1 ufs2 usbserial_common usbserial_ftdi usbserial_pl2303 usbserial_usbdebug usbtest video_colors videotest_checksum xzio"
+
+# More modules
+grub_modules="acpi ahci at_keyboard boot cat cbfs cbls cbtime chain cmosdump cmostest cbmemc crypto cryptodisk configfile datehook date datetime diskfilter disk echo ext2 ehci fat halt help iorw iso9660 keystatus linux loopback ls lsacpi lsmmap lspci luks lvm memdisk minicmd memrw morse normal ohci part_gpt part_msdos password password_pbkdf2 pbkdf2 pcidump pci play probe reboot serial terminal test usb_keyboard usbms uhci gcry_arcfour gcry_blowfish gcry_camellia gcry_cast5 gcry_crc gcry_des gcry_dsa gcry_idea gcry_md4 gcry_md5 gcry_rfc2268 gcry_rijndael gcry_rmd160 gcry_rsa gcry_seed gcry_serpent gcry_sha1 gcry_sha256 gcry_sha512 gcry_tiger gcry_twofish gcry_whirlpool hdparm regexp spkmodem syslinuxcfg usb verify videoinfo videotest xfs btrfs zfs sfs romfs reiserfs nilfs2 minix_be minix3_be minix3 minix2_be minix2 minix jfs hfsplus hfs bfs afs affs"
+
+# Generate the grub.elf
+$grubdir/grub-mkstandalone \
+ --grub-mkimage=$grubdir/grub-mkimage \
+ -O i386-coreboot \
+ -o grub.elf \
+ -d $grubdir/grub-core/ \
+ --fonts= --themes= --locales= \
+ --modules="$grub_modules" \
+ --install-modules="$grub_install_modules" \
+ /boot/grub/grub.cfg=../../../resources/grub/config/grub_memdisk.cfg \
+ $(./grub_memdisk_keymap) \
diff --git a/resources/utilities/grub-assemble/grub_memdisk_keymap b/resources/utilities/grub-assemble/grub_memdisk_keymap
new file mode 100755
index 0000000..98bf3e0
--- /dev/null
+++ b/resources/utilities/grub-assemble/grub_memdisk_keymap
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+#
+# lists keymaps
+#
+# Copyright (C) 2014 Francis Rowe <info@gluglug.org.uk>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+for keymap in $(ls keymap/original)
+do
+ printf "/boot/grub/layouts/$keymap.gkb=keymap/$keymap.gkb "
+done
diff --git a/resources/grub/keymap/COPYING b/resources/utilities/grub-assemble/keymap/COPYING
index 1a47bfa..1a47bfa 100644
--- a/resources/grub/keymap/COPYING
+++ b/resources/utilities/grub-assemble/keymap/COPYING
diff --git a/resources/grub/keymap/frazerty.gkb b/resources/utilities/grub-assemble/keymap/frazerty.gkb
index c048cec..c048cec 100644
--- a/resources/grub/keymap/frazerty.gkb
+++ b/resources/utilities/grub-assemble/keymap/frazerty.gkb
Binary files differ
diff --git a/resources/grub/keymap/itqwerty.gkb b/resources/utilities/grub-assemble/keymap/itqwerty.gkb
index f247cd1..f247cd1 100644
--- a/resources/grub/keymap/itqwerty.gkb
+++ b/resources/utilities/grub-assemble/keymap/itqwerty.gkb
Binary files differ
diff --git a/resources/grub/keymap/original/frazerty b/resources/utilities/grub-assemble/keymap/original/frazerty
index ad7147a..ad7147a 100644
--- a/resources/grub/keymap/original/frazerty
+++ b/resources/utilities/grub-assemble/keymap/original/frazerty
diff --git a/resources/grub/keymap/original/itqwerty b/resources/utilities/grub-assemble/keymap/original/itqwerty
index 6c53aac..6c53aac 100644
--- a/resources/grub/keymap/original/itqwerty
+++ b/resources/utilities/grub-assemble/keymap/original/itqwerty
diff --git a/resources/grub/keymap/original/itqwerty b/resources/utilities/grub-assemble/keymap/original/svenska
index 6c53aac..3ee5bc9 100644
--- a/resources/grub/keymap/original/itqwerty
+++ b/resources/utilities/grub-assemble/keymap/original/svenska
@@ -1,34 +1,34 @@
keymaps 0-127
keycode 1 = Escape Escape Escape Escape Escape Escape Escape Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Escape Escape Escape Escape Escape Escape Escape Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Escape Escape Escape Escape Escape Escape Escape Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Escape Escape Escape Escape Escape Escape Escape Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Escape Escape Escape Escape Escape Escape Escape Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Escape Escape Escape Escape Escape Escape Escape Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Escape Escape Escape Escape Escape Escape Escape Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Escape Escape Escape Escape Escape Escape Escape Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape Meta_Escape
-keycode 2 = U+0031 U+0021 U+00b9 U+00a1 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00b9 U+00a1 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00b9 U+00a1 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00b9 U+00a1 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00b9 U+00a1 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00b9 U+00a1 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00b9 U+00a1 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00b9 U+00a1 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol
-keycode 3 = U+0032 U+0022 U+00b2 dead_doubleacute nul nul nul dead_doubleacute Meta_two Meta_quotedbl Meta_two dead_doubleacute Meta_nul Meta_nul Meta_nul dead_doubleacute U+0032 U+0022 U+00b2 dead_doubleacute nul nul nul dead_doubleacute Meta_two Meta_quotedbl Meta_two dead_doubleacute Meta_nul Meta_nul Meta_nul dead_doubleacute U+0032 U+0022 U+00b2 dead_doubleacute nul nul nul dead_doubleacute Meta_two Meta_quotedbl Meta_two dead_doubleacute Meta_nul Meta_nul Meta_nul dead_doubleacute U+0032 U+0022 U+00b2 dead_doubleacute nul nul nul dead_doubleacute Meta_two Meta_quotedbl Meta_two dead_doubleacute Meta_nul Meta_nul Meta_nul dead_doubleacute U+0032 U+0022 U+00b2 dead_doubleacute nul nul nul dead_doubleacute Meta_two Meta_quotedbl Meta_two dead_doubleacute Meta_nul Meta_nul Meta_nul dead_doubleacute U+0032 U+0022 U+00b2 dead_doubleacute nul nul nul dead_doubleacute Meta_two Meta_quotedbl Meta_two dead_doubleacute Meta_nul Meta_nul Meta_nul dead_doubleacute U+0032 U+0022 U+00b2 dead_doubleacute nul nul nul dead_doubleacute Meta_two Meta_quotedbl Meta_two dead_doubleacute Meta_nul Meta_nul Meta_nul dead_doubleacute U+0032 U+0022 U+00b2 dead_doubleacute nul nul nul dead_doubleacute Meta_two Meta_quotedbl Meta_two dead_doubleacute Meta_nul Meta_nul Meta_nul dead_doubleacute
-keycode 4 = U+0033 U+00a3 U+00b3 dead_tilde Escape Escape Escape dead_tilde Meta_three Meta_three Meta_three dead_tilde Meta_Escape Meta_Escape Meta_Escape dead_tilde U+0033 U+00a3 U+00b3 dead_tilde Escape Escape Escape dead_tilde Meta_three Meta_three Meta_three dead_tilde Meta_Escape Meta_Escape Meta_Escape dead_tilde U+0033 U+00a3 U+00b3 dead_tilde Escape Escape Escape dead_tilde Meta_three Meta_three Meta_three dead_tilde Meta_Escape Meta_Escape Meta_Escape dead_tilde U+0033 U+00a3 U+00b3 dead_tilde Escape Escape Escape dead_tilde Meta_three Meta_three Meta_three dead_tilde Meta_Escape Meta_Escape Meta_Escape dead_tilde U+0033 U+00a3 U+00b3 dead_tilde Escape Escape Escape dead_tilde Meta_three Meta_three Meta_three dead_tilde Meta_Escape Meta_Escape Meta_Escape dead_tilde U+0033 U+00a3 U+00b3 dead_tilde Escape Escape Escape dead_tilde Meta_three Meta_three Meta_three dead_tilde Meta_Escape Meta_Escape Meta_Escape dead_tilde U+0033 U+00a3 U+00b3 dead_tilde Escape Escape Escape dead_tilde Meta_three Meta_three Meta_three dead_tilde Meta_Escape Meta_Escape Meta_Escape dead_tilde U+0033 U+00a3 U+00b3 dead_tilde Escape Escape Escape dead_tilde Meta_three Meta_three Meta_three dead_tilde Meta_Escape Meta_Escape Meta_Escape dead_tilde
-keycode 5 = U+0034 U+0024 U+00bc U+215b Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_dollar Meta_four Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+0024 U+00bc U+215b Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_dollar Meta_four Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+0024 U+00bc U+215b Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_dollar Meta_four Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+0024 U+00bc U+215b Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_dollar Meta_four Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+0024 U+00bc U+215b Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_dollar Meta_four Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+0024 U+00bc U+215b Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_dollar Meta_four Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+0024 U+00bc U+215b Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_dollar Meta_four Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+0024 U+00bc U+215b Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_dollar Meta_four Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash
-keycode 6 = U+0035 U+0025 U+00bd U+215c Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+00bd U+215c Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+00bd U+215c Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+00bd U+215c Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+00bd U+215c Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+00bd U+215c Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+00bd U+215c Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+00bd U+215c Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright
-keycode 7 = U+0036 U+0026 U+00ac U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00ac U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00ac U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00ac U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00ac U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00ac U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00ac U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00ac U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum
-keycode 8 = U+0037 U+002f U+007b U+215e Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+215e Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+215e Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+215e Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+215e Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+215e Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+215e Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+215e Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore
-keycode 9 = U+0038 U+0028 U+005b U+2122 Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+2122 Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+2122 Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+2122 Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+2122 Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+2122 Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+2122 Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+2122 Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape
-keycode 10 = U+0039 U+0029 U+005d U+00b1 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00b1 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00b1 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00b1 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00b1 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00b1 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00b1 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00b1 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright
-keycode 11 = U+0030 U+003d U+007d dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek Meta_zero Meta_equal Meta_braceright dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek U+0030 U+003d U+007d dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek Meta_zero Meta_equal Meta_braceright dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek U+0030 U+003d U+007d dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek Meta_zero Meta_equal Meta_braceright dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek U+0030 U+003d U+007d dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek Meta_zero Meta_equal Meta_braceright dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek U+0030 U+003d U+007d dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek Meta_zero Meta_equal Meta_braceright dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek U+0030 U+003d U+007d dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek Meta_zero Meta_equal Meta_braceright dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek U+0030 U+003d U+007d dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek Meta_zero Meta_equal Meta_braceright dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek U+0030 U+003d U+007d dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek Meta_zero Meta_equal Meta_braceright dead_ogonek dead_ogonek dead_ogonek dead_ogonek dead_ogonek
-keycode 12 = U+0027 U+003f U+0060 U+00bf Control_g Delete nul nul Meta_apostrophe Meta_question Meta_grave Meta_grave Meta_Control_g Meta_Delete Meta_nul Meta_nul U+0027 U+003f U+0060 U+00bf Control_g Delete nul nul Meta_apostrophe Meta_question Meta_grave Meta_grave Meta_Control_g Meta_Delete Meta_nul Meta_nul U+0027 U+003f U+0060 U+00bf Control_g Delete nul nul Meta_apostrophe Meta_question Meta_grave Meta_grave Meta_Control_g Meta_Delete Meta_nul Meta_nul U+0027 U+003f U+0060 U+00bf Control_g Delete nul nul Meta_apostrophe Meta_question Meta_grave Meta_grave Meta_Control_g Meta_Delete Meta_nul Meta_nul U+0027 U+003f U+0060 U+00bf Control_g Delete nul nul Meta_apostrophe Meta_question Meta_grave Meta_grave Meta_Control_g Meta_Delete Meta_nul Meta_nul U+0027 U+003f U+0060 U+00bf Control_g Delete nul nul Meta_apostrophe Meta_question Meta_grave Meta_grave Meta_Control_g Meta_Delete Meta_nul Meta_nul U+0027 U+003f U+0060 U+00bf Control_g Delete nul nul Meta_apostrophe Meta_question Meta_grave Meta_grave Meta_Control_g Meta_Delete Meta_nul Meta_nul U+0027 U+003f U+0060 U+00bf Control_g Delete nul nul Meta_apostrophe Meta_question Meta_grave Meta_grave Meta_Control_g Meta_Delete Meta_nul Meta_nul
-keycode 13 = +U+00ec U+005e U+007e dead_circumflex Control_asciicircum Control_asciicircum dead_circumflex dead_circumflex Meta_asciicircum Meta_asciicircum Meta_asciitilde dead_circumflex Meta_Control_asciicircum Meta_Control_asciicircum dead_circumflex dead_circumflex +U+00ec U+005e U+007e dead_circumflex Control_asciicircum Control_asciicircum dead_circumflex dead_circumflex Meta_asciicircum Meta_asciicircum Meta_asciitilde dead_circumflex Meta_Control_asciicircum Meta_Control_asciicircum dead_circumflex dead_circumflex +U+00ec U+005e U+007e dead_circumflex Control_asciicircum Control_asciicircum dead_circumflex dead_circumflex Meta_asciicircum Meta_asciicircum Meta_asciitilde dead_circumflex Meta_Control_asciicircum Meta_Control_asciicircum dead_circumflex dead_circumflex +U+00ec U+005e U+007e dead_circumflex Control_asciicircum Control_asciicircum dead_circumflex dead_circumflex Meta_asciicircum Meta_asciicircum Meta_asciitilde dead_circumflex Meta_Control_asciicircum Meta_Control_asciicircum dead_circumflex dead_circumflex +U+00cc U+005e U+007e dead_circumflex Control_asciicircum Control_asciicircum dead_circumflex dead_circumflex Meta_asciicircum Meta_asciicircum Meta_asciitilde dead_circumflex Meta_Control_asciicircum Meta_Control_asciicircum dead_circumflex dead_circumflex +U+00cc U+005e U+007e dead_circumflex Control_asciicircum Control_asciicircum dead_circumflex dead_circumflex Meta_asciicircum Meta_asciicircum Meta_asciitilde dead_circumflex Meta_Control_asciicircum Meta_Control_asciicircum dead_circumflex dead_circumflex +U+00cc U+005e U+007e dead_circumflex Control_asciicircum Control_asciicircum dead_circumflex dead_circumflex Meta_asciicircum Meta_asciicircum Meta_asciitilde dead_circumflex Meta_Control_asciicircum Meta_Control_asciicircum dead_circumflex dead_circumflex +U+00cc U+005e U+007e dead_circumflex Control_asciicircum Control_asciicircum dead_circumflex dead_circumflex Meta_asciicircum Meta_asciicircum Meta_asciitilde dead_circumflex Meta_Control_asciicircum Meta_Control_asciicircum dead_circumflex dead_circumflex
+keycode 2 = U+0031 U+0021 U+00a1 U+00b9 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00a1 U+00b9 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00a1 U+00b9 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00a1 U+00b9 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00a1 U+00b9 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00a1 U+00b9 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00a1 U+00b9 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0031 U+0021 U+00a1 U+00b9 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_one Meta_exclam Meta_one Meta_exclam VoidSymbol VoidSymbol VoidSymbol VoidSymbol
+keycode 3 = U+0032 U+0022 U+0040 U+00b2 nul nul nul nul Meta_two Meta_quotedbl Meta_at Meta_at Meta_nul Meta_nul Meta_nul Meta_nul U+0032 U+0022 U+0040 U+00b2 nul nul nul nul Meta_two Meta_quotedbl Meta_at Meta_at Meta_nul Meta_nul Meta_nul Meta_nul U+0032 U+0022 U+0040 U+00b2 nul nul nul nul Meta_two Meta_quotedbl Meta_at Meta_at Meta_nul Meta_nul Meta_nul Meta_nul U+0032 U+0022 U+0040 U+00b2 nul nul nul nul Meta_two Meta_quotedbl Meta_at Meta_at Meta_nul Meta_nul Meta_nul Meta_nul U+0032 U+0022 U+0040 U+00b2 nul nul nul nul Meta_two Meta_quotedbl Meta_at Meta_at Meta_nul Meta_nul Meta_nul Meta_nul U+0032 U+0022 U+0040 U+00b2 nul nul nul nul Meta_two Meta_quotedbl Meta_at Meta_at Meta_nul Meta_nul Meta_nul Meta_nul U+0032 U+0022 U+0040 U+00b2 nul nul nul nul Meta_two Meta_quotedbl Meta_at Meta_at Meta_nul Meta_nul Meta_nul Meta_nul U+0032 U+0022 U+0040 U+00b2 nul nul nul nul Meta_two Meta_quotedbl Meta_at Meta_at Meta_nul Meta_nul Meta_nul Meta_nul
+keycode 4 = U+0033 U+0023 U+00a3 U+00b3 Escape Escape Escape Escape Meta_three Meta_numbersign Meta_three Meta_numbersign Meta_Escape Meta_Escape Meta_Escape Meta_Escape U+0033 U+0023 U+00a3 U+00b3 Escape Escape Escape Escape Meta_three Meta_numbersign Meta_three Meta_numbersign Meta_Escape Meta_Escape Meta_Escape Meta_Escape U+0033 U+0023 U+00a3 U+00b3 Escape Escape Escape Escape Meta_three Meta_numbersign Meta_three Meta_numbersign Meta_Escape Meta_Escape Meta_Escape Meta_Escape U+0033 U+0023 U+00a3 U+00b3 Escape Escape Escape Escape Meta_three Meta_numbersign Meta_three Meta_numbersign Meta_Escape Meta_Escape Meta_Escape Meta_Escape U+0033 U+0023 U+00a3 U+00b3 Escape Escape Escape Escape Meta_three Meta_numbersign Meta_three Meta_numbersign Meta_Escape Meta_Escape Meta_Escape Meta_Escape U+0033 U+0023 U+00a3 U+00b3 Escape Escape Escape Escape Meta_three Meta_numbersign Meta_three Meta_numbersign Meta_Escape Meta_Escape Meta_Escape Meta_Escape U+0033 U+0023 U+00a3 U+00b3 Escape Escape Escape Escape Meta_three Meta_numbersign Meta_three Meta_numbersign Meta_Escape Meta_Escape Meta_Escape Meta_Escape U+0033 U+0023 U+00a3 U+00b3 Escape Escape Escape Escape Meta_three Meta_numbersign Meta_three Meta_numbersign Meta_Escape Meta_Escape Meta_Escape Meta_Escape
+keycode 5 = U+0034 U+00a4 U+0024 U+00bc Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_four Meta_dollar Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+00a4 U+0024 U+00bc Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_four Meta_dollar Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+00a4 U+0024 U+00bc Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_four Meta_dollar Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+00a4 U+0024 U+00bc Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_four Meta_dollar Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+00a4 U+0024 U+00bc Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_four Meta_dollar Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+00a4 U+0024 U+00bc Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_four Meta_dollar Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+00a4 U+0024 U+00bc Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_four Meta_dollar Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+0034 U+00a4 U+0024 U+00bc Control_backslash Control_backslash Control_backslash Control_backslash Meta_four Meta_four Meta_dollar Meta_dollar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash
+keycode 6 = U+0035 U+0025 U+20ac U+00a2 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+20ac U+00a2 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+20ac U+00a2 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+20ac U+00a2 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+20ac U+00a2 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+20ac U+00a2 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+20ac U+00a2 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0035 U+0025 U+20ac U+00a2 Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_five Meta_percent Meta_five Meta_percent Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright
+keycode 7 = U+0036 U+0026 U+00a5 U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00a5 U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00a5 U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00a5 U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00a5 U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00a5 U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00a5 U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum U+0036 U+0026 U+00a5 U+215d Control_asciicircum Control_asciicircum Control_asciicircum Control_asciicircum Meta_six Meta_ampersand Meta_six Meta_ampersand Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum Meta_Control_asciicircum
+keycode 8 = U+0037 U+002f U+007b U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+0037 U+002f U+007b U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_seven Meta_slash Meta_braceleft Meta_braceleft Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore
+keycode 9 = U+0038 U+0028 U+005b U+00ab Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+00ab Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+00ab Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+00ab Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+00ab Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+00ab Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+00ab Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape U+0038 U+0028 U+005b U+00ab Delete Delete Escape Escape Meta_eight Meta_parenleft Meta_bracketleft Meta_bracketleft Meta_Delete Meta_Delete Meta_Escape Meta_Escape
+keycode 10 = U+0039 U+0029 U+005d U+00bb Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00bb Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00bb Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00bb Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00bb Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00bb Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00bb Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+0039 U+0029 U+005d U+00bb Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_nine Meta_parenright Meta_bracketright Meta_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright
+keycode 11 = U+0030 U+003d U+007d U+00b0 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_zero Meta_equal Meta_braceright Meta_braceright VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0030 U+003d U+007d U+00b0 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_zero Meta_equal Meta_braceright Meta_braceright VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0030 U+003d U+007d U+00b0 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_zero Meta_equal Meta_braceright Meta_braceright VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0030 U+003d U+007d U+00b0 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_zero Meta_equal Meta_braceright Meta_braceright VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0030 U+003d U+007d U+00b0 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_zero Meta_equal Meta_braceright Meta_braceright VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0030 U+003d U+007d U+00b0 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_zero Meta_equal Meta_braceright Meta_braceright VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0030 U+003d U+007d U+00b0 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_zero Meta_equal Meta_braceright Meta_braceright VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+0030 U+003d U+007d U+00b0 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_zero Meta_equal Meta_braceright Meta_braceright VoidSymbol VoidSymbol VoidSymbol VoidSymbol
+keycode 12 = U+002b U+003f U+005c U+00bf Delete Delete Control_backslash Control_backslash Meta_plus Meta_question Meta_backslash Meta_backslash Meta_Delete Meta_Delete Meta_Control_backslash Meta_Control_backslash U+002b U+003f U+005c U+00bf Delete Delete Control_backslash Control_backslash Meta_plus Meta_question Meta_backslash Meta_backslash Meta_Delete Meta_Delete Meta_Control_backslash Meta_Control_backslash U+002b U+003f U+005c U+00bf Delete Delete Control_backslash Control_backslash Meta_plus Meta_question Meta_backslash Meta_backslash Meta_Delete Meta_Delete Meta_Control_backslash Meta_Control_backslash U+002b U+003f U+005c U+00bf Delete Delete Control_backslash Control_backslash Meta_plus Meta_question Meta_backslash Meta_backslash Meta_Delete Meta_Delete Meta_Control_backslash Meta_Control_backslash U+002b U+003f U+005c U+00bf Delete Delete Control_backslash Control_backslash Meta_plus Meta_question Meta_backslash Meta_backslash Meta_Delete Meta_Delete Meta_Control_backslash Meta_Control_backslash U+002b U+003f U+005c U+00bf Delete Delete Control_backslash Control_backslash Meta_plus Meta_question Meta_backslash Meta_backslash Meta_Delete Meta_Delete Meta_Control_backslash Meta_Control_backslash U+002b U+003f U+005c U+00bf Delete Delete Control_backslash Control_backslash Meta_plus Meta_question Meta_backslash Meta_backslash Meta_Delete Meta_Delete Meta_Control_backslash Meta_Control_backslash U+002b U+003f U+005c U+00bf Delete Delete Control_backslash Control_backslash Meta_plus Meta_question Meta_backslash Meta_backslash Meta_Delete Meta_Delete Meta_Control_backslash Meta_Control_backslash
+keycode 13 = dead_acute dead_grave U+00b1 U+00ac dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave U+00b1 U+00ac dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave U+00b1 U+00ac dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave U+00b1 U+00ac dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave U+00b1 U+00ac dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave U+00b1 U+00ac dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave U+00b1 U+00ac dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave U+00b1 U+00ac dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave dead_acute dead_grave
keycode 14 = Delete Delete Delete Delete BackSpace BackSpace BackSpace BackSpace Meta_Delete Meta_Delete Meta_Delete Meta_Delete Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace Delete Delete Delete Delete BackSpace BackSpace BackSpace BackSpace Meta_Delete Meta_Delete Meta_Delete Meta_Delete Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace Delete Delete Delete Delete BackSpace BackSpace BackSpace BackSpace Meta_Delete Meta_Delete Meta_Delete Meta_Delete Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace Delete Delete Delete Delete BackSpace BackSpace BackSpace BackSpace Meta_Delete Meta_Delete Meta_Delete Meta_Delete Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace Delete Delete Delete Delete BackSpace BackSpace BackSpace BackSpace Meta_Delete Meta_Delete Meta_Delete Meta_Delete Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace Delete Delete Delete Delete BackSpace BackSpace BackSpace BackSpace Meta_Delete Meta_Delete Meta_Delete Meta_Delete Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace Delete Delete Delete Delete BackSpace BackSpace BackSpace BackSpace Meta_Delete Meta_Delete Meta_Delete Meta_Delete Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace Delete Delete Delete Delete BackSpace BackSpace BackSpace BackSpace Meta_Delete Meta_Delete Meta_Delete Meta_Delete Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace
keycode 15 = Tab Tab Tab Tab Tab Tab Tab Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Tab Tab Tab Tab Tab Tab Tab Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Tab Tab Tab Tab Tab Tab Tab Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Tab Tab Tab Tab Tab Tab Tab Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Tab Tab Tab Tab Tab Tab Tab Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Tab Tab Tab Tab Tab Tab Tab Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Tab Tab Tab Tab Tab Tab Tab Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Tab Tab Tab Tab Tab Tab Tab Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab Meta_Tab
keycode 16 = +U+0071 +U+0051 U+0040 +U+03a9 Control_q Control_q nul nul Meta_q Meta_Q Meta_at Meta_at Meta_Control_q Meta_Control_q Meta_nul Meta_nul +U+0071 +U+0051 U+0040 +U+03a9 Control_q Control_q nul nul Meta_q Meta_Q Meta_at Meta_at Meta_Control_q Meta_Control_q Meta_nul Meta_nul +U+0071 +U+0051 U+0040 +U+03a9 Control_q Control_q nul nul Meta_q Meta_Q Meta_at Meta_at Meta_Control_q Meta_Control_q Meta_nul Meta_nul +U+0071 +U+0051 U+0040 +U+03a9 Control_q Control_q nul nul Meta_q Meta_Q Meta_at Meta_at Meta_Control_q Meta_Control_q Meta_nul Meta_nul +U+0051 +U+0071 U+0040 +U+03c9 Control_q Control_q nul nul Meta_q Meta_Q Meta_at Meta_at Meta_Control_q Meta_Control_q Meta_nul Meta_nul +U+0051 +U+0071 U+0040 +U+03c9 Control_q Control_q nul nul Meta_q Meta_Q Meta_at Meta_at Meta_Control_q Meta_Control_q Meta_nul Meta_nul +U+0051 +U+0071 U+0040 +U+03c9 Control_q Control_q nul nul Meta_q Meta_Q Meta_at Meta_at Meta_Control_q Meta_Control_q Meta_nul Meta_nul +U+0051 +U+0071 U+0040 +U+03c9 Control_q Control_q nul nul Meta_q Meta_Q Meta_at Meta_at Meta_Control_q Meta_Control_q Meta_nul Meta_nul
keycode 17 = +U+0077 +U+0057 +U+0142 +U+0141 Control_w Control_w Control_w Control_w Meta_w Meta_W Meta_w Meta_W Meta_Control_w Meta_Control_w Meta_Control_w Meta_Control_w +U+0077 +U+0057 +U+0142 +U+0141 Control_w Control_w Control_w Control_w Meta_w Meta_W Meta_w Meta_W Meta_Control_w Meta_Control_w Meta_Control_w Meta_Control_w +U+0077 +U+0057 +U+0142 +U+0141 Control_w Control_w Control_w Control_w Meta_w Meta_W Meta_w Meta_W Meta_Control_w Meta_Control_w Meta_Control_w Meta_Control_w +U+0077 +U+0057 +U+0142 +U+0141 Control_w Control_w Control_w Control_w Meta_w Meta_W Meta_w Meta_W Meta_Control_w Meta_Control_w Meta_Control_w Meta_Control_w +U+0057 +U+0077 +U+0141 +U+0142 Control_w Control_w Control_w Control_w Meta_w Meta_W Meta_w Meta_W Meta_Control_w Meta_Control_w Meta_Control_w Meta_Control_w +U+0057 +U+0077 +U+0141 +U+0142 Control_w Control_w Control_w Control_w Meta_w Meta_W Meta_w Meta_W Meta_Control_w Meta_Control_w Meta_Control_w Meta_Control_w +U+0057 +U+0077 +U+0141 +U+0142 Control_w Control_w Control_w Control_w Meta_w Meta_W Meta_w Meta_W Meta_Control_w Meta_Control_w Meta_Control_w Meta_Control_w +U+0057 +U+0077 +U+0141 +U+0142 Control_w Control_w Control_w Control_w Meta_w Meta_W Meta_w Meta_W Meta_Control_w Meta_Control_w Meta_Control_w Meta_Control_w
keycode 18 = +U+0065 +U+0045 U+20ac U+00a2 Control_e Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_E Meta_Control_e Meta_Control_e Meta_Control_e Meta_Control_e +U+0065 +U+0045 U+20ac U+00a2 Control_e Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_E Meta_Control_e Meta_Control_e Meta_Control_e Meta_Control_e +U+0065 +U+0045 U+20ac U+00a2 Control_e Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_E Meta_Control_e Meta_Control_e Meta_Control_e Meta_Control_e +U+0065 +U+0045 U+20ac U+00a2 Control_e Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_E Meta_Control_e Meta_Control_e Meta_Control_e Meta_Control_e +U+0045 +U+0065 U+20ac U+00a2 Control_e Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_E Meta_Control_e Meta_Control_e Meta_Control_e Meta_Control_e +U+0045 +U+0065 U+20ac U+00a2 Control_e Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_E Meta_Control_e Meta_Control_e Meta_Control_e Meta_Control_e +U+0045 +U+0065 U+20ac U+00a2 Control_e Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_E Meta_Control_e Meta_Control_e Meta_Control_e Meta_Control_e +U+0045 +U+0065 U+20ac U+00a2 Control_e Control_e Control_e Control_e Meta_e Meta_E Meta_e Meta_E Meta_Control_e Meta_Control_e Meta_Control_e Meta_Control_e
-keycode 19 = +U+0072 +U+0052 U+00b6 U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0072 +U+0052 U+00b6 U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0072 +U+0052 U+00b6 U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0072 +U+0052 U+00b6 U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0052 +U+0072 U+00b6 U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0052 +U+0072 U+00b6 U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0052 +U+0072 U+00b6 U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0052 +U+0072 U+00b6 U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r
-keycode 20 = +U+0074 +U+0054 +U+0167 +U+0166 Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0074 +U+0054 +U+0167 +U+0166 Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0074 +U+0054 +U+0167 +U+0166 Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0074 +U+0054 +U+0167 +U+0166 Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0054 +U+0074 +U+0166 +U+0167 Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0054 +U+0074 +U+0166 +U+0167 Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0054 +U+0074 +U+0166 +U+0167 Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0054 +U+0074 +U+0166 +U+0167 Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t
+keycode 19 = +U+0072 +U+0052 U+00ae U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0072 +U+0052 U+00ae U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0072 +U+0052 U+00ae U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0072 +U+0052 U+00ae U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0052 +U+0072 U+00ae U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0052 +U+0072 U+00ae U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0052 +U+0072 U+00ae U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r +U+0052 +U+0072 U+00ae U+00ae Control_r Control_r Control_r Control_r Meta_r Meta_R Meta_r Meta_R Meta_Control_r Meta_Control_r Meta_Control_r Meta_Control_r
+keycode 20 = +U+0074 +U+0054 +U+00fe +U+00de Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0074 +U+0054 +U+00fe +U+00de Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0074 +U+0054 +U+00fe +U+00de Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0074 +U+0054 +U+00fe +U+00de Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0054 +U+0074 +U+00de +U+00fe Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0054 +U+0074 +U+00de +U+00fe Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0054 +U+0074 +U+00de +U+00fe Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t +U+0054 +U+0074 +U+00de +U+00fe Control_t Control_t Control_t Control_t Meta_t Meta_T Meta_t Meta_T Meta_Control_t Meta_Control_t Meta_Control_t Meta_Control_t
keycode 21 = +U+0079 +U+0059 U+2190 U+00a5 Control_y Control_y Control_y Control_y Meta_y Meta_Y Meta_y Meta_Y Meta_Control_y Meta_Control_y Meta_Control_y Meta_Control_y +U+0079 +U+0059 U+2190 U+00a5 Control_y Control_y Control_y Control_y Meta_y Meta_Y Meta_y Meta_Y Meta_Control_y Meta_Control_y Meta_Control_y Meta_Control_y +U+0079 +U+0059 U+2190 U+00a5 Control_y Control_y Control_y Control_y Meta_y Meta_Y Meta_y Meta_Y Meta_Control_y Meta_Control_y Meta_Control_y Meta_Control_y +U+0079 +U+0059 U+2190 U+00a5 Control_y Control_y Control_y Control_y Meta_y Meta_Y Meta_y Meta_Y Meta_Control_y Meta_Control_y Meta_Control_y Meta_Control_y +U+0059 +U+0079 U+2190 U+00a5 Control_y Control_y Control_y Control_y Meta_y Meta_Y Meta_y Meta_Y Meta_Control_y Meta_Control_y Meta_Control_y Meta_Control_y +U+0059 +U+0079 U+2190 U+00a5 Control_y Control_y Control_y Control_y Meta_y Meta_Y Meta_y Meta_Y Meta_Control_y Meta_Control_y Meta_Control_y Meta_Control_y +U+0059 +U+0079 U+2190 U+00a5 Control_y Control_y Control_y Control_y Meta_y Meta_Y Meta_y Meta_Y Meta_Control_y Meta_Control_y Meta_Control_y Meta_Control_y +U+0059 +U+0079 U+2190 U+00a5 Control_y Control_y Control_y Control_y Meta_y Meta_Y Meta_y Meta_Y Meta_Control_y Meta_Control_y Meta_Control_y Meta_Control_y
keycode 22 = +U+0075 +U+0055 U+2193 U+2191 Control_u Control_u Control_u Control_u Meta_u Meta_U Meta_u Meta_U Meta_Control_u Meta_Control_u Meta_Control_u Meta_Control_u +U+0075 +U+0055 U+2193 U+2191 Control_u Control_u Control_u Control_u Meta_u Meta_U Meta_u Meta_U Meta_Control_u Meta_Control_u Meta_Control_u Meta_Control_u +U+0075 +U+0055 U+2193 U+2191 Control_u Control_u Control_u Control_u Meta_u Meta_U Meta_u Meta_U Meta_Control_u Meta_Control_u Meta_Control_u Meta_Control_u +U+0075 +U+0055 U+2193 U+2191 Control_u Control_u Control_u Control_u Meta_u Meta_U Meta_u Meta_U Meta_Control_u Meta_Control_u Meta_Control_u Meta_Control_u +U+0055 +U+0075 U+2193 U+2191 Control_u Control_u Control_u Control_u Meta_u Meta_U Meta_u Meta_U Meta_Control_u Meta_Control_u Meta_Control_u Meta_Control_u +U+0055 +U+0075 U+2193 U+2191 Control_u Control_u Control_u Control_u Meta_u Meta_U Meta_u Meta_U Meta_Control_u Meta_Control_u Meta_Control_u Meta_Control_u +U+0055 +U+0075 U+2193 U+2191 Control_u Control_u Control_u Control_u Meta_u Meta_U Meta_u Meta_U Meta_Control_u Meta_Control_u Meta_Control_u Meta_Control_u +U+0055 +U+0075 U+2193 U+2191 Control_u Control_u Control_u Control_u Meta_u Meta_U Meta_u Meta_U Meta_Control_u Meta_Control_u Meta_Control_u Meta_Control_u
keycode 23 = +U+0069 +U+0049 U+2192 +U+0131 Tab Tab Tab Tab Meta_i Meta_I Meta_i Meta_I Meta_Tab Meta_Tab Meta_Tab Meta_Tab +U+0069 +U+0049 U+2192 +U+0131 Tab Tab Tab Tab Meta_i Meta_I Meta_i Meta_I Meta_Tab Meta_Tab Meta_Tab Meta_Tab +U+0069 +U+0049 U+2192 +U+0131 Tab Tab Tab Tab Meta_i Meta_I Meta_i Meta_I Meta_Tab Meta_Tab Meta_Tab Meta_Tab +U+0069 +U+0049 U+2192 +U+0131 Tab Tab Tab Tab Meta_i Meta_I Meta_i Meta_I Meta_Tab Meta_Tab Meta_Tab Meta_Tab +U+0049 +U+0069 U+2192 +U+0049 Tab Tab Tab Tab Meta_i Meta_I Meta_i Meta_I Meta_Tab Meta_Tab Meta_Tab Meta_Tab +U+0049 +U+0069 U+2192 +U+0049 Tab Tab Tab Tab Meta_i Meta_I Meta_i Meta_I Meta_Tab Meta_Tab Meta_Tab Meta_Tab +U+0049 +U+0069 U+2192 +U+0049 Tab Tab Tab Tab Meta_i Meta_I Meta_i Meta_I Meta_Tab Meta_Tab Meta_Tab Meta_Tab +U+0049 +U+0069 U+2192 +U+0049 Tab Tab Tab Tab Meta_i Meta_I Meta_i Meta_I Meta_Tab Meta_Tab Meta_Tab Meta_Tab
-keycode 24 = +U+006f +U+004f +U+00f8 +U+00d8 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+006f +U+004f +U+00f8 +U+00d8 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+006f +U+004f +U+00f8 +U+00d8 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+006f +U+004f +U+00f8 +U+00d8 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+004f +U+006f +U+00d8 +U+00f8 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+004f +U+006f +U+00d8 +U+00f8 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+004f +U+006f +U+00d8 +U+00f8 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+004f +U+006f +U+00d8 +U+00f8 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o
+keycode 24 = +U+006f +U+004f +U+0153 +U+0152 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+006f +U+004f +U+0153 +U+0152 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+006f +U+004f +U+0153 +U+0152 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+006f +U+004f +U+0153 +U+0152 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+004f +U+006f +U+0152 +U+0153 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+004f +U+006f +U+0152 +U+0153 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+004f +U+006f +U+0152 +U+0153 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o +U+004f +U+006f +U+0152 +U+0153 Control_o Control_o Control_o Control_o Meta_o Meta_O Meta_o Meta_O Meta_Control_o Meta_Control_o Meta_Control_o Meta_Control_o
keycode 25 = +U+0070 +U+0050 +U+00fe +U+00de Control_p Control_p Control_p Control_p Meta_p Meta_P Meta_p Meta_P Meta_Control_p Meta_Control_p Meta_Control_p Meta_Control_p +U+0070 +U+0050 +U+00fe +U+00de Control_p Control_p Control_p Control_p Meta_p Meta_P Meta_p Meta_P Meta_Control_p Meta_Control_p Meta_Control_p Meta_Control_p +U+0070 +U+0050 +U+00fe +U+00de Control_p Control_p Control_p Control_p Meta_p Meta_P Meta_p Meta_P Meta_Control_p Meta_Control_p Meta_Control_p Meta_Control_p +U+0070 +U+0050 +U+00fe +U+00de Control_p Control_p Control_p Control_p Meta_p Meta_P Meta_p Meta_P Meta_Control_p Meta_Control_p Meta_Control_p Meta_Control_p +U+0050 +U+0070 +U+00de +U+00fe Control_p Control_p Control_p Control_p Meta_p Meta_P Meta_p Meta_P Meta_Control_p Meta_Control_p Meta_Control_p Meta_Control_p +U+0050 +U+0070 +U+00de +U+00fe Control_p Control_p Control_p Control_p Meta_p Meta_P Meta_p Meta_P Meta_Control_p Meta_Control_p Meta_Control_p Meta_Control_p +U+0050 +U+0070 +U+00de +U+00fe Control_p Control_p Control_p Control_p Meta_p Meta_P Meta_p Meta_P Meta_Control_p Meta_Control_p Meta_Control_p Meta_Control_p +U+0050 +U+0070 +U+00de +U+00fe Control_p Control_p Control_p Control_p Meta_p Meta_P Meta_p Meta_P Meta_Control_p Meta_Control_p Meta_Control_p Meta_Control_p
-keycode 26 = +U+00e8 +U+00e9 U+005b U+007b Escape Escape Escape Escape Meta_bracketleft Meta_braceleft Meta_bracketleft Meta_braceleft Meta_Escape Meta_Escape Meta_Escape Meta_Escape +U+00e8 +U+00e9 U+005b U+007b Escape Escape Escape Escape Meta_bracketleft Meta_braceleft Meta_bracketleft Meta_braceleft Meta_Escape Meta_Escape Meta_Escape Meta_Escape +U+00e8 +U+00e9 U+005b U+007b Escape Escape Escape Escape Meta_bracketleft Meta_braceleft Meta_bracketleft Meta_braceleft Meta_Escape Meta_Escape Meta_Escape Meta_Escape +U+00e8 +U+00e9 U+005b U+007b Escape Escape Escape Escape Meta_bracketleft Meta_braceleft Meta_bracketleft Meta_braceleft Meta_Escape Meta_Escape Meta_Escape Meta_Escape +U+00c8 +U+00c9 U+005b U+007b Escape Escape Escape Escape Meta_bracketleft Meta_braceleft Meta_bracketleft Meta_braceleft Meta_Escape Meta_Escape Meta_Escape Meta_Escape +U+00c8 +U+00c9 U+005b U+007b Escape Escape Escape Escape Meta_bracketleft Meta_braceleft Meta_bracketleft Meta_braceleft Meta_Escape Meta_Escape Meta_Escape Meta_Escape +U+00c8 +U+00c9 U+005b U+007b Escape Escape Escape Escape Meta_bracketleft Meta_braceleft Meta_bracketleft Meta_braceleft Meta_Escape Meta_Escape Meta_Escape Meta_Escape +U+00c8 +U+00c9 U+005b U+007b Escape Escape Escape Escape Meta_bracketleft Meta_braceleft Meta_bracketleft Meta_braceleft Meta_Escape Meta_Escape Meta_Escape Meta_Escape
-keycode 27 = U+002b U+002a U+005d U+007d Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_plus Meta_asterisk Meta_bracketright Meta_braceright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+002b U+002a U+005d U+007d Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_plus Meta_asterisk Meta_bracketright Meta_braceright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+002b U+002a U+005d U+007d Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_plus Meta_asterisk Meta_bracketright Meta_braceright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+002b U+002a U+005d U+007d Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_plus Meta_asterisk Meta_bracketright Meta_braceright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+002b U+002a U+005d U+007d Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_plus Meta_asterisk Meta_bracketright Meta_braceright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+002b U+002a U+005d U+007d Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_plus Meta_asterisk Meta_bracketright Meta_braceright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+002b U+002a U+005d U+007d Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_plus Meta_asterisk Meta_bracketright Meta_braceright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright U+002b U+002a U+005d U+007d Control_bracketright Control_bracketright Control_bracketright Control_bracketright Meta_plus Meta_asterisk Meta_bracketright Meta_braceright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright Meta_Control_bracketright
+keycode 26 = +U+00e5 +U+00c5 dead_diaeresis U+002a dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis Meta_asterisk dead_diaeresis Meta_asterisk dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis +U+00e5 +U+00c5 dead_diaeresis U+002a dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis Meta_asterisk dead_diaeresis Meta_asterisk dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis +U+00e5 +U+00c5 dead_diaeresis U+002a dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis Meta_asterisk dead_diaeresis Meta_asterisk dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis +U+00e5 +U+00c5 dead_diaeresis U+002a dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis Meta_asterisk dead_diaeresis Meta_asterisk dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis +U+00c5 +U+00e5 dead_diaeresis U+002a dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis Meta_asterisk dead_diaeresis Meta_asterisk dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis +U+00c5 +U+00e5 dead_diaeresis U+002a dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis Meta_asterisk dead_diaeresis Meta_asterisk dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis +U+00c5 +U+00e5 dead_diaeresis U+002a dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis Meta_asterisk dead_diaeresis Meta_asterisk dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis +U+00c5 +U+00e5 dead_diaeresis U+002a dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis Meta_asterisk dead_diaeresis Meta_asterisk dead_diaeresis dead_diaeresis dead_diaeresis dead_diaeresis
+keycode 27 = dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron dead_diaeresis dead_circumflex dead_tilde dead_caron
keycode 28 = Return Return Return Return Control_m Control_m Control_m Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Return Return Return Return Control_m Control_m Control_m Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Return Return Return Return Control_m Control_m Control_m Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Return Return Return Return Control_m Control_m Control_m Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Return Return Return Return Control_m Control_m Control_m Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Return Return Return Return Control_m Control_m Control_m Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Return Return Return Return Control_m Control_m Control_m Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Return Return Return Return Control_m Control_m Control_m Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m
keycode 29 = Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control Control
-keycode 30 = +U+0061 +U+0041 +U+00e6 +U+00c6 Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0061 +U+0041 +U+00e6 +U+00c6 Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0061 +U+0041 +U+00e6 +U+00c6 Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0061 +U+0041 +U+00e6 +U+00c6 Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0041 +U+0061 +U+00c6 +U+00e6 Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0041 +U+0061 +U+00c6 +U+00e6 Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0041 +U+0061 +U+00c6 +U+00e6 Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0041 +U+0061 +U+00c6 +U+00e6 Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a
+keycode 30 = +U+0061 +U+0041 +U+00aa +U+00ba Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0061 +U+0041 +U+00aa +U+00ba Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0061 +U+0041 +U+00aa +U+00ba Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0061 +U+0041 +U+00aa +U+00ba Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0041 +U+0061 +U+00aa +U+00ba Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0041 +U+0061 +U+00aa +U+00ba Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0041 +U+0061 +U+00aa +U+00ba Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a +U+0041 +U+0061 +U+00aa +U+00ba Control_a Control_a Control_a Control_a Meta_a Meta_A Meta_a Meta_A Meta_Control_a Meta_Control_a Meta_Control_a Meta_Control_a
keycode 31 = +U+0073 +U+0053 +U+00df U+00a7 Control_s Control_s Control_s Control_s Meta_s Meta_S Meta_s Meta_S Meta_Control_s Meta_Control_s Meta_Control_s Meta_Control_s +U+0073 +U+0053 +U+00df U+00a7 Control_s Control_s Control_s Control_s Meta_s Meta_S Meta_s Meta_S Meta_Control_s Meta_Control_s Meta_Control_s Meta_Control_s +U+0073 +U+0053 +U+00df U+00a7 Control_s Control_s Control_s Control_s Meta_s Meta_S Meta_s Meta_S Meta_Control_s Meta_Control_s Meta_Control_s Meta_Control_s +U+0073 +U+0053 +U+00df U+00a7 Control_s Control_s Control_s Control_s Meta_s Meta_S Meta_s Meta_S Meta_Control_s Meta_Control_s Meta_Control_s Meta_Control_s +U+0053 +U+0073 +U+0053 U+00a7 Control_s Control_s Control_s Control_s Meta_s Meta_S Meta_s Meta_S Meta_Control_s Meta_Control_s Meta_Control_s Meta_Control_s +U+0053 +U+0073 +U+0053 U+00a7 Control_s Control_s Control_s Control_s Meta_s Meta_S Meta_s Meta_S Meta_Control_s Meta_Control_s Meta_Control_s Meta_Control_s +U+0053 +U+0073 +U+0053 U+00a7 Control_s Control_s Control_s Control_s Meta_s Meta_S Meta_s Meta_S Meta_Control_s Meta_Control_s Meta_Control_s Meta_Control_s +U+0053 +U+0073 +U+0053 U+00a7 Control_s Control_s Control_s Control_s Meta_s Meta_S Meta_s Meta_S Meta_Control_s Meta_Control_s Meta_Control_s Meta_Control_s
keycode 32 = +U+0064 +U+0044 +U+00f0 +U+00d0 Control_d Control_d Control_d Control_d Meta_d Meta_D Meta_d Meta_D Meta_Control_d Meta_Control_d Meta_Control_d Meta_Control_d +U+0064 +U+0044 +U+00f0 +U+00d0 Control_d Control_d Control_d Control_d Meta_d Meta_D Meta_d Meta_D Meta_Control_d Meta_Control_d Meta_Control_d Meta_Control_d +U+0064 +U+0044 +U+00f0 +U+00d0 Control_d Control_d Control_d Control_d Meta_d Meta_D Meta_d Meta_D Meta_Control_d Meta_Control_d Meta_Control_d Meta_Control_d +U+0064 +U+0044 +U+00f0 +U+00d0 Control_d Control_d Control_d Control_d Meta_d Meta_D Meta_d Meta_D Meta_Control_d Meta_Control_d Meta_Control_d Meta_Control_d +U+0044 +U+0064 +U+00d0 +U+00f0 Control_d Control_d Control_d Control_d Meta_d Meta_D Meta_d Meta_D Meta_Control_d Meta_Control_d Meta_Control_d Meta_Control_d +U+0044 +U+0064 +U+00d0 +U+00f0 Control_d Control_d Control_d Control_d Meta_d Meta_D Meta_d Meta_D Meta_Control_d Meta_Control_d Meta_Control_d Meta_Control_d +U+0044 +U+0064 +U+00d0 +U+00f0 Control_d Control_d Control_d Control_d Meta_d Meta_D Meta_d Meta_D Meta_Control_d Meta_Control_d Meta_Control_d Meta_Control_d +U+0044 +U+0064 +U+00d0 +U+00f0 Control_d Control_d Control_d Control_d Meta_d Meta_D Meta_d Meta_D Meta_Control_d Meta_Control_d Meta_Control_d Meta_Control_d
keycode 33 = +U+0066 +U+0046 +U+0111 +U+00aa Control_f Control_f Control_f Control_f Meta_f Meta_F Meta_f Meta_F Meta_Control_f Meta_Control_f Meta_Control_f Meta_Control_f +U+0066 +U+0046 +U+0111 +U+00aa Control_f Control_f Control_f Control_f Meta_f Meta_F Meta_f Meta_F Meta_Control_f Meta_Control_f Meta_Control_f Meta_Control_f +U+0066 +U+0046 +U+0111 +U+00aa Control_f Control_f Control_f Control_f Meta_f Meta_F Meta_f Meta_F Meta_Control_f Meta_Control_f Meta_Control_f Meta_Control_f +U+0066 +U+0046 +U+0111 +U+00aa Control_f Control_f Control_f Control_f Meta_f Meta_F Meta_f Meta_F Meta_Control_f Meta_Control_f Meta_Control_f Meta_Control_f +U+0046 +U+0066 +U+0110 +U+00aa Control_f Control_f Control_f Control_f Meta_f Meta_F Meta_f Meta_F Meta_Control_f Meta_Control_f Meta_Control_f Meta_Control_f +U+0046 +U+0066 +U+0110 +U+00aa Control_f Control_f Control_f Control_f Meta_f Meta_F Meta_f Meta_F Meta_Control_f Meta_Control_f Meta_Control_f Meta_Control_f +U+0046 +U+0066 +U+0110 +U+00aa Control_f Control_f Control_f Control_f Meta_f Meta_F Meta_f Meta_F Meta_Control_f Meta_Control_f Meta_Control_f Meta_Control_f +U+0046 +U+0066 +U+0110 +U+00aa Control_f Control_f Control_f Control_f Meta_f Meta_F Meta_f Meta_F Meta_Control_f Meta_Control_f Meta_Control_f Meta_Control_f
@@ -37,25 +37,25 @@ keycode 35 = +U+0068 +U+0048 +U+0127 +U+0126 BackSpace BackSpace BackSpace BackS
keycode 36 = +U+006a +U+004a U+0309 U+031b Linefeed Linefeed Linefeed Linefeed Meta_j Meta_J Meta_j Meta_J Meta_Linefeed Meta_Linefeed Meta_Linefeed Meta_Linefeed +U+006a +U+004a U+0309 U+031b Linefeed Linefeed Linefeed Linefeed Meta_j Meta_J Meta_j Meta_J Meta_Linefeed Meta_Linefeed Meta_Linefeed Meta_Linefeed +U+006a +U+004a U+0309 U+031b Linefeed Linefeed Linefeed Linefeed Meta_j Meta_J Meta_j Meta_J Meta_Linefeed Meta_Linefeed Meta_Linefeed Meta_Linefeed +U+006a +U+004a U+0309 U+031b Linefeed Linefeed Linefeed Linefeed Meta_j Meta_J Meta_j Meta_J Meta_Linefeed Meta_Linefeed Meta_Linefeed Meta_Linefeed +U+004a +U+006a U+0309 U+031b Linefeed Linefeed Linefeed Linefeed Meta_j Meta_J Meta_j Meta_J Meta_Linefeed Meta_Linefeed Meta_Linefeed Meta_Linefeed +U+004a +U+006a U+0309 U+031b Linefeed Linefeed Linefeed Linefeed Meta_j Meta_J Meta_j Meta_J Meta_Linefeed Meta_Linefeed Meta_Linefeed Meta_Linefeed +U+004a +U+006a U+0309 U+031b Linefeed Linefeed Linefeed Linefeed Meta_j Meta_J Meta_j Meta_J Meta_Linefeed Meta_Linefeed Meta_Linefeed Meta_Linefeed +U+004a +U+006a U+0309 U+031b Linefeed Linefeed Linefeed Linefeed Meta_j Meta_J Meta_j Meta_J Meta_Linefeed Meta_Linefeed Meta_Linefeed Meta_Linefeed
keycode 37 = +U+006b +U+004b +U+0138 U+0026 Control_k Control_k Control_k Control_k Meta_k Meta_K Meta_k Meta_ampersand Meta_Control_k Meta_Control_k Meta_Control_k Meta_Control_k +U+006b +U+004b +U+0138 U+0026 Control_k Control_k Control_k Control_k Meta_k Meta_K Meta_k Meta_ampersand Meta_Control_k Meta_Control_k Meta_Control_k Meta_Control_k +U+006b +U+004b +U+0138 U+0026 Control_k Control_k Control_k Control_k Meta_k Meta_K Meta_k Meta_ampersand Meta_Control_k Meta_Control_k Meta_Control_k Meta_Control_k +U+006b +U+004b +U+0138 U+0026 Control_k Control_k Control_k Control_k Meta_k Meta_K Meta_k Meta_ampersand Meta_Control_k Meta_Control_k Meta_Control_k Meta_Control_k +U+004b +U+006b +U+0138 U+0026 Control_k Control_k Control_k Control_k Meta_k Meta_K Meta_k Meta_ampersand Meta_Control_k Meta_Control_k Meta_Control_k Meta_Control_k +U+004b +U+006b +U+0138 U+0026 Control_k Control_k Control_k Control_k Meta_k Meta_K Meta_k Meta_ampersand Meta_Control_k Meta_Control_k Meta_Control_k Meta_Control_k +U+004b +U+006b +U+0138 U+0026 Control_k Control_k Control_k Control_k Meta_k Meta_K Meta_k Meta_ampersand Meta_Control_k Meta_Control_k Meta_Control_k Meta_Control_k +U+004b +U+006b +U+0138 U+0026 Control_k Control_k Control_k Control_k Meta_k Meta_K Meta_k Meta_ampersand Meta_Control_k Meta_Control_k Meta_Control_k Meta_Control_k
keycode 38 = +U+006c +U+004c +U+0142 +U+0141 Control_l Control_l Control_l Control_l Meta_l Meta_L Meta_l Meta_L Meta_Control_l Meta_Control_l Meta_Control_l Meta_Control_l +U+006c +U+004c +U+0142 +U+0141 Control_l Control_l Control_l Control_l Meta_l Meta_L Meta_l Meta_L Meta_Control_l Meta_Control_l Meta_Control_l Meta_Control_l +U+006c +U+004c +U+0142 +U+0141 Control_l Control_l Control_l Control_l Meta_l Meta_L Meta_l Meta_L Meta_Control_l Meta_Control_l Meta_Control_l Meta_Control_l +U+006c +U+004c +U+0142 +U+0141 Control_l Control_l Control_l Control_l Meta_l Meta_L Meta_l Meta_L Meta_Control_l Meta_Control_l Meta_Control_l Meta_Control_l +U+004c +U+006c +U+0141 +U+0142 Control_l Control_l Control_l Control_l Meta_l Meta_L Meta_l Meta_L Meta_Control_l Meta_Control_l Meta_Control_l Meta_Control_l +U+004c +U+006c +U+0141 +U+0142 Control_l Control_l Control_l Control_l Meta_l Meta_L Meta_l Meta_L Meta_Control_l Meta_Control_l Meta_Control_l Meta_Control_l +U+004c +U+006c +U+0141 +U+0142 Control_l Control_l Control_l Control_l Meta_l Meta_L Meta_l Meta_L Meta_Control_l Meta_Control_l Meta_Control_l Meta_Control_l +U+004c +U+006c +U+0141 +U+0142 Control_l Control_l Control_l Control_l Meta_l Meta_L Meta_l Meta_L Meta_Control_l Meta_Control_l Meta_Control_l Meta_Control_l
-keycode 39 = +U+00f2 +U+00e7 U+0040 dead_cedilla nul dead_cedilla nul dead_cedilla Meta_at dead_cedilla Meta_at dead_cedilla Meta_nul dead_cedilla Meta_nul dead_cedilla +U+00f2 +U+00e7 U+0040 dead_cedilla nul dead_cedilla nul dead_cedilla Meta_at dead_cedilla Meta_at dead_cedilla Meta_nul dead_cedilla Meta_nul dead_cedilla +U+00f2 +U+00e7 U+0040 dead_cedilla nul dead_cedilla nul dead_cedilla Meta_at dead_cedilla Meta_at dead_cedilla Meta_nul dead_cedilla Meta_nul dead_cedilla +U+00f2 +U+00e7 U+0040 dead_cedilla nul dead_cedilla nul dead_cedilla Meta_at dead_cedilla Meta_at dead_cedilla Meta_nul dead_cedilla Meta_nul dead_cedilla +U+00d2 +U+00c7 U+0040 dead_cedilla nul dead_cedilla nul dead_cedilla Meta_at dead_cedilla Meta_at dead_cedilla Meta_nul dead_cedilla Meta_nul dead_cedilla +U+00d2 +U+00c7 U+0040 dead_cedilla nul dead_cedilla nul dead_cedilla Meta_at dead_cedilla Meta_at dead_cedilla Meta_nul dead_cedilla Meta_nul dead_cedilla +U+00d2 +U+00c7 U+0040 dead_cedilla nul dead_cedilla nul dead_cedilla Meta_at dead_cedilla Meta_at dead_cedilla Meta_nul dead_cedilla Meta_nul dead_cedilla +U+00d2 +U+00c7 U+0040 dead_cedilla nul dead_cedilla nul dead_cedilla Meta_at dead_cedilla Meta_at dead_cedilla Meta_nul dead_cedilla Meta_nul dead_cedilla
-keycode 40 = +U+00e0 U+00b0 U+0023 U+002a VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_numbersign Meta_asterisk Meta_numbersign Meta_asterisk VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00e0 U+00b0 U+0023 U+002a VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_numbersign Meta_asterisk Meta_numbersign Meta_asterisk VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00e0 U+00b0 U+0023 U+002a VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_numbersign Meta_asterisk Meta_numbersign Meta_asterisk VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00e0 U+00b0 U+0023 U+002a VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_numbersign Meta_asterisk Meta_numbersign Meta_asterisk VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00c0 U+00b0 U+0023 U+002a VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_numbersign Meta_asterisk Meta_numbersign Meta_asterisk VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00c0 U+00b0 U+0023 U+002a VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_numbersign Meta_asterisk Meta_numbersign Meta_asterisk VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00c0 U+00b0 U+0023 U+002a VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_numbersign Meta_asterisk Meta_numbersign Meta_asterisk VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00c0 U+00b0 U+0023 U+002a VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_numbersign Meta_asterisk Meta_numbersign Meta_asterisk VoidSymbol VoidSymbol VoidSymbol VoidSymbol
-keycode 41 = U+005c U+007c U+00ac U+00a6 Control_backslash Control_backslash Control_backslash Control_backslash Meta_backslash Meta_bar Meta_backslash Meta_bar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+005c U+007c U+00ac U+00a6 Control_backslash Control_backslash Control_backslash Control_backslash Meta_backslash Meta_bar Meta_backslash Meta_bar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+005c U+007c U+00ac U+00a6 Control_backslash Control_backslash Control_backslash Control_backslash Meta_backslash Meta_bar Meta_backslash Meta_bar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+005c U+007c U+00ac U+00a6 Control_backslash Control_backslash Control_backslash Control_backslash Meta_backslash Meta_bar Meta_backslash Meta_bar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+005c U+007c U+00ac U+00a6 Control_backslash Control_backslash Control_backslash Control_backslash Meta_backslash Meta_bar Meta_backslash Meta_bar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+005c U+007c U+00ac U+00a6 Control_backslash Control_backslash Control_backslash Control_backslash Meta_backslash Meta_bar Meta_backslash Meta_bar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+005c U+007c U+00ac U+00a6 Control_backslash Control_backslash Control_backslash Control_backslash Meta_backslash Meta_bar Meta_backslash Meta_bar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash U+005c U+007c U+00ac U+00a6 Control_backslash Control_backslash Control_backslash Control_backslash Meta_backslash Meta_bar Meta_backslash Meta_bar Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash Meta_Control_backslash
+keycode 39 = +U+00f6 +U+00d6 +U+00f8 +U+00d8 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00f6 +U+00d6 +U+00f8 +U+00d8 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00f6 +U+00d6 +U+00f8 +U+00d8 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00f6 +U+00d6 +U+00f8 +U+00d8 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00d6 +U+00f6 +U+00d8 +U+00f8 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00d6 +U+00f6 +U+00d8 +U+00f8 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00d6 +U+00f6 +U+00d8 +U+00f8 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00d6 +U+00f6 +U+00d8 +U+00f8 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol
+keycode 40 = +U+00e4 +U+00c4 +U+00e6 +U+00c6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00e4 +U+00c4 +U+00e6 +U+00c6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00e4 +U+00c4 +U+00e6 +U+00c6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00e4 +U+00c4 +U+00e6 +U+00c6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00c4 +U+00e4 +U+00c6 +U+00e6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00c4 +U+00e4 +U+00c6 +U+00e6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00c4 +U+00e4 +U+00c6 +U+00e6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol +U+00c4 +U+00e4 +U+00c6 +U+00e6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol
+keycode 41 = U+00a7 U+00bd U+00b6 U+00be VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+00a7 U+00bd U+00b6 U+00be VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+00a7 U+00bd U+00b6 U+00be VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+00a7 U+00bd U+00b6 U+00be VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+00a7 U+00bd U+00b6 U+00be VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+00a7 U+00bd U+00b6 U+00be VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+00a7 U+00bd U+00b6 U+00be VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+00a7 U+00bd U+00b6 U+00be VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol VoidSymbol
keycode 42 = Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift
-keycode 43 = +U+00f9 U+00a7 dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve +U+00f9 U+00a7 dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve +U+00f9 U+00a7 dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve +U+00f9 U+00a7 dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve +U+00d9 U+00a7 dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve +U+00d9 U+00a7 dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve +U+00d9 U+00a7 dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve +U+00d9 U+00a7 dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve dead_grave dead_breve
+keycode 43 = U+0027 U+002a U+0027 U+00d7 Control_g Control_g Control_g Control_g Meta_apostrophe Meta_asterisk Meta_apostrophe Meta_apostrophe Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g U+0027 U+002a U+0027 U+00d7 Control_g Control_g Control_g Control_g Meta_apostrophe Meta_asterisk Meta_apostrophe Meta_apostrophe Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g U+0027 U+002a U+0027 U+00d7 Control_g Control_g Control_g Control_g Meta_apostrophe Meta_asterisk Meta_apostrophe Meta_apostrophe Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g U+0027 U+002a U+0027 U+00d7 Control_g Control_g Control_g Control_g Meta_apostrophe Meta_asterisk Meta_apostrophe Meta_apostrophe Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g U+0027 U+002a U+0027 U+00d7 Control_g Control_g Control_g Control_g Meta_apostrophe Meta_asterisk Meta_apostrophe Meta_apostrophe Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g U+0027 U+002a U+0027 U+00d7 Control_g Control_g Control_g Control_g Meta_apostrophe Meta_asterisk Meta_apostrophe Meta_apostrophe Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g U+0027 U+002a U+0027 U+00d7 Control_g Control_g Control_g Control_g Meta_apostrophe Meta_asterisk Meta_apostrophe Meta_apostrophe Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g U+0027 U+002a U+0027 U+00d7 Control_g Control_g Control_g Control_g Meta_apostrophe Meta_asterisk Meta_apostrophe Meta_apostrophe Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g
keycode 44 = +U+007a +U+005a U+00ab U+003c Control_z Control_z Control_z Control_z Meta_z Meta_Z Meta_z Meta_less Meta_Control_z Meta_Control_z Meta_Control_z Meta_Control_z +U+007a +U+005a U+00ab U+003c Control_z Control_z Control_z Control_z Meta_z Meta_Z Meta_z Meta_less Meta_Control_z Meta_Control_z Meta_Control_z Meta_Control_z +U+007a +U+005a U+00ab U+003c Control_z Control_z Control_z Control_z Meta_z Meta_Z Meta_z Meta_less Meta_Control_z Meta_Control_z Meta_Control_z Meta_Control_z +U+007a +U+005a U+00ab U+003c Control_z Control_z Control_z Control_z Meta_z Meta_Z Meta_z Meta_less Meta_Control_z Meta_Control_z Meta_Control_z Meta_Control_z +U+005a +U+007a U+00ab U+003c Control_z Control_z Control_z Control_z Meta_z Meta_Z Meta_z Meta_less Meta_Control_z Meta_Control_z Meta_Control_z Meta_Control_z +U+005a +U+007a U+00ab U+003c Control_z Control_z Control_z Control_z Meta_z Meta_Z Meta_z Meta_less Meta_Control_z Meta_Control_z Meta_Control_z Meta_Control_z +U+005a +U+007a U+00ab U+003c Control_z Control_z Control_z Control_z Meta_z Meta_Z Meta_z Meta_less Meta_Control_z Meta_Control_z Meta_Control_z Meta_Control_z +U+005a +U+007a U+00ab U+003c Control_z Control_z Control_z Control_z Meta_z Meta_Z Meta_z Meta_less Meta_Control_z Meta_Control_z Meta_Control_z Meta_Control_z
keycode 45 = +U+0078 +U+0058 U+00bb U+003e Control_x Control_x Control_x Control_x Meta_x Meta_X Meta_x Meta_greater Meta_Control_x Meta_Control_x Meta_Control_x Meta_Control_x +U+0078 +U+0058 U+00bb U+003e Control_x Control_x Control_x Control_x Meta_x Meta_X Meta_x Meta_greater Meta_Control_x Meta_Control_x Meta_Control_x Meta_Control_x +U+0078 +U+0058 U+00bb U+003e Control_x Control_x Control_x Control_x Meta_x Meta_X Meta_x Meta_greater Meta_Control_x Meta_Control_x Meta_Control_x Meta_Control_x +U+0078 +U+0058 U+00bb U+003e Control_x Control_x Control_x Control_x Meta_x Meta_X Meta_x Meta_greater Meta_Control_x Meta_Control_x Meta_Control_x Meta_Control_x +U+0058 +U+0078 U+00bb U+003e Control_x Control_x Control_x Control_x Meta_x Meta_X Meta_x Meta_greater Meta_Control_x Meta_Control_x Meta_Control_x Meta_Control_x +U+0058 +U+0078 U+00bb U+003e Control_x Control_x Control_x Control_x Meta_x Meta_X Meta_x Meta_greater Meta_Control_x Meta_Control_x Meta_Control_x Meta_Control_x +U+0058 +U+0078 U+00bb U+003e Control_x Control_x Control_x Control_x Meta_x Meta_X Meta_x Meta_greater Meta_Control_x Meta_Control_x Meta_Control_x Meta_Control_x +U+0058 +U+0078 U+00bb U+003e Control_x Control_x Control_x Control_x Meta_x Meta_X Meta_x Meta_greater Meta_Control_x Meta_Control_x Meta_Control_x Meta_Control_x
-keycode 46 = +U+0063 +U+0043 U+00a2 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0063 +U+0043 U+00a2 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0063 +U+0043 U+00a2 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0063 +U+0043 U+00a2 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0043 +U+0063 U+00a2 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0043 +U+0063 U+00a2 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0043 +U+0063 U+00a2 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0043 +U+0063 U+00a2 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c
+keycode 46 = +U+0063 +U+0043 U+00a9 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0063 +U+0043 U+00a9 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0063 +U+0043 U+00a9 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0063 +U+0043 U+00a9 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0043 +U+0063 U+00a9 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0043 +U+0063 U+00a9 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0043 +U+0063 U+00a9 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c +U+0043 +U+0063 U+00a9 U+00a9 Control_c Control_c Control_c Control_c Meta_c Meta_C Meta_c Meta_C Meta_Control_c Meta_Control_c Meta_Control_c Meta_Control_c
keycode 47 = +U+0076 +U+0056 U+201c U+2018 Control_v Control_v Control_v Control_v Meta_v Meta_V Meta_v Meta_V Meta_Control_v Meta_Control_v Meta_Control_v Meta_Control_v +U+0076 +U+0056 U+201c U+2018 Control_v Control_v Control_v Control_v Meta_v Meta_V Meta_v Meta_V Meta_Control_v Meta_Control_v Meta_Control_v Meta_Control_v +U+0076 +U+0056 U+201c U+2018 Control_v Control_v Control_v Control_v Meta_v Meta_V Meta_v Meta_V Meta_Control_v Meta_Control_v Meta_Control_v Meta_Control_v +U+0076 +U+0056 U+201c U+2018 Control_v Control_v Control_v Control_v Meta_v Meta_V Meta_v Meta_V Meta_Control_v Meta_Control_v Meta_Control_v Meta_Control_v +U+0056 +U+0076 U+201c U+2018 Control_v Control_v Control_v Control_v Meta_v Meta_V Meta_v Meta_V Meta_Control_v Meta_Control_v Meta_Control_v Meta_Control_v +U+0056 +U+0076 U+201c U+2018 Control_v Control_v Control_v Control_v Meta_v Meta_V Meta_v Meta_V Meta_Control_v Meta_Control_v Meta_Control_v Meta_Control_v +U+0056 +U+0076 U+201c U+2018 Control_v Control_v Control_v Control_v Meta_v Meta_V Meta_v Meta_V Meta_Control_v Meta_Control_v Meta_Control_v Meta_Control_v +U+0056 +U+0076 U+201c U+2018 Control_v Control_v Control_v Control_v Meta_v Meta_V Meta_v Meta_V Meta_Control_v Meta_Control_v Meta_Control_v Meta_Control_v
keycode 48 = +U+0062 +U+0042 U+201d U+2019 Control_b Control_b Control_b Control_b Meta_b Meta_B Meta_b Meta_B Meta_Control_b Meta_Control_b Meta_Control_b Meta_Control_b +U+0062 +U+0042 U+201d U+2019 Control_b Control_b Control_b Control_b Meta_b Meta_B Meta_b Meta_B Meta_Control_b Meta_Control_b Meta_Control_b Meta_Control_b +U+0062 +U+0042 U+201d U+2019 Control_b Control_b Control_b Control_b Meta_b Meta_B Meta_b Meta_B Meta_Control_b Meta_Control_b Meta_Control_b Meta_Control_b +U+0062 +U+0042 U+201d U+2019 Control_b Control_b Control_b Control_b Meta_b Meta_B Meta_b Meta_B Meta_Control_b Meta_Control_b Meta_Control_b Meta_Control_b +U+0042 +U+0062 U+201d U+2019 Control_b Control_b Control_b Control_b Meta_b Meta_B Meta_b Meta_B Meta_Control_b Meta_Control_b Meta_Control_b Meta_Control_b +U+0042 +U+0062 U+201d U+2019 Control_b Control_b Control_b Control_b Meta_b Meta_B Meta_b Meta_B Meta_Control_b Meta_Control_b Meta_Control_b Meta_Control_b +U+0042 +U+0062 U+201d U+2019 Control_b Control_b Control_b Control_b Meta_b Meta_B Meta_b Meta_B Meta_Control_b Meta_Control_b Meta_Control_b Meta_Control_b +U+0042 +U+0062 U+201d U+2019 Control_b Control_b Control_b Control_b Meta_b Meta_B Meta_b Meta_B Meta_Control_b Meta_Control_b Meta_Control_b Meta_Control_b
-keycode 49 = +U+006e +U+004e +U+00f1 +U+00d1 Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+006e +U+004e +U+00f1 +U+00d1 Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+006e +U+004e +U+00f1 +U+00d1 Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+006e +U+004e +U+00f1 +U+00d1 Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+004e +U+006e +U+00d1 +U+00f1 Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+004e +U+006e +U+00d1 +U+00f1 Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+004e +U+006e +U+00d1 +U+00f1 Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+004e +U+006e +U+00d1 +U+00f1 Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n
+keycode 49 = +U+006e +U+004e +U+006e +U+004e Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+006e +U+004e +U+006e +U+004e Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+006e +U+004e +U+006e +U+004e Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+006e +U+004e +U+006e +U+004e Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+004e +U+006e +U+004e +U+006e Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+004e +U+006e +U+004e +U+006e Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+004e +U+006e +U+004e +U+006e Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n +U+004e +U+006e +U+004e +U+006e Control_n Control_n Control_n Control_n Meta_n Meta_N Meta_n Meta_N Meta_Control_n Meta_Control_n Meta_Control_n Meta_Control_n
keycode 50 = +U+006d +U+004d +U+00b5 +U+00ba Control_m Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_M Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m +U+006d +U+004d +U+00b5 +U+00ba Control_m Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_M Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m +U+006d +U+004d +U+00b5 +U+00ba Control_m Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_M Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m +U+006d +U+004d +U+00b5 +U+00ba Control_m Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_M Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m +U+004d +U+006d +U+039c +U+00ba Control_m Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_M Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m +U+004d +U+006d +U+039c +U+00ba Control_m Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_M Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m +U+004d +U+006d +U+039c +U+00ba Control_m Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_M Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m +U+004d +U+006d +U+039c +U+00ba Control_m Control_m Control_m Control_m Meta_m Meta_M Meta_m Meta_M Meta_Control_m Meta_Control_m Meta_Control_m Meta_Control_m
-keycode 51 = U+002c U+003b dead_acute U+00d7 dead_acute dead_acute dead_acute dead_acute Meta_comma Meta_semicolon dead_acute dead_acute dead_acute dead_acute dead_acute dead_acute U+002c U+003b dead_acute U+00d7 dead_acute dead_acute dead_acute dead_acute Meta_comma Meta_semicolon dead_acute dead_acute dead_acute dead_acute dead_acute dead_acute U+002c U+003b dead_acute U+00d7 dead_acute dead_acute dead_acute dead_acute Meta_comma Meta_semicolon dead_acute dead_acute dead_acute dead_acute dead_acute dead_acute U+002c U+003b dead_acute U+00d7 dead_acute dead_acute dead_acute dead_acute Meta_comma Meta_semicolon dead_acute dead_acute dead_acute dead_acute dead_acute dead_acute U+002c U+003b dead_acute U+00d7 dead_acute dead_acute dead_acute dead_acute Meta_comma Meta_semicolon dead_acute dead_acute dead_acute dead_acute dead_acute dead_acute U+002c U+003b dead_acute U+00d7 dead_acute dead_acute dead_acute dead_acute Meta_comma Meta_semicolon dead_acute dead_acute dead_acute dead_acute dead_acute dead_acute U+002c U+003b dead_acute U+00d7 dead_acute dead_acute dead_acute dead_acute Meta_comma Meta_semicolon dead_acute dead_acute dead_acute dead_acute dead_acute dead_acute U+002c U+003b dead_acute U+00d7 dead_acute dead_acute dead_acute dead_acute Meta_comma Meta_semicolon dead_acute dead_acute dead_acute dead_acute dead_acute dead_acute
-keycode 52 = U+002e U+003a U+00b7 dead_diaeresis Compose Compose Compose dead_diaeresis Meta_period Meta_colon Meta_period dead_diaeresis Compose Compose Compose dead_diaeresis U+002e U+003a U+00b7 dead_diaeresis Compose Compose Compose dead_diaeresis Meta_period Meta_colon Meta_period dead_diaeresis Compose Compose Compose dead_diaeresis U+002e U+003a U+00b7 dead_diaeresis Compose Compose Compose dead_diaeresis Meta_period Meta_colon Meta_period dead_diaeresis Compose Compose Compose dead_diaeresis U+002e U+003a U+00b7 dead_diaeresis Compose Compose Compose dead_diaeresis Meta_period Meta_colon Meta_period dead_diaeresis Compose Compose Compose dead_diaeresis U+002e U+003a U+00b7 dead_diaeresis Compose Compose Compose dead_diaeresis Meta_period Meta_colon Meta_period dead_diaeresis Compose Compose Compose dead_diaeresis U+002e U+003a U+00b7 dead_diaeresis Compose Compose Compose dead_diaeresis Meta_period Meta_colon Meta_period dead_diaeresis Compose Compose Compose dead_diaeresis U+002e U+003a U+00b7 dead_diaeresis Compose Compose Compose dead_diaeresis Meta_period Meta_colon Meta_period dead_diaeresis Compose Compose Compose dead_diaeresis U+002e U+003a U+00b7 dead_diaeresis Compose Compose Compose dead_diaeresis Meta_period Meta_colon Meta_period dead_diaeresis Compose Compose Compose dead_diaeresis
-keycode 53 = U+002d U+005f U+005f U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_minus Meta_underscore Meta_underscore Meta_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+002d U+005f U+005f U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_minus Meta_underscore Meta_underscore Meta_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+002d U+005f U+005f U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_minus Meta_underscore Meta_underscore Meta_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+002d U+005f U+005f U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_minus Meta_underscore Meta_underscore Meta_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+002d U+005f U+005f U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_minus Meta_underscore Meta_underscore Meta_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+002d U+005f U+005f U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_minus Meta_underscore Meta_underscore Meta_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+002d U+005f U+005f U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_minus Meta_underscore Meta_underscore Meta_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore U+002d U+005f U+005f U+00f7 Control_underscore Control_underscore Control_underscore Control_underscore Meta_minus Meta_underscore Meta_underscore Meta_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore Meta_Control_underscore
+keycode 51 = U+002c U+003b dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek Meta_comma Meta_semicolon dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek U+002c U+003b dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek Meta_comma Meta_semicolon dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek U+002c U+003b dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek Meta_comma Meta_semicolon dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek U+002c U+003b dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek Meta_comma Meta_semicolon dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek U+002c U+003b dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek Meta_comma Meta_semicolon dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek U+002c U+003b dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek Meta_comma Meta_semicolon dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek U+002c U+003b dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek Meta_comma Meta_semicolon dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek U+002c U+003b dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek Meta_comma Meta_semicolon dead_cedilla dead_ogonek dead_cedilla dead_ogonek dead_cedilla dead_ogonek
+keycode 52 = U+002e U+003a U+00b7 U+002e Compose Compose Compose Compose Meta_period Meta_colon Meta_period Meta_period Compose Compose Compose Compose U+002e U+003a U+00b7 U+002e Compose Compose Compose Compose Meta_period Meta_colon Meta_period Meta_period Compose Compose Compose Compose U+002e U+003a U+00b7 U+002e Compose Compose Compose Compose Meta_period Meta_colon Meta_period Meta_period Compose Compose Compose Compose U+002e U+003a U+00b7 U+002e Compose Compose Compose Compose Meta_period Meta_colon Meta_period Meta_period Compose Compose Compose Compose U+002e U+003a U+00b7 U+002e Compose Compose Compose Compose Meta_period Meta_colon Meta_period Meta_period Compose Compose Compose Compose U+002e U+003a U+00b7 U+002e Compose Compose Compose Compose Meta_period Meta_colon Meta_period Meta_period Compose Compose Compose Compose U+002e U+003a U+00b7 U+002e Compose Compose Compose Compose Meta_period Meta_colon Meta_period Meta_period Compose Compose Compose Compose U+002e U+003a U+00b7 U+002e Compose Compose Compose Compose Meta_period Meta_colon Meta_period Meta_period Compose Compose Compose Compose
+keycode 53 = U+002d U+005f U+0323 U+002e Control_underscore Control_underscore Compose Compose Meta_minus Meta_underscore Meta_minus Meta_period Meta_Control_underscore Meta_Control_underscore Compose Compose U+002d U+005f U+0323 U+002e Control_underscore Control_underscore Compose Compose Meta_minus Meta_underscore Meta_minus Meta_period Meta_Control_underscore Meta_Control_underscore Compose Compose U+002d U+005f U+0323 U+002e Control_underscore Control_underscore Compose Compose Meta_minus Meta_underscore Meta_minus Meta_period Meta_Control_underscore Meta_Control_underscore Compose Compose U+002d U+005f U+0323 U+002e Control_underscore Control_underscore Compose Compose Meta_minus Meta_underscore Meta_minus Meta_period Meta_Control_underscore Meta_Control_underscore Compose Compose U+002d U+005f U+0323 U+002e Control_underscore Control_underscore Compose Compose Meta_minus Meta_underscore Meta_minus Meta_period Meta_Control_underscore Meta_Control_underscore Compose Compose U+002d U+005f U+0323 U+002e Control_underscore Control_underscore Compose Compose Meta_minus Meta_underscore Meta_minus Meta_period Meta_Control_underscore Meta_Control_underscore Compose Compose U+002d U+005f U+0323 U+002e Control_underscore Control_underscore Compose Compose Meta_minus Meta_underscore Meta_minus Meta_period Meta_Control_underscore Meta_Control_underscore Compose Compose U+002d U+005f U+0323 U+002e Control_underscore Control_underscore Compose Compose Meta_minus Meta_underscore Meta_minus Meta_period Meta_Control_underscore Meta_Control_underscore Compose Compose
keycode 54 = Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift Shift
keycode 55 = KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply Hex_C KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply
keycode 56 = Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt Alt
-keycode 57 = U+0020 U+0020 U+0020 U+0020 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+0020 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+0020 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+0020 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+0020 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+0020 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+0020 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+0020 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul
+keycode 57 = U+0020 U+0020 U+0020 U+00a0 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+00a0 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+00a0 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+00a0 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+00a0 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+00a0 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+00a0 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul U+0020 U+0020 U+0020 U+00a0 nul nul nul nul Meta_space Meta_space Meta_space Meta_space Meta_nul Meta_nul Meta_nul Meta_nul
keycode 58 = CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock CtrlL_Lock
keycode 59 = F1 F13 Console_13 Console_25 F25 F37 Console_13 Console_25 Console_1 Console_13 F1 F1 Console_1 Console_13 F1 F1 F1 F13 Console_13 Console_25 F25 F37 Console_13 Console_25 Console_1 Console_13 F1 F1 Console_1 Console_13 F1 F1 F1 F13 Console_13 Console_25 F25 F37 Console_13 Console_25 Console_1 Console_13 F1 F1 Console_1 Console_13 F1 F1 F1 F13 Console_13 Console_25 F25 F37 Console_13 Console_25 Console_1 Console_13 F1 F1 Console_1 Console_13 F1 F1 F1 F13 Console_13 Console_25 F25 F37 Console_13 Console_25 Console_1 Console_13 F1 F1 Console_1 Console_13 F1 F1 F1 F13 Console_13 Console_25 F25 F37 Console_13 Console_25 Console_1 Console_13 F1 F1 Console_1 Console_13 F1 F1 F1 F13 Console_13 Console_25 F25 F37 Console_13 Console_25 Console_1 Console_13 F1 F1 Console_1 Console_13 F1 F1 F1 F13 Console_13 Console_25 F25 F37 Console_13 Console_25 Console_1 Console_13 F1 F1 Console_1 Console_13 F1 F1
keycode 60 = F2 F14 Console_14 Console_26 F26 F38 Console_14 Console_26 Console_2 Console_14 F2 F2 Console_2 Console_14 F2 F2 F2 F14 Console_14 Console_26 F26 F38 Console_14 Console_26 Console_2 Console_14 F2 F2 Console_2 Console_14 F2 F2 F2 F14 Console_14 Console_26 F26 F38 Console_14 Console_26 Console_2 Console_14 F2 F2 Console_2 Console_14 F2 F2 F2 F14 Console_14 Console_26 F26 F38 Console_14 Console_26 Console_2 Console_14 F2 F2 Console_2 Console_14 F2 F2 F2 F14 Console_14 Console_26 F26 F38 Console_14 Console_26 Console_2 Console_14 F2 F2 Console_2 Console_14 F2 F2 F2 F14 Console_14 Console_26 F26 F38 Console_14 Console_26 Console_2 Console_14 F2 F2 Console_2 Console_14 F2 F2 F2 F14 Console_14 Console_26 F26 F38 Console_14 Console_26 Console_2 Console_14 F2 F2 Console_2 Console_14 F2 F2 F2 F14 Console_14 Console_26 F26 F38 Console_14 Console_26 Console_2 Console_14 F2 F2 Console_2 Console_14 F2 F2
@@ -81,8 +81,8 @@ keycode 79 = KP_1 KP_1 Hex_1 KP_1 KP_1 KP_1 KP_1 KP_1 Ascii_1 Hex_1 KP_1 KP_1 KP
keycode 80 = KP_2 KP_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 Ascii_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 Ascii_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 Ascii_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 Ascii_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 Ascii_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 Ascii_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 Ascii_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 Ascii_2 Hex_2 KP_2 KP_2 KP_2 KP_2 KP_2 KP_2
keycode 81 = KP_3 KP_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 Ascii_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 Ascii_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 Ascii_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 Ascii_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 Ascii_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 Ascii_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 Ascii_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 Ascii_3 Hex_3 KP_3 KP_3 KP_3 KP_3 KP_3 KP_3
keycode 82 = KP_0 KP_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 Ascii_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 Ascii_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 Ascii_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 Ascii_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 Ascii_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 Ascii_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 Ascii_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 Ascii_0 Hex_0 KP_0 KP_0 KP_0 KP_0 KP_0 KP_0
-keycode 83 = KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period KP_Period KP_Period KP_Period KP_Period Boot KP_Period Boot KP_Period
-keycode 86 = U+003c U+003e U+00ab U+00bb VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_less Meta_greater VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+00ab U+00bb VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_less Meta_greater VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+00ab U+00bb VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_less Meta_greater VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+00ab U+00bb VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_less Meta_greater VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+00ab U+00bb VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_less Meta_greater VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+00ab U+00bb VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_less Meta_greater VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+00ab U+00bb VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_less Meta_greater VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+00ab U+00bb VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_less Meta_greater VoidSymbol VoidSymbol VoidSymbol VoidSymbol
+keycode 83 = KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma KP_Comma KP_Comma KP_Comma KP_Comma Boot KP_Comma Boot KP_Comma
+keycode 86 = U+003c U+003e U+007c U+00a6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_bar Meta_bar VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+007c U+00a6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_bar Meta_bar VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+007c U+00a6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_bar Meta_bar VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+007c U+00a6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_bar Meta_bar VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+007c U+00a6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_bar Meta_bar VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+007c U+00a6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_bar Meta_bar VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+007c U+00a6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_bar Meta_bar VoidSymbol VoidSymbol VoidSymbol VoidSymbol U+003c U+003e U+007c U+00a6 VoidSymbol VoidSymbol VoidSymbol VoidSymbol Meta_less Meta_greater Meta_bar Meta_bar VoidSymbol VoidSymbol VoidSymbol VoidSymbol
keycode 87 = F11 F23 Console_23 Console_35 F35 F47 Console_23 Console_35 Console_11 Console_23 F11 F11 Console_11 Console_23 F11 F11 F11 F23 Console_23 Console_35 F35 F47 Console_23 Console_35 Console_11 Console_23 F11 F11 Console_11 Console_23 F11 F11 F11 F23 Console_23 Console_35 F35 F47 Console_23 Console_35 Console_11 Console_23 F11 F11 Console_11 Console_23 F11 F11 F11 F23 Console_23 Console_35 F35 F47 Console_23 Console_35 Console_11 Console_23 F11 F11 Console_11 Console_23 F11 F11 F11 F23 Console_23 Console_35 F35 F47 Console_23 Console_35 Console_11 Console_23 F11 F11 Console_11 Console_23 F11 F11 F11 F23 Console_23 Console_35 F35 F47 Console_23 Console_35 Console_11 Console_23 F11 F11 Console_11 Console_23 F11 F11 F11 F23 Console_23 Console_35 F35 F47 Console_23 Console_35 Console_11 Console_23 F11 F11 Console_11 Console_23 F11 F11 F11 F23 Console_23 Console_35 F35 F47 Console_23 Console_35 Console_11 Console_23 F11 F11 Console_11 Console_23 F11 F11
keycode 88 = F12 F24 Console_24 Console_36 F36 F48 Console_24 Console_36 Console_12 Console_24 F12 F12 Console_12 Console_24 F12 F12 F12 F24 Console_24 Console_36 F36 F48 Console_24 Console_36 Console_12 Console_24 F12 F12 Console_12 Console_24 F12 F12 F12 F24 Console_24 Console_36 F36 F48 Console_24 Console_36 Console_12 Console_24 F12 F12 Console_12 Console_24 F12 F12 F12 F24 Console_24 Console_36 F36 F48 Console_24 Console_36 Console_12 Console_24 F12 F12 Console_12 Console_24 F12 F12 F12 F24 Console_24 Console_36 F36 F48 Console_24 Console_36 Console_12 Console_24 F12 F12 Console_12 Console_24 F12 F12 F12 F24 Console_24 Console_36 F36 F48 Console_24 Console_36 Console_12 Console_24 F12 F12 Console_12 Console_24 F12 F12 F12 F24 Console_24 Console_36 F36 F48 Console_24 Console_36 Console_12 Console_24 F12 F12 Console_12 Console_24 F12 F12 F12 F24 Console_24 Console_36 F36 F48 Console_24 Console_36 Console_12 Console_24 F12 F12 Console_12 Console_24 F12 F12
keycode 102 = Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home Home
diff --git a/resources/grub/keymap/original/ukdvorak b/resources/utilities/grub-assemble/keymap/original/ukdvorak
index d41b873..d41b873 100644
--- a/resources/grub/keymap/original/ukdvorak
+++ b/resources/utilities/grub-assemble/keymap/original/ukdvorak
diff --git a/resources/grub/keymap/original/ukqwerty b/resources/utilities/grub-assemble/keymap/original/ukqwerty
index 94e5a45..94e5a45 100644
--- a/resources/grub/keymap/original/ukqwerty
+++ b/resources/utilities/grub-assemble/keymap/original/ukqwerty
diff --git a/resources/grub/keymap/original/usdvorak b/resources/utilities/grub-assemble/keymap/original/usdvorak
index b99b6a0..b99b6a0 100644
--- a/resources/grub/keymap/original/usdvorak
+++ b/resources/utilities/grub-assemble/keymap/original/usdvorak
diff --git a/resources/grub/keymap/original/usqwerty b/resources/utilities/grub-assemble/keymap/original/usqwerty
index 5110323..5110323 100644
--- a/resources/grub/keymap/original/usqwerty
+++ b/resources/utilities/grub-assemble/keymap/original/usqwerty
diff --git a/resources/grub/keymap/ukqwerty.gkb b/resources/utilities/grub-assemble/keymap/svenska.gkb
index 8e5ff29..ec627db 100644
--- a/resources/grub/keymap/ukqwerty.gkb
+++ b/resources/utilities/grub-assemble/keymap/svenska.gkb
Binary files differ
diff --git a/resources/grub/keymap/ukdvorak.gkb b/resources/utilities/grub-assemble/keymap/ukdvorak.gkb
index c793cae..c793cae 100644
--- a/resources/grub/keymap/ukdvorak.gkb
+++ b/resources/utilities/grub-assemble/keymap/ukdvorak.gkb
Binary files differ
diff --git a/resources/grub/keymap/ukqwerty.gkb b/resources/utilities/grub-assemble/keymap/ukqwerty.gkb
index 8e5ff29..8e5ff29 100644
--- a/resources/grub/keymap/ukqwerty.gkb
+++ b/resources/utilities/grub-assemble/keymap/ukqwerty.gkb
Binary files differ
diff --git a/resources/grub/keymap/usdvorak.gkb b/resources/utilities/grub-assemble/keymap/usdvorak.gkb
index 41301ef..41301ef 100644
--- a/resources/grub/keymap/usdvorak.gkb
+++ b/resources/utilities/grub-assemble/keymap/usdvorak.gkb
Binary files differ
diff --git a/resources/grub/keymap/usqwerty.gkb b/resources/utilities/grub-assemble/keymap/usqwerty.gkb
index 5fb78d3..5fb78d3 100644
--- a/resources/grub/keymap/usqwerty.gkb
+++ b/resources/utilities/grub-assemble/keymap/usqwerty.gkb
Binary files differ
diff --git a/resources/utilities/i945-pwm b/resources/utilities/i945-pwm
new file mode 160000
+Subproject d88c8b290b9473e071d24cd3b97f4a091ee398c
diff --git a/resources/utilities/i945gpu/intel-regs.py b/resources/utilities/i945gpu/intel-regs.py
index f16a8d7..5767d4a 100755
--- a/resources/utilities/i945gpu/intel-regs.py
+++ b/resources/utilities/i945gpu/intel-regs.py
@@ -27,17 +27,31 @@ _MEMORY = re.compile(r"^\s+Memory\s+at\s+([0-9a-f]+)\s+\(32-bit, non-prefetchabl
def get_pci_data():
# lspci has a machine readable format, but it doesn't have the needed data.
- for devid in "8086:27a2", "8086:27a6":
+ for devid in ("8086:27a2",):
lspci = subprocess.Popen(("lspci", "-vn", "-d", devid),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
+ address = None
+ memory = None
for line in lspci.communicate()[0].split("\n"):
+ if line and line[0] == "0":
+ address = line.split()[0]
match = _MEMORY.match(line)
if match is not None:
- yield int(match.group(1), 16)
+ memory = int(match.group(1), 16)
break
+ yield (address, memory)
-func0, func1 = list(get_pci_data())
+
+def config_byte(address, offset):
+ """Return byte at specified offset in PCI config space of device
+ identified by address."""
+ with open("/sys/bus/pci/devices/0000:%s/config" % address, "rb") as f:
+ f.seek(offset)
+ return struct.unpack("=B", f.read(1))
+
+
+addr0, func0 = list(get_pci_data())[0]
def read32(fo, base, offset):
@@ -91,3 +105,4 @@ if __name__ == "__main__":
print "backlight modulation frequency = %f Hz" % mod_freq
print "duty cycle = %d%%" % (100.0 * (backlight & 0xffff)
/ (backlight >> 16))
+ print "legacy backlight brightness = 0x%02x" % config_byte(addr0, 0xf4)