mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH] ARM i.MX6SL: Add Kindle generation 6/7 support
@ 2025-11-09 18:03 Alexander Kurz
  2025-11-10  8:54 ` Sascha Hauer
  0 siblings, 1 reply; 2+ messages in thread
From: Alexander Kurz @ 2025-11-09 18:03 UTC (permalink / raw)
  To: Sascha Hauer, barebox; +Cc: Alexander Kurz

Four Amazon Kindle 6th and 7th generation e-book readers were considered
for this patch, referred by their models
* DP75SDI "PINOT_WFO" (256MB) "Kindle Paperwhite 2" 6th gen
* DP75SDI "Muscat WFO" (512MB) "Kindle Paperwhite 3" 7th gen
* WP63GW "Kindle" 7th gen (512MB)
* NM460GZ "Voyage" 7th gen (512MB)
Kindle e-book readers from generation 6 and 7 use the i.MX6SL and an
are shipped with a factory-adapted u-boot image. Vendor software image
updates for these models stopped around 2021 to 2023.

Add experimental support for the kindle gen 6/7 models and make barebox
an optional drop-in replacement for the original bootloader.
Required PMIC settings are implemented as script.

Notable features tested on all models:
- Support for eMMC, USB, UART, I2C and SPI.
- LPDDR2 setup is done via DCD, the same imximage may be used
  for USB-startup and for installation.
- Support for vendor specific ATAGs that are required by the Kindle-System.
- usbserial barebox console access for 10 seconds after startup.

Known issues:
- Reset on models kindle6-dp75sdi and nm460gz does not work and triggers
  microcode USB download boot.
- No recovery (without soldering) like USB boot known after e.g. a failed
  flashing attempt.

Signed-off-by: Alexander Kurz <akurz@blala.de>
---
 .../boards/imx/amazon-kindle-6-7.rst          |  94 ++++++++
 arch/arm/boards/Makefile                      |   1 +
 arch/arm/boards/kindle-mx6sl/Makefile         |   5 +
 arch/arm/boards/kindle-mx6sl/board.c          | 213 ++++++++++++++++++
 .../defaultenv-kindle-mx6sl/boot/mmc_kernel   |  11 +
 .../defaultenv-kindle-mx6sl/init/pmic         |  32 +++
 .../defaultenv-kindle-mx6sl/init/usbserial    |   4 +
 .../nv/autoboot_timeout                       |   1 +
 .../defaultenv-kindle-mx6sl/nv/boot.default   |   1 +
 .../nv/linux.bootargs.base                    |   1 +
 .../nv/linux.bootargs.console                 |   1 +
 .../nv/linux.bootargs.video                   |   1 +
 .../flash-header-kindle-mx6sl-256m.imxcfg     | 126 +++++++++++
 .../flash-header-kindle-mx6sl-512m.imxcfg     | 126 +++++++++++
 arch/arm/boards/kindle-mx6sl/lowlevel.c       |  85 +++++++
 arch/arm/configs/kindle-gen-6-7_defconfig     |  89 ++++++++
 arch/arm/dts/Makefile                         |   4 +
 arch/arm/dts/imx6sl-kindle-common.dtsi        | 167 ++++++++++++++
 arch/arm/dts/imx6sl-kindle-nm460gz.dts        |  69 ++++++
 arch/arm/dts/imx6sl-kindle-wp63gw.dts         |  44 ++++
 arch/arm/dts/imx6sl-kindle6-dp75sdi.dts       |  55 +++++
 arch/arm/dts/imx6sl-kindle7-dp75sdi.dts       |  55 +++++
 arch/arm/mach-imx/Kconfig                     |  17 ++
 images/Makefile.imx                           |  21 ++
 24 files changed, 1223 insertions(+)
 create mode 100644 Documentation/boards/imx/amazon-kindle-6-7.rst
 create mode 100644 arch/arm/boards/kindle-mx6sl/Makefile
 create mode 100644 arch/arm/boards/kindle-mx6sl/board.c
 create mode 100644 arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/boot/mmc_kernel
 create mode 100644 arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/init/pmic
 create mode 100644 arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/init/usbserial
 create mode 100644 arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/autoboot_timeout
 create mode 100644 arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/boot.default
 create mode 100644 arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.base
 create mode 100644 arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.console
 create mode 100644 arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.video
 create mode 100644 arch/arm/boards/kindle-mx6sl/flash-header-kindle-mx6sl-256m.imxcfg
 create mode 100644 arch/arm/boards/kindle-mx6sl/flash-header-kindle-mx6sl-512m.imxcfg
 create mode 100644 arch/arm/boards/kindle-mx6sl/lowlevel.c
 create mode 100644 arch/arm/configs/kindle-gen-6-7_defconfig
 create mode 100644 arch/arm/dts/imx6sl-kindle-common.dtsi
 create mode 100644 arch/arm/dts/imx6sl-kindle-nm460gz.dts
 create mode 100644 arch/arm/dts/imx6sl-kindle-wp63gw.dts
 create mode 100644 arch/arm/dts/imx6sl-kindle6-dp75sdi.dts
 create mode 100644 arch/arm/dts/imx6sl-kindle7-dp75sdi.dts

diff --git a/Documentation/boards/imx/amazon-kindle-6-7.rst b/Documentation/boards/imx/amazon-kindle-6-7.rst
new file mode 100644
index 0000000000..c7a5ef9424
--- /dev/null
+++ b/Documentation/boards/imx/amazon-kindle-6-7.rst
@@ -0,0 +1,94 @@
+Amazon Kindle 6/7 (Paperwhite 2/3, Kindle 7th gen and Voyage)
+=============================================================
+
+Four models of the Amazon Kindle e-Book readers are considered as members
+of the 6th and 7th generation:
+
+* DP75SDI "PINOT_WFO" (256MB) "Kindle Paperwhite 2" 6th gen
+* DP75SDI "Muscat WFO" (512MB) "Kindle Paperwhite 3" 7th gen
+* WP63GW (512MB) "Kindle" 7th gen
+* NM460GZ (512MB) "Voyage" 7th gen
+
+Those e-book readers share a common set of hardware:
+
+* Freescale i.MX6SL SOC
+* 256MB or 512MB of LPDDR2
+* eMMC storage
+* MAX77696A PMIC
+
+The devices boot up in internal boot mode from eMMC boot partition 1
+and are shipped with a vendor modified u-boot imximage based on u-boot
+v2009.08.
+
+According to the availability of source code tarballs on the amazon website
+"Source Code Notice for Kindle E-Readers and Fire Tablets", availability of
+factory image updates seem to have been terminated between 2021 and 2023.
+
+This device is battery-powered and there is no way to switch the device off.
+When the device is inactive, the Kindle software will first reduce the
+power consumption to a few milliamps of battery power, after some minutes
+the power consumption is further reduced to sub-milliamp level. Keeping
+iomux pullups switched on at standby may significantly drain your battery.
+
+Building barebox
+----------------
+
+``make kindle-gen-6-7_defconfig`` should get you a working config.
+
+Uploading barebox
+-----------------
+
+Similar to the 4/5 gen devices, console access to gen 6/7 kindles is
+available via the Micro-USB connector when a 30k Ohm resistor to GND
+is used on the sense pin: D- will become TXD, D+ RXD.
+
+From the uboot shell, the barebox image may be chainloaded e.g. like
+
+   .. code-block:: console
+
+        $ bist
+        $ loady 0x80000000
+        $ go 0x80001000
+
+Booting the devices from USB is more demanding and will likely require
+opening of the device and desoldering of a metal shield.
+All devices feature just a single power button which may be used to reset
+the device. Unlike the models of the 4th generation where a separate
+button is available to boot from USB, such buttons do not exist here.
+Button pads on the PCB are not populated and USB boot mode by
+pin-strapping seems to be disabled by fuse settings. To put the device
+into USB boot mode, the eMMC may be disabled temporarily.
+
+1. Connect the Kindle to your host computer with a USB cable.
+2. Disable the eMMC
+   * for the DP75SDI pull the left resistor left of TP806/TP807 (below
+     TP914) facing the eMMC to zero.
+2. Power down the device by holding the power button until the power LED goes
+   dark (about 12-15 seconds).
+3. Release the power button.
+4. Free the eMMC pin.
+5. After 10-20 seconds, a new USB device named ``SE Blank MEGREZ`` should
+   appear on your host computer.
+6. Use imx-usb-loader to boot from USB.
+
+   .. code-block:: console
+
+        $ scripts/imx/imx-usb-loader images/barebox-kindle6-dp75sdi.img
+
+A USB serial ACM console will be launched by a barebox init script
+for 10 seconds after boot.
+
+Installing barebox
+------------------
+
+Barebox may be used as drop-in replacement for the shipped bootloader, when
+the imximg fits into 384000 bytes, compression like IMAGE_COMPRESSION_XZKERN
+might be required for this. When installing the barebox imximg on
+the eMMC, take care not to overwrite the vendor supplied serial numbers and
+other data stored on the eMMC. All 6th and 7th gen devices seem to share the
+same disk layout. E.g. just write the imx-header and the application section:
+
+.. code-block:: console
+
+        $ loady -t usbserial
+        $ memcpy -s barebox-kindle6-dp75sdi.img -d /dev/mmc1.boot0 0x400 0x400 0x5dc00
diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile
index f73285ede9..cc32dff2a5 100644
--- a/arch/arm/boards/Makefile
+++ b/arch/arm/boards/Makefile
@@ -141,6 +141,7 @@ obj-$(CONFIG_MACH_TNY_A9260)			+= tny-a926x/
 obj-$(CONFIG_MACH_TNY_A9263)			+= tny-a926x/
 obj-$(CONFIG_MACH_TNY_A9G20)			+= tny-a926x/
 obj-$(CONFIG_MACH_KINDLE_MX50)			+= kindle-mx50/
+obj-$(CONFIG_MACH_KINDLE_6_7)			+= kindle-mx6sl/
 obj-$(CONFIG_MACH_TORADEX_COLIBRI_T20)		+= toradex-colibri-t20/
 obj-$(CONFIG_MACH_TOSHIBA_AC100)		+= toshiba-ac100/
 obj-$(CONFIG_MACH_TQMA53)			+= tqma53/
diff --git a/arch/arm/boards/kindle-mx6sl/Makefile b/arch/arm/boards/kindle-mx6sl/Makefile
new file mode 100644
index 0000000000..bb9aca5b96
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+obj-y += board.o
+lwl-y += lowlevel.o
+bbenv-y += defaultenv-kindle-mx6sl
diff --git a/arch/arm/boards/kindle-mx6sl/board.c b/arch/arm/boards/kindle-mx6sl/board.c
new file mode 100644
index 0000000000..38577a3006
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/board.c
@@ -0,0 +1,213 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+// SPDX-FileCopyrightText: 2025 Alexander Kurz <akurz@blala.de>
+
+#include <common.h>
+#include <envfs.h>
+#include <environment.h>
+#include <init.h>
+#include <io.h>
+#include <param.h>
+#include <magicvar.h>
+#include <libfile.h>
+#include <globalvar.h>
+#include <asm/armlinux.h>
+#include <asm/io.h>
+#include <linux/sizes.h>
+#include <mach/imx/generic.h>
+#include <mach/imx/imx6-regs.h>
+#include <mach/imx/imx6.h>
+#include <asm/mach-types.h>
+
+/* 16 byte id for serial number */
+#define ATAG_SERIAL16   0x5441000a
+/* 16 byte id for a board revision */
+#define ATAG_REVISION16 0x5441000b
+/* mac address / secret */
+#define ATAG_MACADDR    0x5441000d
+/* 2x 16 byte /proc/bootmode */
+#define ATAG_BOOTMODE   0x5441000f
+
+struct tag_char16 {
+	char data[16];
+};
+
+struct tag_macaddr {
+	char address[12];
+	char secret[20];
+};
+
+struct tag_bootmode {
+	char boot[16];
+	char post[16];
+};
+
+static struct tag *setup_16char_tag(struct tag *params, uint32_t tag,
+					const char *value)
+{
+	struct tag_char16 *target;
+
+	target = ((void *) params) + sizeof(struct tag_header);
+	params->hdr.tag = tag;
+	params->hdr.size = tag_size(tag_char16);
+	memset(target->data, 0, sizeof(target->data));
+	/* don't care for missing null terminators */
+	strncpy(target->data, value, sizeof(target->data));
+	return tag_next(params);
+}
+
+static struct tag *setup_macaddr_tag(struct tag *params, uint32_t tag,
+				    const char *addr, const char *secret)
+{
+	struct tag_macaddr *target;
+
+	target = ((void *) params) + sizeof(struct tag_header);
+	params->hdr.tag = tag;
+	params->hdr.size = tag_size(tag_macaddr);
+	memset(target->address, 0, sizeof(target->address));
+	memset(target->secret, 0, sizeof(target->secret));
+	strncpy(target->address, addr, sizeof(target->address));
+	strncpy(target->secret, secret, sizeof(target->secret));
+	return tag_next(params);
+}
+
+static struct tag *setup_bootmode_tag(struct tag *params, uint32_t tag,
+				    const char *bootmode, const char *postmode)
+{
+	struct tag_bootmode *target;
+
+	target = ((void *) params) + sizeof(struct tag_header);
+	params->hdr.tag = tag;
+	params->hdr.size = tag_size(tag_macaddr);
+	memset(target->boot, 0, sizeof(target->boot));
+	memset(target->post, 0, sizeof(target->post));
+	strncpy(target->boot, bootmode, sizeof(target->boot));
+	strncpy(target->post, postmode, sizeof(target->post));
+	return tag_next(params);
+}
+
+
+static const char *get_env_char_tag(const char *tag, const char *defaultval)
+{
+	const char *value;
+
+	value = getenv(tag);
+	if (!value) {
+		printf("env var %s not found, using default\n", tag);
+		return defaultval;
+	}
+	return value;
+}
+
+BAREBOX_MAGICVAR(global.board.serial16,
+	"The device serial in ATAG_SERIAL16, visible in /proc/cpuinfo");
+BAREBOX_MAGICVAR(global.board.revision16,
+	"The boardid in ATAG_REVISION16 to fill /proc/boardid");
+BAREBOX_MAGICVAR(global.board.mac,
+	"The wifi MAC in ATAG_MACADDR visible as /proc/mac_addr");
+BAREBOX_MAGICVAR(global.board.sec,
+	"The sec code in ATAG_MACADDR visible as /proc/mac_sec");
+BAREBOX_MAGICVAR(global.board.bootmode,
+	"The bootmode in ATAG_BOOTMODE to fill /proc/bootmode");
+BAREBOX_MAGICVAR(global.board.postmode,
+	"The postmode in ATAG_BOOTMODE to fill /proc/postmode");
+
+static struct envdata {
+	size_t offset;
+	size_t size;
+	const char *env_name;
+	char *data;
+} kindle_mx6sl_boardinfo[] = {
+	{ 0x0,  16, "board.serial16" },
+	{ 0x60, 16, "board.revision16" },
+	{ 0x30, 16, "board.mac" },
+	{ 0x40, 20, "board.sec" },
+	{ 0x1000, 16, "board.bootmode" },
+	{ 0x1010, 16, "board.postmode" },
+};
+
+/* The Kernels several custom ATAGs */
+static struct tag *kindle_mx6sl_append_atags(struct tag *params)
+{
+	params = setup_16char_tag(params, ATAG_SERIAL16,
+			get_env_char_tag("global.board.serial16",
+				"0000000000000000"));
+	params = setup_16char_tag(params, ATAG_REVISION16,
+			get_env_char_tag("global.board.revision16",
+				"0000000000000000"));
+	params = setup_macaddr_tag(params, ATAG_MACADDR,
+			get_env_char_tag("global.board.mac",
+				"000000000000"),
+			get_env_char_tag("global.board.sec",
+				"00000000000000000000"));
+	params = setup_bootmode_tag(params, ATAG_BOOTMODE,
+			get_env_char_tag("global.board.bootmode", ""),
+			get_env_char_tag("global.board.postmode", ""));
+	return params;
+}
+
+
+static void kindle_rev_init(const char *part, struct envdata *env, size_t num)
+{
+	void *buf;
+	int ret;
+
+	ret = read_file_2(part, NULL, &buf, 0x1060);
+	if (ret && ret != -EFBIG) {
+		pr_err("Could not read board info from %s\n", part);
+		return;
+	}
+	for (int i = 0; i < num; i++) {
+		size_t offset = env[i].offset;
+		size_t size = env[i].size;
+		const char *name = env[i].env_name;
+
+		env[i].data = xzalloc(size + 1);
+		env[i].data[size] = 0;
+		memcpy(env[i].data, buf + offset, size);
+		globalvar_add_simple_string(name, &env[i].data);
+	}
+
+	free(buf);
+}
+
+static int is_mx6sl_kindle(void)
+{
+	return of_machine_is_compatible("amazon,imx6sl-kindle6-dp75sdi") ||
+		of_machine_is_compatible("amazon,imx6sl-kindle7-dp75sdi") ||
+		of_machine_is_compatible("amazon,imx6sl-kindle-wp63gw") ||
+		of_machine_is_compatible("amazon,imx6sl-kindle-nm460gz");
+}
+
+static int kindle_mx6sl_late_init(void)
+{
+	if (!is_mx6sl_kindle())
+		return 0;
+
+	/* Compatibility ATAGs for original kernel */
+	armlinux_set_atag_appender(kindle_mx6sl_append_atags);
+
+	kindle_rev_init("/dev/mmc1.boot0.userdata", kindle_mx6sl_boardinfo,
+		ARRAY_SIZE(kindle_mx6sl_boardinfo));
+
+	return 0;
+}
+late_initcall(kindle_mx6sl_late_init);
+
+static int kindle6_device_init(void)
+{
+	struct device *dev;
+
+	if (!is_mx6sl_kindle())
+		return 0;
+
+	/* Probe the eMMC to allow reading the board serial and revision */
+	dev = get_device_by_name("mmc1");
+	if (dev)
+		dev_set_param(dev, "probe", "1");
+
+	defaultenv_append_directory(defaultenv_kindle_mx6sl);
+
+	return 0;
+}
+
+device_initcall(kindle6_device_init);
diff --git a/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/boot/mmc_kernel b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/boot/mmc_kernel
new file mode 100644
index 0000000000..518110b8fd
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/boot/mmc_kernel
@@ -0,0 +1,11 @@
+#!/bin/sh
+# Boot the Amazon factory-shipped kernel uimage stored on
+# the eMMC at CONFIG_MMC_BOOTFLASH_ADDR 0x41000
+
+# Force ATAG boot
+global.bootm.boot_atag=true
+
+global linux.bootargs.dyn.log="log_pos_goal=0x8fff0000"
+global linux.bootargs.dyn.root="rootwait root=/dev/mmcblk0p1 ro"
+
+bootm -c /dev/mmc1.kernel
diff --git a/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/init/pmic b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/init/pmic
new file mode 100644
index 0000000000..efa02843e6
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/init/pmic
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+# MAX77696 PMIC setup.
+#
+# Common settings for gen 6/7 kindles
+# LDO_L07_CNFG1_REG
+i2c_write -b 0 -a 0x3c -r 0x4f 0x70
+# LDO_L10_CNFG1_REG
+i2c_write -b 0 -a 0x3c -r 0x55 0xf4
+
+i2c_write -b 0 -a 0x3c -r 0x2 0x36
+# BUCK_VOUT1_REG
+i2c_write -b 0 -a 0x3c -r 0x31 0x34
+# BUCK_VOUTCNFG1_REG
+i2c_write -b 0 -a 0x3c -r 0x39 0xd0
+# BUCK_VOUTCNFG2_REG
+i2c_write -b 0 -a 0x3c -r 0x3a 0xd0
+# BUCK_VOUTCNFG3_REG
+i2c_write -b 0 -a 0x3c -r 0x3b 0x40
+# BUCK_VOUTCNFG6_REG
+i2c_write -b 0 -a 0x3c -r 0x3e 0x70
+i2c_write -b 0 -a 0x3c -r 0x5e 0x04
+# VREG_EPDCNFG_REG
+i2c_write -b 0 -a 0x3c -r 0x60 0x00
+# VREG_EPDSEQ_REG / VDDQ_SET_REG
+i2c_write -b 0 -a 0x3c -r 0x69 0x18
+
+if [ "$global.model" = "kindle6-dp75sdi" -o "$global.model" = "kindle7-dp75sdi" ]; then
+	# Backlight not available on WP63GW.
+	i2c_write -b 0 -a 0x3c -r 0x6c 0x80
+	i2c_write -b 0 -a 0x3c -r 0x6d 0x20
+fi
diff --git a/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/init/usbserial b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/init/usbserial
new file mode 100644
index 0000000000..c181c06da9
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/init/usbserial
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+usbserial
+global.autoboot_timeout=10
diff --git a/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/autoboot_timeout b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/autoboot_timeout
new file mode 100644
index 0000000000..64bb6b746d
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/autoboot_timeout
@@ -0,0 +1 @@
+30
diff --git a/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/boot.default b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/boot.default
new file mode 100644
index 0000000000..3118b7af45
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/boot.default
@@ -0,0 +1 @@
+mmc_kernel
diff --git a/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.base b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.base
new file mode 100644
index 0000000000..64d790aa7f
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.base
@@ -0,0 +1 @@
+ip=off
diff --git a/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.console b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.console
new file mode 100644
index 0000000000..d775310b40
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.console
@@ -0,0 +1 @@
+console=ttymxc0,115200
diff --git a/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.video b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.video
new file mode 100644
index 0000000000..9b4e01473b
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/defaultenv-kindle-mx6sl/nv/linux.bootargs.video
@@ -0,0 +1 @@
+video=mxcepdcfb:E60,bpp=8,x_mem=3M
diff --git a/arch/arm/boards/kindle-mx6sl/flash-header-kindle-mx6sl-256m.imxcfg b/arch/arm/boards/kindle-mx6sl/flash-header-kindle-mx6sl-256m.imxcfg
new file mode 100644
index 0000000000..6b1b53cf16
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/flash-header-kindle-mx6sl-256m.imxcfg
@@ -0,0 +1,126 @@
+# SPDX-License-Identifier: GPL-2.0-only
+# SPDX-FileCopyrightText: 2025 Alexander Kurz <akurz@blala.de>
+# SPDX-FileCopyrightText: 2012 Freescale Semiconductor, Inc.
+
+# DCD i.MX6sl SoC setup using 256MiB LPDDR2
+#
+# Initial DCD setup according to
+# Kindle_src_5.10.2_3374520058.tar.gz / uboot_2009.08.tar.gz
+# board/imx60_wario/flash_header.S
+
+loadaddr 0x80000000
+soc imx6
+ivtofs 0x400
+# CCM
+wm 32 0x020c4018 0x00260324
+
+# CCM CGR
+wm 32 0x020c4068 0xffffffff
+wm 32 0x020c406c 0xffffffff
+wm 32 0x020c4070 0xffffffff
+wm 32 0x020c4074 0xffffffff
+wm 32 0x020c4078 0xffffffff
+wm 32 0x020c407c 0xffffffff
+wm 32 0x020c4080 0xffffffff
+wm 32 0x020c4084 0xffffffff
+
+# IOMUX
+wm 32 0x020e0344 0x00003038
+wm 32 0x020e0348 0x00003038
+wm 32 0x020e034c 0x00003038
+wm 32 0x020e0350 0x00003038
+
+wm 32 0x020e030c 0x00000020
+wm 32 0x020e0310 0x00000020
+wm 32 0x020e0314 0x00000020
+wm 32 0x020e0318 0x00000020
+
+wm 32 0x020e0300 0x00000020
+wm 32 0x020e031c 0x00000020
+wm 32 0x020e0338 0x00000020
+wm 32 0x020e0320 0x00080020
+wm 32 0x020e032c 0x00080000
+
+wm 32 0x020e0330 0x00000020
+wm 32 0x020e0334 0x00000020
+wm 32 0x020e033c 0x00000008
+wm 32 0x020e0340 0x00000008
+wm 32 0x020e0344 0x00003020
+wm 32 0x020e0348 0x00003020
+wm 32 0x020e034c 0x00003020
+wm 32 0x020e0350 0x00003020
+
+wm 32 0x020e032c 0x00000000
+wm 32 0x020e05c4 0x00000020
+wm 32 0x020e05cc 0x00000020
+wm 32 0x020e05d0 0x00080000
+wm 32 0x020e05d4 0x00000020
+wm 32 0x020e05d8 0x00000020
+wm 32 0x020e05ac 0x00000020
+wm 32 0x020e05c8 0x00000020
+wm 32 0x020e05b0 0x00020000
+wm 32 0x020e05b4 0x00000000
+wm 32 0x020e05c0 0x00020000
+wm 32 0x020e05bc 0x00001000
+
+# MMDC
+# MMDC0_MDSCR, set the Configuration request bit during MMDC set up
+wm 32 0x021b001c 0x00008000
+# LPDDR2 ZQ params
+wm 32 0x021b085c 0x1b4700c7
+# DDR_PHY_P0_MPZQHWCTRL
+wm 32 0x021b0800 0xa1390003
+wm 32 0x021b0890 0x00400000
+# frc_msr
+wm 32 0x021b08b8 0x00000800
+# DDR_PHY_P0_MPREDQBY0DL3 - DDR_PHY_P0_MPREDQBY3DL3
+wm 32 0x021b081c 0x33333333
+wm 32 0x021b0820 0x33333333
+wm 32 0x021b0824 0x33333333
+wm 32 0x021b0828 0x33333333
+wm 32 0x021b082c 0xf3333333
+wm 32 0x021b0830 0xf3333333
+wm 32 0x021b0834 0xf3333333
+wm 32 0x021b0838 0xf3333333
+# read calibration
+wm 32 0x021b0848 0x4241444a
+# write calibration
+wm 32 0x021b0850 0x3030312b
+# dqs gating dis
+wm 32 0x021b083c 0x20000000
+wm 32 0x021b0840 0x0
+# fine tune duty cyc to low
+wm 32 0x021b08c0 0x24911492
+# frc_msr
+wm 32 0x021b08b8 0x00000800
+# MMDC0_MDCFG0, MDPDC, MDCFG1, MDCFG2
+wm 32 0x021b000c 0x33374133
+wm 32 0x021b0004 0x00020024
+wm 32 0x021b0010 0x00100A82
+wm 32 0x021b0014 0x00000093
+# MMDC0_MDMISC, MDRWD, MDOR
+wm 32 0x021b0018 0x00001688
+wm 32 0x021b002c 0x0f9f26d2
+wm 32 0x021b0030 0x009F0E10
+wm 32 0x021b0030 0x00000010
+# MMDC0_MDCFG3LP, MDOTC
+wm 32 0x021b0038 0x00190778
+wm 32 0x021b0008 0x00000000
+# CS0_END = 0x8fffffff, 256MB
+wm 32 0x021b0040 0x00000047
+# MMDC0_MDCTL 256MB, SDE0 only
+wm 32 0x021b0000 0x83010000
+# MRW
+wm 32 0x021b001c 0x003f8030
+wm 32 0x021b001c 0xff0a8030
+wm 32 0x021b001c 0x82018030
+wm 32 0x021b001c 0x04028030
+wm 32 0x021b001c 0x03038030
+# final DDR setup
+wm 32 0x021b0800 0xa1310003
+wm 32 0x021b0020 0x00001800
+wm 32 0x021b0818 0x00000000
+wm 32 0x021b08b8 0x00000800
+wm 32 0x021b0004 0x00025564
+wm 32 0x021b0404 0x00011006
+wm 32 0x021b001c 0x00000000
diff --git a/arch/arm/boards/kindle-mx6sl/flash-header-kindle-mx6sl-512m.imxcfg b/arch/arm/boards/kindle-mx6sl/flash-header-kindle-mx6sl-512m.imxcfg
new file mode 100644
index 0000000000..6af6341daa
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/flash-header-kindle-mx6sl-512m.imxcfg
@@ -0,0 +1,126 @@
+# SPDX-License-Identifier: GPL-2.0-only
+# SPDX-FileCopyrightText: 2025 Alexander Kurz <akurz@blala.de>
+# SPDX-FileCopyrightText: 2012 Freescale Semiconductor, Inc.
+
+# DCD i.MX6sl SoC setup using 512MiB LPDDR2
+#
+# Initial DCD setup according to
+# Kindle_src_5.10.2_3374520058.tar.gz / uboot_2009.08.tar.gz
+# board/imx60_wario/flash_header.S
+
+loadaddr 0x80000000
+soc imx6
+ivtofs 0x400
+# CCM
+wm 32 0x020c4018 0x00260324
+
+# CCM CGR
+wm 32 0x020c4068 0xffffffff
+wm 32 0x020c406c 0xffffffff
+wm 32 0x020c4070 0xffffffff
+wm 32 0x020c4074 0xffffffff
+wm 32 0x020c4078 0xffffffff
+wm 32 0x020c407c 0xffffffff
+wm 32 0x020c4080 0xffffffff
+wm 32 0x020c4084 0xffffffff
+
+# IOMUX
+wm 32 0x020e0344 0x00003038
+wm 32 0x020e0348 0x00003038
+wm 32 0x020e034c 0x00003038
+wm 32 0x020e0350 0x00003038
+
+wm 32 0x020e030c 0x00000020
+wm 32 0x020e0310 0x00000020
+wm 32 0x020e0314 0x00000020
+wm 32 0x020e0318 0x00000020
+
+wm 32 0x020e0300 0x00000020
+wm 32 0x020e031c 0x00000020
+wm 32 0x020e0338 0x00000020
+wm 32 0x020e0320 0x00080020
+wm 32 0x020e032c 0x00080000
+
+wm 32 0x020e0330 0x00000020
+wm 32 0x020e0334 0x00000020
+wm 32 0x020e033c 0x00000008
+wm 32 0x020e0340 0x00000008
+wm 32 0x020e0344 0x00003020
+wm 32 0x020e0348 0x00003020
+wm 32 0x020e034c 0x00003020
+wm 32 0x020e0350 0x00003020
+
+wm 32 0x020e032c 0x00000000
+wm 32 0x020e05c4 0x00000020
+wm 32 0x020e05cc 0x00000020
+wm 32 0x020e05d0 0x00080000
+wm 32 0x020e05d4 0x00000020
+wm 32 0x020e05d8 0x00000020
+wm 32 0x020e05ac 0x00000020
+wm 32 0x020e05c8 0x00000020
+wm 32 0x020e05b0 0x00020000
+wm 32 0x020e05b4 0x00000000
+wm 32 0x020e05c0 0x00020000
+wm 32 0x020e05bc 0x00001000
+
+# MMDC
+# MMDC0_MDSCR, set the Configuration request bit during MMDC set up
+wm 32 0x021b001c 0x00008000
+# LPDDR2 ZQ params
+wm 32 0x021b085c 0x1b4700c7
+# DDR_PHY_P0_MPZQHWCTRL
+wm 32 0x021b0800 0xa1390003
+wm 32 0x021b0890 0x00400000
+# frc_msr
+wm 32 0x021b08b8 0x00000800
+# DDR_PHY_P0_MPREDQBY0DL3 - DDR_PHY_P0_MPREDQBY3DL3
+wm 32 0x021b081c 0x33333333
+wm 32 0x021b0820 0x33333333
+wm 32 0x021b0824 0x33333333
+wm 32 0x021b0828 0x33333333
+wm 32 0x021b082c 0xf3333333
+wm 32 0x021b0830 0xf3333333
+wm 32 0x021b0834 0xf3333333
+wm 32 0x021b0838 0xf3333333
+# read calibration
+wm 32 0x021b0848 0x4241444a
+# write calibration
+wm 32 0x021b0850 0x3030312b
+# dqs gating dis
+wm 32 0x021b083c 0x20000000
+wm 32 0x021b0840 0x0
+# fine tune duty cyc to low
+wm 32 0x021b08c0 0x24911492
+# frc_msr
+wm 32 0x021b08b8 0x00000800
+# MMDC0_MDCFG0, MDPDC, MDCFG1, MDCFG2
+wm 32 0x021b000c 0x33374133
+wm 32 0x021b0004 0x00020024
+wm 32 0x021b0010 0x00100A82
+wm 32 0x021b0014 0x00000093
+# MMDC0_MDMISC, MDRWD, MDOR
+wm 32 0x021b0018 0x00001688
+wm 32 0x021b002c 0x0f9f26d2
+wm 32 0x021b0030 0x009F0E10
+wm 32 0x021b0030 0x00000010
+# MMDC0_MDCFG3LP, MDOTC
+wm 32 0x021b0038 0x00190778
+wm 32 0x021b0008 0x00000000
+# CS0_END = 0x9fffffff, 512MB
+wm 32 0x021b0040 0x0000004f
+# MMDC0_MDCTL, SDE_1 disabled
+wm 32 0x021b0000 0x83110000
+# MRW
+wm 32 0x021b001c 0x003f8030
+wm 32 0x021b001c 0xff0a8030
+wm 32 0x021b001c 0x82018030
+wm 32 0x021b001c 0x04028030
+wm 32 0x021b001c 0x03038030
+# final DDR setup
+wm 32 0x021b0800 0xa1310003
+wm 32 0x021b0020 0x00001800
+wm 32 0x021b0818 0x00000000
+wm 32 0x021b08b8 0x00000800
+wm 32 0x021b0004 0x00025564
+wm 32 0x021b0404 0x00011006
+wm 32 0x021b001c 0x00000000
diff --git a/arch/arm/boards/kindle-mx6sl/lowlevel.c b/arch/arm/boards/kindle-mx6sl/lowlevel.c
new file mode 100644
index 0000000000..3b823bf061
--- /dev/null
+++ b/arch/arm/boards/kindle-mx6sl/lowlevel.c
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <mach/imx/debug_ll.h>
+#include <common.h>
+#include <linux/sizes.h>
+#include <io.h>
+#include <asm/barebox-arm-head.h>
+#include <asm/barebox-arm.h>
+#include <asm/sections.h>
+#include <asm/cache.h>
+#include <asm/mmu.h>
+#include <mach/imx/imx6.h>
+
+extern char __dtb_imx6sl_kindle_wp63gw_start[];
+extern char __dtb_imx6sl_kindle6_dp75sdi_start[];
+extern char __dtb_imx6sl_kindle7_dp75sdi_start[];
+extern char __dtb_imx6sl_kindle_nm460gz_start[];
+
+ENTRY_FUNCTION(start_imx6sl_kindle_wp63gw, r0, r1, r2)
+{
+	void *fdt;
+
+	imx6_cpu_lowlevel_init();
+
+	arm_setup_stack(0x00920000);
+
+	if (IS_ENABLED(CONFIG_DEBUG_LL)) {
+		writel(0x4, 0x020e016c);
+		imx6_uart_setup_ll();
+	}
+
+	fdt = __dtb_imx6sl_kindle_wp63gw_start + get_runtime_offset();
+	barebox_arm_entry(0x80000000, SZ_256M, fdt);
+}
+
+ENTRY_FUNCTION(start_imx6sl_kindle6_dp75sdi, r0, r1, r2)
+{
+	void *fdt;
+
+	imx6_cpu_lowlevel_init();
+
+	arm_setup_stack(0x00920000);
+
+	if (IS_ENABLED(CONFIG_DEBUG_LL)) {
+		writel(0x4, 0x020e016c);
+		imx6_uart_setup_ll();
+	}
+
+	fdt = __dtb_imx6sl_kindle6_dp75sdi_start + get_runtime_offset();
+	barebox_arm_entry(0x80000000, SZ_256M, fdt);
+}
+
+ENTRY_FUNCTION(start_imx6sl_kindle7_dp75sdi, r0, r1, r2)
+{
+	void *fdt;
+
+	imx6_cpu_lowlevel_init();
+
+	arm_setup_stack(0x00920000);
+
+	if (IS_ENABLED(CONFIG_DEBUG_LL)) {
+		writel(0x4, 0x020e016c);
+		imx6_uart_setup_ll();
+	}
+
+	fdt = __dtb_imx6sl_kindle7_dp75sdi_start + get_runtime_offset();
+	barebox_arm_entry(0x80000000, SZ_512M, fdt);
+}
+
+ENTRY_FUNCTION(start_imx6sl_kindle_nm460gz, r0, r1, r2)
+{
+	void *fdt;
+
+	imx6_cpu_lowlevel_init();
+
+	arm_setup_stack(0x00920000);
+
+	if (IS_ENABLED(CONFIG_DEBUG_LL)) {
+		writel(0x4, 0x020e016c);
+		imx6_uart_setup_ll();
+	}
+
+	fdt = __dtb_imx6sl_kindle_nm460gz_start + get_runtime_offset();
+	barebox_arm_entry(0x80000000, SZ_512M, fdt);
+}
diff --git a/arch/arm/configs/kindle-gen-6-7_defconfig b/arch/arm/configs/kindle-gen-6-7_defconfig
new file mode 100644
index 0000000000..9155fb45a3
--- /dev/null
+++ b/arch/arm/configs/kindle-gen-6-7_defconfig
@@ -0,0 +1,89 @@
+CONFIG_ARCH_IMX=y
+CONFIG_MACH_KINDLE_6_7=y
+CONFIG_IMX_IIM=y
+CONFIG_IMX_IIM_FUSE_BLOW=y
+CONFIG_THUMB2_BAREBOX=y
+CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
+CONFIG_ARM_UNWIND=y
+CONFIG_BOOT_ATAGS=y
+CONFIG_IMAGE_COMPRESSION_XZKERN=y
+CONFIG_MMU=y
+CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x5dc00
+CONFIG_STACK_SIZE=0x10000
+CONFIG_MALLOC_SIZE=0x0
+CONFIG_KALLSYMS=y
+CONFIG_HUSH_FANCY_PROMPT=y
+CONFIG_CMDLINE_EDITING=y
+CONFIG_AUTO_COMPLETE=y
+CONFIG_BOOTM_SHOW_TYPE=y
+CONFIG_BOOTM_VERBOSE=y
+CONFIG_BOOTM_INITRD=y
+CONFIG_BOOTM_OFTREE_UIMAGE=y
+CONFIG_BLSPEC=y
+CONFIG_CONSOLE_ACTIVATE_NONE=y
+CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y
+CONFIG_RESET_SOURCE=y
+CONFIG_CMD_DMESG=y
+CONFIG_LONGHELP=y
+CONFIG_CMD_IOMEM=y
+CONFIG_CMD_IMD=y
+CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_ARM_MMUINFO=y
+CONFIG_CMD_REGULATOR=y
+# CONFIG_CMD_BOOTU is not set
+CONFIG_CMD_GO=y
+CONFIG_CMD_LOADY=y
+CONFIG_CMD_RESET=y
+CONFIG_CMD_UIMAGE=y
+CONFIG_CMD_PARTITION=y
+CONFIG_CMD_EXPORT=y
+CONFIG_CMD_LOADENV=y
+CONFIG_CMD_PRINTENV=y
+CONFIG_CMD_MAGICVAR=y
+CONFIG_CMD_MAGICVAR_HELP=y
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_FILETYPE=y
+CONFIG_CMD_LN=y
+CONFIG_CMD_MD5SUM=y
+CONFIG_CMD_UNCOMPRESS=y
+CONFIG_CMD_LET=y
+CONFIG_CMD_MSLEEP=y
+CONFIG_CMD_READF=y
+CONFIG_CMD_SLEEP=y
+CONFIG_CMD_ECHO_E=y
+CONFIG_CMD_EDIT=y
+CONFIG_CMD_READLINE=y
+CONFIG_CMD_TIMEOUT=y
+CONFIG_CMD_MEMTEST=y
+CONFIG_CMD_MM=y
+CONFIG_CMD_CLK=y
+CONFIG_CMD_DETECT=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_I2C=y
+CONFIG_CMD_SPI=y
+CONFIG_CMD_USBGADGET=y
+CONFIG_CMD_OF_NODE=y
+CONFIG_CMD_OF_PROPERTY=y
+CONFIG_CMD_OFTREE=y
+CONFIG_CMD_TIME=y
+CONFIG_OF_BAREBOX_DRIVERS=y
+CONFIG_MTD=y
+CONFIG_MTD_M25P80=y
+CONFIG_USB_HOST=y
+CONFIG_USB_IMX_CHIPIDEA=y
+CONFIG_USB_EHCI=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_GADGET_SERIAL=y
+CONFIG_MCI=y
+CONFIG_MCI_MMC_BOOT_PARTITIONS=y
+CONFIG_MCI_IMX_ESDHC=y
+CONFIG_EEPROM_AT25=y
+CONFIG_WATCHDOG=y
+CONFIG_WATCHDOG_IMX=y
+CONFIG_MXS_APBH_DMA=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED=y
+CONFIG_GENERIC_PHY=y
+CONFIG_FS_EXT4=y
+CONFIG_FS_FAT=y
+CONFIG_FS_FAT_WRITE=y
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index e78722a9a7..7f434403b8 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -17,6 +17,10 @@ lwl-$(CONFIG_MACH_EXYNOS) += exynos8895-dreamlte.dtb.o \
 			exynos990-x1s.dtb.o
 lwl-$(CONFIG_MACH_DUCKBILL) += imx28-duckbill.dtb.o
 lwl-$(CONFIG_MACH_KINDLE_MX50) += imx50-kindle-d01100.dtb.o imx50-kindle-d01200.dtb.o imx50-kindle-ey21.dtb.o
+lwl-$(CONFIG_MACH_KINDLE_6_7) += imx6sl-kindle-wp63gw.dtb.o \
+		imx6sl-kindle6-dp75sdi.dtb.o \
+		imx6sl-kindle7-dp75sdi.dtb.o \
+		imx6sl-kindle-nm460gz.dtb.o
 lwl-$(CONFIG_MACH_EFIKA_MX_SMARTBOOK) += imx51-genesi-efika-sb.dtb.o
 lwl-$(CONFIG_MACH_ELTEC_HIPERCAM) += imx6dl-eltec-hipercam.dtb.o
 lwl-$(CONFIG_MACH_EMBEST_MARSBOARD) += imx6q-marsboard.dtb.o
diff --git a/arch/arm/dts/imx6sl-kindle-common.dtsi b/arch/arm/dts/imx6sl-kindle-common.dtsi
new file mode 100644
index 0000000000..8a98fd2bbc
--- /dev/null
+++ b/arch/arm/dts/imx6sl-kindle-common.dtsi
@@ -0,0 +1,167 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2025 Alexander Kurz <akurz@blala.de>
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <arm/nxp/imx/imx6sl.dtsi>
+
+/ {
+	chosen {
+		stdout-path = &uart1;
+	};
+
+	reg_3p3v: regulator-3p3v {
+		compatible = "regulator-fixed";
+		regulator-name = "3P3V";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		regulator-always-on;
+	};
+};
+
+&iomuxc {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_hog>;
+
+	imx6sl-kindle {
+		pinctrl_uart1: uart1grp {
+			fsl,pins = <
+				MX6SL_PAD_UART1_RXD__UART1_RX_DATA	0x1b0b1
+				MX6SL_PAD_UART1_TXD__UART1_TX_DATA	0x1b0b1
+			>;
+		};
+
+		pinctrl_usdhc2: usdhc2grp {
+			fsl,pins = <
+				MX6SL_PAD_SD2_CMD__SD2_CMD		0x17059
+				MX6SL_PAD_SD2_CLK__SD2_CLK		0x10059
+				MX6SL_PAD_SD2_DAT0__SD2_DATA0		0x17059
+				MX6SL_PAD_SD2_DAT1__SD2_DATA1		0x17059
+				MX6SL_PAD_SD2_DAT2__SD2_DATA2		0x17059
+				MX6SL_PAD_SD2_DAT3__SD2_DATA3		0x17059
+			>;
+		};
+
+		pinctrl_usdhc2_100mhz: usdhc2grp100mhz {
+			fsl,pins = <
+				MX6SL_PAD_SD2_CMD__SD2_CMD		0x170b9
+				MX6SL_PAD_SD2_CLK__SD2_CLK		0x100b9
+				MX6SL_PAD_SD2_DAT0__SD2_DATA0		0x170b9
+				MX6SL_PAD_SD2_DAT1__SD2_DATA1		0x170b9
+				MX6SL_PAD_SD2_DAT2__SD2_DATA2		0x170b9
+				MX6SL_PAD_SD2_DAT3__SD2_DATA3		0x170b9
+			>;
+		};
+
+		pinctrl_usdhc2_200mhz: usdhc2grp200mhz {
+			fsl,pins = <
+				MX6SL_PAD_SD2_CMD__SD2_CMD		0x170f9
+				MX6SL_PAD_SD2_CLK__SD2_CLK		0x100f9
+				MX6SL_PAD_SD2_DAT0__SD2_DATA0		0x170f9
+				MX6SL_PAD_SD2_DAT1__SD2_DATA1		0x170f9
+				MX6SL_PAD_SD2_DAT2__SD2_DATA2		0x170f9
+				MX6SL_PAD_SD2_DAT3__SD2_DATA3		0x170f9
+			>;
+		};
+
+		pinctrl_ecspi1: ecspi1grp {
+			fsl,pins = <
+				MX6SL_PAD_ECSPI1_MISO__ECSPI1_MISO	0x400100b1
+				MX6SL_PAD_ECSPI1_MOSI__ECSPI1_MOSI	0x400100b1
+				MX6SL_PAD_ECSPI1_SCLK__ECSPI1_SCLK	0x400100b1
+				MX6SL_PAD_ECSPI1_SS0__GPIO4_IO11	0x80000000
+			>;
+		};
+
+		pinctrl_i2c1: i2c1grp {
+			fsl,pins = <
+				MX6SL_PAD_I2C1_SCL__I2C1_SCL		0x4001b8b1
+				MX6SL_PAD_I2C1_SDA__I2C1_SDA		0x4001b8b1
+			>;
+		};
+	};
+};
+
+&uart1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_uart1>;
+	status = "okay";
+};
+
+&usdhc2 {
+	pinctrl-names = "default", "state_100mhz", "state_200mhz";
+	pinctrl-0 = <&pinctrl_usdhc2>;
+	pinctrl-1 = <&pinctrl_usdhc2_100mhz>;
+	pinctrl-2 = <&pinctrl_usdhc2_200mhz>;
+	non-removable;
+	keep-power-in-suspend;
+	enable-sdio-wakeup;
+	bus-width = <4>;
+	fsl,delay-line;
+	status = "okay";
+
+	partitions {
+		compatible = "barebox,fixed-partitions";
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		kernel: kernel@41000 {
+			label = "kernel";
+			reg = <0x41000 0xe00000>;
+		};
+	};
+
+	partitions-boot1 {
+		compatible = "barebox,fixed-partitions";
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		imx_header: imx_header@400 {
+			label = "imx_header";
+			reg = <0x400 0x800>;
+		};
+
+		self: self@1000 {
+			label = "self";
+			reg = <0x1000 0x4d000>;
+		};
+
+		userdata: userdata@5e000 {
+			label = "userdata";
+			reg = <0x5e000 0x1400>;
+		};
+	};
+};
+
+&ecspi1 {
+	fsl,spi-num-chipselects = <1>;
+	cs-gpios = <&gpio4 11 0>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_ecspi1>;
+	status = "okay";
+
+	flash: m25p80@0 {
+		#address-cells = <1>;
+		#size-cells = <1>;
+		compatible = "st,m25p32", "jedec,spi-nor";
+		spi-max-frequency = <2000000>;
+		reg = <0>;
+	};
+};
+
+&i2c1 {
+	clock-frequency = <100000>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_i2c1>;
+	status = "okay";
+};
+
+&usbotg1 {
+	phy_type = "utmi";
+	dr_mode = "peripheral";
+	status = "okay";
+};
diff --git a/arch/arm/dts/imx6sl-kindle-nm460gz.dts b/arch/arm/dts/imx6sl-kindle-nm460gz.dts
new file mode 100644
index 0000000000..606964b828
--- /dev/null
+++ b/arch/arm/dts/imx6sl-kindle-nm460gz.dts
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2025 Alexander Kurz <akurz@blala.de>
+ */
+
+/dts-v1/;
+#include "imx6sl-kindle-common.dtsi"
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "kindle-nm460gz";
+	compatible = "amazon,imx6sl-kindle-nm460gz", "fsl,imx6sl";
+	barebox,disable-deep-probe;
+
+	memory@80000000 {
+		reg = <0x80000000 0x20000000>;
+	};
+};
+
+&iomuxc {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_hog>;
+
+	imx6sl-kindle-nm460gz {
+		pinctrl_hog: hoggrp {
+			fsl,pins = <
+				/* Hall sensor */
+				MX6SL_PAD_KEY_ROW7__GPIO4_IO07	0x17059
+				/* Touch reset */
+				MX6SL_PAD_KEY_ROW6__GPIO4_IO05	0x17059
+				/* EMMC_3v2_EN, EMMC_1v8_EN */
+				MX6SL_PAD_FEC_RXD0__GPIO4_IO17	0x17059
+				MX6SL_PAD_FEC_MDC__GPIO4_IO23	0x17059
+				/* WLAN pwd */
+				MX6SL_PAD_KEY_ROW2__GPIO3_IO29	0x17059
+			>;
+		};
+
+		pinctrl_i2c2: i2c2grp {
+			fsl,pins = <
+				MX6SL_PAD_I2C2_SCL__I2C2_SCL	0x4001b8b1
+				MX6SL_PAD_I2C2_SDA__I2C2_SDA	0x4001b8b1
+			>;
+		};
+
+		pinctrl_i2c3: i2c3grp {
+			fsl,pins = <
+				MX6SL_PAD_EPDC_SDCE2__I2C3_SCL	0x4001b8b1
+				MX6SL_PAD_EPDC_SDCE3__I2C3_SDA	0x4001b8b1
+			>;
+		};
+	};
+};
+
+&i2c2 {
+	clock-frequency = <100000>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_i2c2>;
+	status = "okay";
+};
+
+&i2c3 {
+	clock-frequency = <100000>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_i2c3>;
+	status = "okay";
+};
diff --git a/arch/arm/dts/imx6sl-kindle-wp63gw.dts b/arch/arm/dts/imx6sl-kindle-wp63gw.dts
new file mode 100644
index 0000000000..156be77cd2
--- /dev/null
+++ b/arch/arm/dts/imx6sl-kindle-wp63gw.dts
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2025 Alexander Kurz <akurz@blala.de>
+ */
+
+/dts-v1/;
+#include "imx6sl-kindle-common.dtsi"
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "kindle-wp63gw";
+	compatible = "amazon,imx6sl-kindle-wp63gw",  "fsl,imx6sl";
+	barebox,disable-deep-probe;
+
+	memory@80000000 {
+		reg = <0x80000000 0x10000000>;
+	};
+};
+
+&iomuxc {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_hog>;
+
+	imx6sl-kindle-wp63gw {
+		pinctrl_hog: hoggrp {
+			fsl,pins = <
+				/* Hall sensor */
+				MX6SL_PAD_KEY_ROW7__GPIO4_IO07	0x17059
+				/* zForce touch */
+				MX6SL_PAD_I2C2_SCL__GPIO3_IO14	0x17059
+				MX6SL_PAD_I2C2_SDA__GPIO3_IO15	0x17059
+				MX6SL_PAD_KEY_ROW5__GPIO4_IO03	0x17059
+				MX6SL_PAD_KEY_ROW6__GPIO4_IO05	0x17059
+				/* EMMC_3v2_EN, EMMC_1v8_EN */
+				MX6SL_PAD_FEC_RXD0__GPIO4_IO17	0x17059
+				MX6SL_PAD_FEC_MDC__GPIO4_IO23	0x17059
+				/* WLAN pwd */
+				MX6SL_PAD_KEY_ROW2__GPIO3_IO29	0x17059
+			>;
+		};
+	};
+};
diff --git a/arch/arm/dts/imx6sl-kindle6-dp75sdi.dts b/arch/arm/dts/imx6sl-kindle6-dp75sdi.dts
new file mode 100644
index 0000000000..fbbb909077
--- /dev/null
+++ b/arch/arm/dts/imx6sl-kindle6-dp75sdi.dts
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2025 Alexander Kurz <akurz@blala.de>
+ */
+
+/dts-v1/;
+#include "imx6sl-kindle-common.dtsi"
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "kindle6-dp75sdi";
+	compatible = "amazon,imx6sl-kindle6-dp75sdi",  "fsl,imx6sl";
+	barebox,disable-deep-probe;
+
+	memory@80000000 {
+		reg = <0x80000000 0x10000000>;
+	};
+};
+
+&iomuxc {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_hog>;
+
+	imx6sl-kindle-dp75sdi {
+		pinctrl_hog: hoggrp {
+			fsl,pins = <
+				/* Hall sensor */
+				MX6SL_PAD_KEY_ROW7__GPIO4_IO07	0x17059
+				/* Touch reset */
+				MX6SL_PAD_KEY_ROW6__GPIO4_IO05	0x17059
+				/* EMMC_3v2_EN, EMMC_1v8_EN */
+				MX6SL_PAD_FEC_RXD0__GPIO4_IO17	0x17059
+				MX6SL_PAD_FEC_MDC__GPIO4_IO23	0x17059
+				/* WLAN pwd */
+				MX6SL_PAD_KEY_ROW2__GPIO3_IO29	0x17059
+			>;
+		};
+
+		pinctrl_i2c2: i2c2grp {
+			fsl,pins = <
+				MX6SL_PAD_I2C2_SCL__I2C2_SCL	0x4001b8b1
+				MX6SL_PAD_I2C2_SDA__I2C2_SDA	0x4001b8b1
+			>;
+		};
+	};
+};
+
+&i2c2 {
+	clock-frequency = <100000>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_i2c2>;
+	status = "okay";
+};
diff --git a/arch/arm/dts/imx6sl-kindle7-dp75sdi.dts b/arch/arm/dts/imx6sl-kindle7-dp75sdi.dts
new file mode 100644
index 0000000000..9765e7a0db
--- /dev/null
+++ b/arch/arm/dts/imx6sl-kindle7-dp75sdi.dts
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2025 Alexander Kurz <akurz@blala.de>
+ */
+
+/dts-v1/;
+#include "imx6sl-kindle-common.dtsi"
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+	model = "kindle7-dp75sdi";
+	compatible = "amazon,imx6sl-kindle7-dp75sdi",  "fsl,imx6sl";
+	barebox,disable-deep-probe;
+
+	memory@80000000 {
+		reg = <0x80000000 0x20000000>;
+	};
+};
+
+&iomuxc {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_hog>;
+
+	imx6sl-kindle-dp75sdi {
+		pinctrl_hog: hoggrp {
+			fsl,pins = <
+				/* Hall sensor */
+				MX6SL_PAD_KEY_ROW7__GPIO4_IO07	0x17059
+				/* Touch reset */
+				MX6SL_PAD_KEY_ROW6__GPIO4_IO05	0x17059
+				/* EMMC_3v2_EN, EMMC_1v8_EN */
+				MX6SL_PAD_FEC_RXD0__GPIO4_IO17	0x17059
+				MX6SL_PAD_FEC_MDC__GPIO4_IO23	0x17059
+				/* WLAN pwd */
+				MX6SL_PAD_KEY_ROW2__GPIO3_IO29	0x17059
+			>;
+		};
+
+		pinctrl_i2c2: i2c2grp {
+			fsl,pins = <
+				MX6SL_PAD_I2C2_SCL__I2C2_SCL	0x4001b8b1
+				MX6SL_PAD_I2C2_SDA__I2C2_SDA	0x4001b8b1
+			>;
+		};
+	};
+};
+
+&i2c2 {
+	clock-frequency = <100000>;
+	pinctrl-names = "default";
+	pinctrl-0 = <&pinctrl_i2c2>;
+	status = "okay";
+};
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 5f50d1a823..eb947e67fb 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -353,6 +353,23 @@ config MACH_ADVANTECH_ROM_742X
 	bool "Advantech ROM 742X"
 	select ARCH_IMX6
 
+config MACH_KINDLE_6_7
+	bool "i.MX6SL based Amazon Kindle generation 6 and 7"
+	select ARCH_IMX6SL
+	select SPI
+	select DRIVER_SPI_IMX
+	select I2C
+	select I2C_IMX
+	select GPIO_IMX
+	select ARM_BOARD_APPEND_ATAG
+	select ARM_LINUX
+	select OFTREE
+	select PINCTRL
+	help
+	  Say Y here if you are using the sixth or seventh generation Amazon
+	  Kindle Model No. DP75SDI (Paperwhite 2 or 3), WP63GW (Kindle 7) or
+	  NM460GZ (Kindle Voyage) based on the i.MX6SL SoC and MAX77696 PMIC.
+
 config MACH_NITROGEN6
 	bool "BoundaryDevices Nitrogen6 boards"
 	select ARCH_IMX6
diff --git a/images/Makefile.imx b/images/Makefile.imx
index 5ae14a5988..f66c0af6a4 100644
--- a/images/Makefile.imx
+++ b/images/Makefile.imx
@@ -374,6 +374,27 @@ $(call build_imx_habv4img, CONFIG_MACH_ADVANTECH_ROM_742X, start_advantech_imx6d
 
 $(call build_imx_habv4img, CONFIG_MACH_ZII_RDU2, start_imx6_zii_rdu2, zii-imx6q-rdu2/flash-header-rdu2, zii-imx6-rdu2)
 
+# ----------------------- i.MX6sl based boards --------------
+pblb-$(CONFIG_MACH_KINDLE_6_7) += start_imx6sl_kindle_wp63gw
+CFG_start_imx6sl_kindle_wp63gw.pblb.imximg = $(board)/kindle-mx6sl/flash-header-kindle-mx6sl-256m.imxcfg
+FILE_barebox-kindle-wp63gw.img = start_imx6sl_kindle_wp63gw.pblb.imximg
+image-$(CONFIG_MACH_KINDLE_6_7) += barebox-kindle-wp63gw.img
+
+pblb-$(CONFIG_MACH_KINDLE_6_7) += start_imx6sl_kindle6_dp75sdi
+CFG_start_imx6sl_kindle6_dp75sdi.pblb.imximg = $(board)/kindle-mx6sl/flash-header-kindle-mx6sl-256m.imxcfg
+FILE_barebox-kindle6-dp75sdi.img = start_imx6sl_kindle6_dp75sdi.pblb.imximg
+image-$(CONFIG_MACH_KINDLE_6_7) += barebox-kindle6-dp75sdi.img
+
+pblb-$(CONFIG_MACH_KINDLE_6_7) += start_imx6sl_kindle7_dp75sdi
+CFG_start_imx6sl_kindle7_dp75sdi.pblb.imximg = $(board)/kindle-mx6sl/flash-header-kindle-mx6sl-512m.imxcfg
+FILE_barebox-kindle7-dp75sdi.img = start_imx6sl_kindle7_dp75sdi.pblb.imximg
+image-$(CONFIG_MACH_KINDLE_6_7) += barebox-kindle7-dp75sdi.img
+
+pblb-$(CONFIG_MACH_KINDLE_6_7) += start_imx6sl_kindle_nm460gz
+CFG_start_imx6sl_kindle_nm460gz.pblb.imximg = $(board)/kindle-mx6sl/flash-header-kindle-mx6sl-512m.imxcfg
+FILE_barebox-kindle-nm460gz.img = start_imx6sl_kindle_nm460gz.pblb.imximg
+image-$(CONFIG_MACH_KINDLE_6_7) += barebox-kindle-nm460gz.img
+
 # ----------------------- i.MX6ul / i.MX6ull based boards --------------
 $(call build_imx_habv4img, CONFIG_MACH_GRINN_LITEBOARD, start_imx6ul_liteboard_256mb, grinn-liteboard/flash-header-liteboard-256mb, grinn-liteboard-256mb)
 
-- 
2.39.5




^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] ARM i.MX6SL: Add Kindle generation 6/7 support
  2025-11-09 18:03 [PATCH] ARM i.MX6SL: Add Kindle generation 6/7 support Alexander Kurz
@ 2025-11-10  8:54 ` Sascha Hauer
  0 siblings, 0 replies; 2+ messages in thread
