aboutsummaryrefslogtreecommitdiff
path: root/resources
diff options
context:
space:
mode:
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 (renamed from resources/grub/keymap/original/itqwerty)0
-rw-r--r--resources/utilities/grub-assemble/keymap/original/svenska130
-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.gkbbin0 -> 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, 4306 insertions, 1509 deletions
diff --git a/resources/flashrom/patch/flashchips.c b/resources/flashrom/patch/flashchips.c
index bb24bdb1..36609455 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 9a7ec328..b614d7af 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 cdb65f1d..df3c8537 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 624c22d0..05827f3e 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 00000000..09bd20aa
--- /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 00000000..e69de29b
--- /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 00000000..bcad5cbc
--- /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 fbac6876..c9f22ff1 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 5f523846..00000000
--- 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 00000000..ec476fdd
--- /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 00000000..087886ef
--- /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 00000000..e69de29b
--- /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 34ce1983..00000000
--- 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 4fa2e43d..00000000
--- 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 34ce1983..00000000
--- 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 cce7a44b..00000000
--- 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 34ce1983..00000000
--- 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 cce7a44b..00000000
--- 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 00000000..0e7c3b85
--- /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 00000000..2867dea7
--- /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 00000000..28e1b8b8
--- /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 63af0356..2bb0cb7c 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 d5754ffc..395d555a 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 fe56ceba..374a4c23 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 f698057f..46213436 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 00000000..7f20c1f1
--- /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 11010d54..00000000
--- 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 f4173397..00000000
--- 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 00000000..4e36a6c7
--- /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 00000000..eb8936ec
--- /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 d787db54..00000000
--- 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 2d1a396d..00000000
--- 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 00000000..db3218d3
--- /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 00000000..1a187b62
--- /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 00000000..10ac525a
--- /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 0abd8d06..00000000
--- 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 00000000..4ef81379
--- /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 00000000..4098635a
--- /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 00000000..4f2b36ab
--- /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 00000000..98bf3e0b
--- /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 1a47bfa4..1a47bfa4 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 c048cec5..c048cec5 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 f247cd17..f247cd17 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 ad7147af..ad7147af 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 6c53aac3..6c53aac3 100644
--- a/resources/grub/keymap/original/itqwerty
+++ b/resources/utilities/grub-assemble/keymap/original/itqwerty
diff --git a/resources/utilities/grub-assemble/keymap/original/svenska b/resources/utilities/grub-assemble/keymap/original/svenska
new file mode 100644
index 00000000..3ee5bc96
--- /dev/null
+++ b/resources/utilities/grub-assemble/keymap/original/svenska
@@ -0,0 +1,130 @@
+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+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+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+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+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+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
+keycode 34 = +U+0067 +U+0047 +U+014b +U+014a Control_g Control_g Control_g Control_g Meta_g Meta_G Meta_g Meta_G Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g +U+0067 +U+0047 +U+014b +U+014a Control_g Control_g Control_g Control_g Meta_g Meta_G Meta_g Meta_G Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g +U+0067 +U+0047 +U+014b +U+014a Control_g Control_g Control_g Control_g Meta_g Meta_G Meta_g Meta_G Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g +U+0067 +U+0047 +U+014b +U+014a Control_g Control_g Control_g Control_g Meta_g Meta_G Meta_g Meta_G Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g +U+0047 +U+0067 +U+014a +U+014b Control_g Control_g Control_g Control_g Meta_g Meta_G Meta_g Meta_G Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g +U+0047 +U+0067 +U+014a +U+014b Control_g Control_g Control_g Control_g Meta_g Meta_G Meta_g Meta_G Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g +U+0047 +U+0067 +U+014a +U+014b Control_g Control_g Control_g Control_g Meta_g Meta_G Meta_g Meta_G Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g +U+0047 +U+0067 +U+014a +U+014b Control_g Control_g Control_g Control_g Meta_g Meta_G Meta_g Meta_G Meta_Control_g Meta_Control_g Meta_Control_g Meta_Control_g
+keycode 35 = +U+0068 +U+0048 +U+0127 +U+0126 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0068 +U+0048 +U+0127 +U+0126 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0068 +U+0048 +U+0127 +U+0126 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0068 +U+0048 +U+0127 +U+0126 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0126 +U+0127 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0126 +U+0127 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0126 +U+0127 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace +U+0048 +U+0068 +U+0126 +U+0127 BackSpace BackSpace BackSpace BackSpace Meta_h Meta_H Meta_h Meta_H Meta_BackSpace Meta_BackSpace Meta_BackSpace Meta_BackSpace
+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+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+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+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+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_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+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
+keycode 61 = F3 F15 Console_15 Console_27 F27 F39 Console_15 Console_27 Console_3 Console_15 F3 F3 Console_3 Console_15 F3 F3 F3 F15 Console_15 Console_27 F27 F39 Console_15 Console_27 Console_3 Console_15 F3 F3 Console_3 Console_15 F3 F3 F3 F15 Console_15 Console_27 F27 F39 Console_15 Console_27 Console_3 Console_15 F3 F3 Console_3 Console_15 F3 F3 F3 F15 Console_15 Console_27 F27 F39 Console_15 Console_27 Console_3 Console_15 F3 F3 Console_3 Console_15 F3 F3 F3 F15 Console_15 Console_27 F27 F39 Console_15 Console_27 Console_3 Console_15 F3 F3 Console_3 Console_15 F3 F3 F3 F15 Console_15 Console_27 F27 F39 Console_15 Console_27 Console_3 Console_15 F3 F3 Console_3 Console_15 F3 F3 F3 F15 Console_15 Console_27 F27 F39 Console_15 Console_27 Console_3 Console_15 F3 F3 Console_3 Console_15 F3 F3 F3 F15 Console_15 Console_27 F27 F39 Console_15 Console_27 Console_3 Console_15 F3 F3 Console_3 Console_15 F3 F3
+keycode 62 = F4 F16 Console_16 Console_28 F28 F40 Console_16 Console_28 Console_4 Console_16 F4 F4 Console_4 Console_16 F4 F4 F4 F16 Console_16 Console_28 F28 F40 Console_16 Console_28 Console_4 Console_16 F4 F4 Console_4 Console_16 F4 F4 F4 F16 Console_16 Console_28 F28 F40 Console_16 Console_28 Console_4 Console_16 F4 F4 Console_4 Console_16 F4 F4 F4 F16 Console_16 Console_28 F28 F40 Console_16 Console_28 Console_4 Console_16 F4 F4 Console_4 Console_16 F4 F4 F4 F16 Console_16 Console_28 F28 F40 Console_16 Console_28 Console_4 Console_16 F4 F4 Console_4 Console_16 F4 F4 F4 F16 Console_16 Console_28 F28 F40 Console_16 Console_28 Console_4 Console_16 F4 F4 Console_4 Console_16 F4 F4 F4 F16 Console_16 Console_28 F28 F40 Console_16 Console_28 Console_4 Console_16 F4 F4 Console_4 Console_16 F4 F4 F4 F16 Console_16 Console_28 F28 F40 Console_16 Console_28 Console_4 Console_16 F4 F4 Console_4 Console_16 F4 F4
+keycode 63 = F5 F17 Console_17 Console_29 F29 F41 Console_17 Console_29 Console_5 Console_17 F5 F5 Console_5 Console_17 F5 F5 F5 F17 Console_17 Console_29 F29 F41 Console_17 Console_29 Console_5 Console_17 F5 F5 Console_5 Console_17 F5 F5 F5 F17 Console_17 Console_29 F29 F41 Console_17 Console_29 Console_5 Console_17 F5 F5 Console_5 Console_17 F5 F5 F5 F17 Console_17 Console_29 F29 F41 Console_17 Console_29 Console_5 Console_17 F5 F5 Console_5 Console_17 F5 F5 F5 F17 Console_17 Console_29 F29 F41 Console_17 Console_29 Console_5 Console_17 F5 F5 Console_5 Console_17 F5 F5 F5 F17 Console_17 Console_29 F29 F41 Console_17 Console_29 Console_5 Console_17 F5 F5 Console_5 Console_17 F5 F5 F5 F17 Console_17 Console_29 F29 F41 Console_17 Console_29 Console_5 Console_17 F5 F5 Console_5 Console_17 F5 F5 F5 F17 Console_17 Console_29 F29 F41 Console_17 Console_29 Console_5 Console_17 F5 F5 Console_5 Console_17 F5 F5
+keycode 64 = F6 F18 Console_18 Console_30 F30 F42 Console_18 Console_30 Console_6 Console_18 F6 F6 Console_6 Console_18 F6 F6 F6 F18 Console_18 Console_30 F30 F42 Console_18 Console_30 Console_6 Console_18 F6 F6 Console_6 Console_18 F6 F6 F6 F18 Console_18 Console_30 F30 F42 Console_18 Console_30 Console_6 Console_18 F6 F6 Console_6 Console_18 F6 F6 F6 F18 Console_18 Console_30 F30 F42 Console_18 Console_30 Console_6 Console_18 F6 F6 Console_6 Console_18 F6 F6 F6 F18 Console_18 Console_30 F30 F42 Console_18 Console_30 Console_6 Console_18 F6 F6 Console_6 Console_18 F6 F6 F6 F18 Console_18 Console_30 F30 F42 Console_18 Console_30 Console_6 Console_18 F6 F6 Console_6 Console_18 F6 F6 F6 F18 Console_18 Console_30 F30 F42 Console_18 Console_30 Console_6 Console_18 F6 F6 Console_6 Console_18 F6 F6 F6 F18 Console_18 Console_30 F30 F42 Console_18 Console_30 Console_6 Console_18 F6 F6 Console_6 Console_18 F6 F6
+keycode 65 = F7 F19 Console_19 Console_31 F31 F43 Console_19 Console_31 Console_7 Console_19 F7 F7 Console_7 Console_19 F7 F7 F7 F19 Console_19 Console_31 F31 F43 Console_19 Console_31 Console_7 Console_19 F7 F7 Console_7 Console_19 F7 F7 F7 F19 Console_19 Console_31 F31 F43 Console_19 Console_31 Console_7 Console_19 F7 F7 Console_7 Console_19 F7 F7 F7 F19 Console_19 Console_31 F31 F43 Console_19 Console_31 Console_7 Console_19 F7 F7 Console_7 Console_19 F7 F7 F7 F19 Console_19 Console_31 F31 F43 Console_19 Console_31 Console_7 Console_19 F7 F7 Console_7 Console_19 F7 F7 F7 F19 Console_19 Console_31 F31 F43 Console_19 Console_31 Console_7 Console_19 F7 F7 Console_7 Console_19 F7 F7 F7 F19 Console_19 Console_31 F31 F43 Console_19 Console_31 Console_7 Console_19 F7 F7 Console_7 Console_19 F7 F7 F7 F19 Console_19 Console_31 F31 F43 Console_19 Console_31 Console_7 Console_19 F7 F7 Console_7 Console_19 F7 F7
+keycode 66 = F8 F20 Console_20 Console_32 F32 F44 Console_20 Console_32 Console_8 Console_20 F8 F8 Console_8 Console_20 F8 F8 F8 F20 Console_20 Console_32 F32 F44 Console_20 Console_32 Console_8 Console_20 F8 F8 Console_8 Console_20 F8 F8 F8 F20 Console_20 Console_32 F32 F44 Console_20 Console_32 Console_8 Console_20 F8 F8 Console_8 Console_20 F8 F8 F8 F20 Console_20 Console_32 F32 F44 Console_20 Console_32 Console_8 Console_20 F8 F8 Console_8 Console_20 F8 F8 F8 F20 Console_20 Console_32 F32 F44 Console_20 Console_32 Console_8 Console_20 F8 F8 Console_8 Console_20 F8 F8 F8 F20 Console_20 Console_32 F32 F44 Console_20 Console_32 Console_8 Console_20 F8 F8 Console_8 Console_20 F8 F8 F8 F20 Console_20 Console_32 F32 F44 Console_20 Console_32 Console_8 Console_20 F8 F8 Console_8 Console_20 F8 F8 F8 F20 Console_20 Console_32 F32 F44 Console_20 Console_32 Console_8 Console_20 F8 F8 Console_8 Console_20 F8 F8
+keycode 67 = F9 F21 Console_21 Console_33 F33 F45 Console_21 Console_33 Console_9 Console_21 F9 F9 Console_9 Console_21 F9 F9 F9 F21 Console_21 Console_33 F33 F45 Console_21 Console_33 Console_9 Console_21 F9 F9 Console_9 Console_21 F9 F9 F9 F21 Console_21 Console_33 F33 F45 Console_21 Console_33 Console_9 Console_21 F9 F9 Console_9 Console_21 F9 F9 F9 F21 Console_21 Console_33 F33 F45 Console_21 Console_33 Console_9 Console_21 F9 F9 Console_9 Console_21 F9 F9 F9 F21 Console_21 Console_33 F33 F45 Console_21 Console_33 Console_9 Console_21 F9 F9 Console_9 Console_21 F9 F9 F9 F21 Console_21 Console_33 F33 F45 Console_21 Console_33 Console_9 Console_21 F9 F9 Console_9 Console_21 F9 F9 F9 F21 Console_21 Console_33 F33 F45 Console_21 Console_33 Console_9 Console_21 F9 F9 Console_9 Console_21 F9 F9 F9 F21 Console_21 Console_33 F33 F45 Console_21 Console_33 Console_9 Console_21 F9 F9 Console_9 Console_21 F9 F9
+keycode 68 = F10 F22 Console_22 Console_34 F34 F46 Console_22 Console_34 Console_10 Console_22 F10 F10 Console_10 Console_22 F10 F10 F10 F22 Console_22 Console_34 F34 F46 Console_22 Console_34 Console_10 Console_22 F10 F10 Console_10 Console_22 F10 F10 F10 F22 Console_22 Console_34 F34 F46 Console_22 Console_34 Console_10 Console_22 F10 F10 Console_10 Console_22 F10 F10 F10 F22 Console_22 Console_34 F34 F46 Console_22 Console_34 Console_10 Console_22 F10 F10 Console_10 Console_22 F10 F10 F10 F22 Console_22 Console_34 F34 F46 Console_22 Console_34 Console_10 Console_22 F10 F10 Console_10 Console_22 F10 F10 F10 F22 Console_22 Console_34 F34 F46 Console_22 Console_34 Console_10 Console_22 F10 F10 Console_10 Console_22 F10 F10 F10 F22 Console_22 Console_34 F34 F46 Console_22 Console_34 Console_10 Console_22 F10 F10 Console_10 Console_22 F10 F10 F10 F22 Console_22 Console_34 F34 F46 Console_22 Console_34 Console_10 Console_22 F10 F10 Console_10 Console_22 F10 F10
+keycode 69 = Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Hex_A Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock Num_Lock
+keycode 70 = Scroll_Lock Show_Memory Show_Registers Scroll_Lock Show_State Scroll_Lock Scroll_Lock Scroll_Lock Show_Registers Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Show_Memory Show_Registers Scroll_Lock Show_State Scroll_Lock Scroll_Lock Scroll_Lock Show_Registers Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Show_Memory Show_Registers Scroll_Lock Show_State Scroll_Lock Scroll_Lock Scroll_Lock Show_Registers Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Show_Memory Show_Registers Scroll_Lock Show_State Scroll_Lock Scroll_Lock Scroll_Lock Show_Registers Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Show_Memory Show_Registers Scroll_Lock Show_State Scroll_Lock Scroll_Lock Scroll_Lock Show_Registers Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Show_Memory Show_Registers Scroll_Lock Show_State Scroll_Lock Scroll_Lock Scroll_Lock Show_Registers Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Show_Memory Show_Registers Scroll_Lock Show_State Scroll_Lock Scroll_Lock Scroll_Lock Show_Registers Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Show_Memory Show_Registers Scroll_Lock Show_State Scroll_Lock Scroll_Lock Scroll_Lock Show_Registers Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock Scroll_Lock
+keycode 71 = KP_7 KP_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 Ascii_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 Ascii_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 Ascii_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 Ascii_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 Ascii_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 Ascii_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 Ascii_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 Ascii_7 Hex_7 KP_7 KP_7 KP_7 KP_7 KP_7 KP_7
+keycode 72 = KP_8 KP_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 Ascii_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 Ascii_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 Ascii_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 Ascii_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 Ascii_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 Ascii_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 Ascii_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 Ascii_8 Hex_8 KP_8 KP_8 KP_8 KP_8 KP_8 KP_8
+keycode 73 = KP_9 KP_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 Ascii_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 Ascii_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 Ascii_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 Ascii_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 Ascii_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 Ascii_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 Ascii_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 Ascii_9 Hex_9 KP_9 KP_9 KP_9 KP_9 KP_9 KP_9
+keycode 74 = KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract Hex_D KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract
+keycode 75 = KP_4 KP_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 Ascii_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 Ascii_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 Ascii_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 Ascii_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 Ascii_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 Ascii_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 Ascii_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 Ascii_4 Hex_4 KP_4 KP_4 KP_4 KP_4 KP_4 KP_4
+keycode 76 = KP_5 KP_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 Ascii_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 Ascii_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 Ascii_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 Ascii_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 Ascii_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 Ascii_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 Ascii_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 Ascii_5 Hex_5 KP_5 KP_5 KP_5 KP_5 KP_5 KP_5
+keycode 77 = KP_6 KP_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 Ascii_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 Ascii_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 Ascii_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 Ascii_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 Ascii_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 Ascii_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 Ascii_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 Ascii_6 Hex_6 KP_6 KP_6 KP_6 KP_6 KP_6 KP_6
+keycode 78 = KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add Hex_E KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add
+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_1 KP_1 KP_1 KP_1 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_1 KP_1 KP_1 KP_1 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_1 KP_1 KP_1 KP_1 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_1 KP_1 KP_1 KP_1 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_1 KP_1 KP_1 KP_1 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_1 KP_1 KP_1 KP_1 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_1 KP_1 KP_1 KP_1 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_1 KP_1 KP_1 KP_1
+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_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
+keycode 103 = Up Up Up Up Up Up Up Up KeyboardSignal Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up KeyboardSignal Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up KeyboardSignal Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up KeyboardSignal Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up KeyboardSignal Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up KeyboardSignal Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up KeyboardSignal Up Up Up Up Up Up Up Up Up Up Up Up Up Up Up KeyboardSignal Up Up Up Up Up Up Up
+keycode 104 = Prior Scroll_Backward Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Scroll_Backward Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Scroll_Backward Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Scroll_Backward Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Scroll_Backward Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Scroll_Backward Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Scroll_Backward Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Scroll_Backward Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior Prior
+keycode 105 = Left Left Left Left Left Left Left Left Decr_Console Left Left Left Left Left Left Left Left Left Left Left Left Left Left Left Decr_Console Left Left Left Left Left Left Left Left Left Left Left Left Left Left Left Decr_Console Left Left Left Left Left Left Left Left Left Left Left Left Left Left Left Decr_Console Left Left Left Left Left Left Left Left Left Left Left Left Left Left Left Decr_Console Left Left Left Left Left Left Left Left Left Left Left Left Left Left Left Decr_Console Left Left Left Left Left Left Left Left Left Left Left Left Left Left Left Decr_Console Left Left Left Left Left Left Left Left Left Left Left Left Left Left Left Decr_Console Left Left Left Left Left Left Left
+keycode 106 = Right Right Right Right Right Right Right Right Incr_Console Right Right Right Right Right Right Right Right Right Right Right Right Right Right Right Incr_Console Right Right Right Right Right Right Right Right Right Right Right Right Right Right Right Incr_Console Right Right Right Right Right Right Right Right Right Right Right Right Right Right Right Incr_Console Right Right Right Right Right Right Right Right Right Right Right Right Right Right Right Incr_Console Right Right Right Right Right Right Right Right Right Right Right Right Right Right Right Incr_Console Right Right Right Right Right Right Right Right Right Right Right Right Right Right Right Incr_Console Right Right Right Right Right Right Right Right Right Right Right Right Right Right Right Incr_Console Right Right Right Right Right Right Right
+keycode 107 = End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End End
+keycode 108 = Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down Down
+keycode 109 = Next Scroll_Forward Next Next Next Next Next Next Next Next Next Next Next Next Next Next Next Scroll_Forward Next Next Next Next Next Next Next Next Next Next Next Next Next Next Next Scroll_Forward Next Next Next Next Next Next Next Next Next Next Next Next Next Next Next Scroll_Forward Next Next Next Next Next Next Next Next Next Next Next Next Next Next Next Scroll_Forward Next Next Next Next Next Next Next Next Next Next Next Next Next Next Next Scroll_Forward Next Next Next Next Next Next Next Next Next Next Next Next Next Next Next Scroll_Forward Next Next Next Next Next Next Next Next Next Next Next Next Next Next Next Scroll_Forward Next Next Next Next Next Next Next Next Next Next Next Next Next Next
+keycode 110 = Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert Insert
+keycode 111 = Remove Remove Remove Remove Remove Remove Boot Remove Remove Remove Remove Remove Boot Remove Boot Remove Remove Remove Remove Remove Remove Remove Boot Remove Remove Remove Remove Remove Boot Remove Boot Remove Remove Remove Remove Remove Remove Remove Boot Remove Remove Remove Remove Remove Boot Remove Boot Remove Remove Remove Remove Remove Remove Remove Boot Remove Remove Remove Remove Remove Boot Remove Boot Remove Remove Remove Remove Remove Remove Remove Boot Remove Remove Remove Remove Remove Boot Remove Boot Remove Remove Remove Remove Remove Remove Remove Boot Remove Remove Remove Remove Remove Boot Remove Boot Remove Remove Remove Remove Remove Remove Remove Boot Remove Remove Remove Remove Remove Boot Remove Boot Remove Remove Remove Remove Remove Remove Remove Boot Remove Remove Remove Remove Remove Boot Remove Boot Remove
+keycode 96 = KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter Hex_F KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter KP_Enter
+keycode 97 = 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 119 = Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause Pause
+keycode 99 = VoidSymbol VoidSymbol Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash VoidSymbol VoidSymbol Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash VoidSymbol VoidSymbol Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash VoidSymbol VoidSymbol Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash VoidSymbol VoidSymbol Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash VoidSymbol VoidSymbol Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash VoidSymbol VoidSymbol Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash VoidSymbol VoidSymbol Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash Control_backslash
+keycode 98 = KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide Hex_B KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide
+keycode 100 = AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr AltGr
+keycode 125 = 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 126 = 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 121 = KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period KP_Period
+strings as usual
+# The content of this file will be appended to the keyboard layout.
+# For example if you uncomment the following lines Alt+j can be used
+# to go to the next console and Alt+k can be used to go to the
+# previous console:
+
+# alt keycode 36 = Incr_Console
+# shiftl alt keycode 36 = Incr_Console
+# shiftr alt keycode 36 = Incr_Console
+# shiftr shiftl alt keycode 36 = Incr_Console
+# ctrll alt keycode 36 = Incr_Console
+# ctrll shiftl alt keycode 36 = Incr_Console
+# ctrll shiftr alt keycode 36 = Incr_Console
+# ctrll shiftr shiftl alt keycode 36 = Incr_Console
+
+# alt keycode 37 = Decr_Console
+# shiftl alt keycode 37 = Decr_Console
+# shiftr alt keycode 37 = Decr_Console
+# shiftr shiftl alt keycode 37 = Decr_Console
+# ctrll alt keycode 37 = Decr_Console
+# ctrll shiftl alt keycode 37 = Decr_Console
+# ctrll shiftr alt keycode 37 = Decr_Console
+# ctrll shiftr shiftl alt keycode 37 = Decr_Console
+
diff --git a/resources/grub/keymap/original/ukdvorak b/resources/utilities/grub-assemble/keymap/original/ukdvorak
index d41b8735..d41b8735 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 94e5a456..94e5a456 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 b99b6a06..b99b6a06 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 51103234..51103234 100644
--- a/resources/grub/keymap/original/usqwerty
+++ b/resources/utilities/grub-assemble/keymap/original/usqwerty
diff --git a/resources/utilities/grub-assemble/keymap/svenska.gkb b/resources/utilities/grub-assemble/keymap/svenska.gkb
new file mode 100644
index 00000000..ec627db2
--- /dev/null
+++ 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 c793cae8..c793cae8 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 8e5ff299..8e5ff299 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 41301efd..41301efd 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 5fb78d33..5fb78d33 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 f16a8d75..5767d4a5 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)