From: Sascha Hauer @ 2025-11-10  8:54 UTC (permalink / raw)
  To: Alexander Kurz; +Cc: barebox


Hi Alexander,

On Sun, Nov 09, 2025 at 06:03:37PM +0000, Alexander Kurz wrote:
> Four Amazon Kindle 6th and 7th generation e-book readers were considered
> for this patch, referred by their models
> * DP75SDI "PINOT_WFO" (256MB) "Kindle Paperwhite 2" 6th gen
> * DP75SDI "Muscat WFO" (512MB) "Kindle Paperwhite 3" 7th gen
> * WP63GW "Kindle" 7th gen (512MB)
> * NM460GZ "Voyage" 7th gen (512MB)
> Kindle e-book readers from generation 6 and 7 use the i.MX6SL and an
> are shipped with a factory-adapted u-boot image. Vendor software image
> updates for these models stopped around 2021 to 2023.
> 
> Add experimental support for the kindle gen 6/7 models and make barebox
> an optional drop-in replacement for the original bootloader.
> Required PMIC settings are implemented as script.
> 
> Notable features tested on all models:
> - Support for eMMC, USB, UART, I2C and SPI.
> - LPDDR2 setup is done via DCD, the same imximage may be used
>   for USB-startup and for installation.
> - Support for vendor specific ATAGs that are required by the Kindle-System.
> - usbserial barebox console access for 10 seconds after startup.
> 
> Known issues:
> - Reset on models kindle6-dp75sdi and nm460gz does not work and triggers
>   microcode USB download boot.
> - No recovery (without soldering) like USB boot known after e.g. a failed
>   flashing attempt.
> 
> Signed-off-by: Alexander Kurz <akurz@blala.de>
> ---
>  .../boards/imx/amazon-kindle-6-7.rst          |  94 ++++++++
>  arch/arm/boards/Makefile                      |   1 +
>  arch/arm/boards/kindle-mx6sl/Makefile         |   5 +
> diff --git a/Documentation/boards/imx/amazon-kindle-6-7.rst b/Documentation/boards/imx/amazon-kindle-6-7.rst

Thanks for the good documentation, very appreciated :)

> new file mode 100644
> index 0000000000..c7a5ef9424
> +ENTRY_FUNCTION(start_imx6sl_kindle6_dp75sdi, r0, r1, r2)
> +{
> +	void *fdt;
> +
> +	imx6_cpu_lowlevel_init();
> +
> +	arm_setup_stack(0x00920000);
> +
> +	if (IS_ENABLED(CONFIG_DEBUG_LL)) {
> +		writel(0x4, 0x020e016c);
> +		imx6_uart_setup_ll();
> +	}
> +
> +	fdt = __dtb_imx6sl_kindle6_dp75sdi_start + get_runtime_offset();
> +	barebox_arm_entry(0x80000000, SZ_256M, fdt);

Does imx6ul_barebox_entry() work here instead? In that case you could
drop the memory nodes from the device trees.

> +++ b/arch/arm/dts/imx6sl-kindle-nm460gz.dts
> @@ -0,0 +1,69 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2025 Alexander Kurz <akurz@blala.de>
> + */
> +
> +/dts-v1/;
> +#include "imx6sl-kindle-common.dtsi"
> +#include <dt-bindings/interrupt-controller/irq.h>
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/input/input.h>
> +
> +/ {
> +	model = "kindle-nm460gz";
> +	compatible = "amazon,imx6sl-kindle-nm460gz", "fsl,imx6sl";
> +	barebox,disable-deep-probe;

Is this intentional? What doesn't work with deep probe enabled?

Sascha

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-11-10  8:55 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-11-09 18:03 [PATCH] ARM i.MX6SL: Add Kindle generation 6/7 support Alexander Kurz
2025-11-10  8:54 ` Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox