Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updated f1c100s code from linux-sunxi #2

Open
wants to merge 54 commits into
base: f1c100s
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
2573658
fel: enable A83T MMU
jackmitch Feb 27, 2018
353a5ae
Provide a wrapper for reset via watchdog
karlp Apr 19, 2020
39bd0d1
Provide a wrapper for reset via watchdog
karlp Apr 19, 2020
6e825a0
FEL: Add wdreset support to Allwinner A20 SoC
plaes Jun 14, 2020
ce6897e
Merge pull request #131 from karlp/wdreset
wens Jun 14, 2020
c714fb0
Merge pull request #133 from plaes/a20-wdreset
wens Jun 14, 2020
2767489
Add support for reading A10 SPI flash
anistor Sep 14, 2020
613e4ba
Merge pull request #138 from anistor/a10-spiflash-support
wens Sep 14, 2020
b330eeb
spi: add support for V3s SoC
Icenowy Sep 19, 2020
bf02fd3
fel: SPI: add Eon support
Icenowy Sep 19, 2020
ef85882
Merge pull request #139 from Icenowy/v3s-spi
wens Sep 29, 2020
2783524
Merge pull request #141 from Icenowy/eon-flash
wens Sep 29, 2020
e334ccf
Merge pull request #110 from jackmitch/master
wens Sep 29, 2020
c611119
fel: add initial SoC info for V831
Icenowy Sep 12, 2020
3c2faa1
uart0-helloworld-sdboot: add support for V831 SoC
Icenowy Sep 19, 2020
eac43cf
spi: add support for V831
Icenowy Sep 19, 2020
7cc37c8
Merge pull request #140 from Icenowy/v831
wens Sep 29, 2020
40ac9da
Add support for H616
jernejsk Oct 1, 2020
3fb8539
Merge pull request #142 from jernejsk/h616
Icenowy Oct 6, 2020
783cbd5
meminfo: Replace sys/io.h by direct register accesses.
Oct 8, 2020
4e3eeb5
spi: fix GPIO base address
gediz Oct 19, 2020
14ff3e3
Merge pull request #145 from gediz/gpio-base-fix
wens Oct 20, 2020
ac432c4
wdreset: Add remaining SoCs
apritzel Nov 8, 2020
47b611c
spi: Add support for R40
apritzel Dec 30, 2019
6814036
spi: Add support for H6
apritzel Jun 19, 2018
de784a7
spi: Avoid signed shifts
apritzel Jan 20, 2020
205e208
spi: Observe proper clock initialisation order
apritzel Jan 1, 2020
47f0bfc
Merge pull request #144 from daym/meminfo
wens Nov 10, 2020
54a0fe5
Merge pull request #150 from apritzel/spiflash-h6-new
wens Nov 10, 2020
2601dfa
Merge pull request #149 from apritzel/wdreset
wens Nov 12, 2020
63ce5ad
spi: Add H616 support
apritzel Nov 19, 2020
8347b64
Merge pull request #151 from apritzel/spiflash-h616
Icenowy Nov 23, 2020
8af203e
fel: Check for U-Boot image before considering checksum
apritzel Dec 21, 2020
2b67b2d
fel: Fix SPL size check against thunk addr
apritzel Dec 29, 2020
75960dd
fel: Check actual SPL size before considering U-Boot proper
apritzel Dec 19, 2020
276a97d
soc_info: Introduce SRAM size
apritzel Dec 28, 2020
4c6a1a0
fel: Observe SRAM size to extend SPL load size
apritzel Dec 29, 2020
2a2af19
fel: H616: Allow bigger SPL size
apritzel Dec 29, 2020
2f59b57
fel: H6: Allow bigger SPL size
apritzel Dec 29, 2020
ada2483
fel: A64/H5: Allow bigger SPL size
apritzel Dec 28, 2020
7a6a222
Merge pull request #154 from apritzel/larger_spl
wens Jan 3, 2021
f917e69
fel: Skip uploading empty image
apritzel Dec 22, 2020
059b831
fel: autoboot: Support entering in AArch64
apritzel Jun 12, 2018
5541673
fel: Parse SPL DT name
apritzel Jun 12, 2018
65412b1
fel: Detect (and report) FIT image
apritzel Dec 22, 2020
14b3492
fel: Add FIT image parsing and loading
apritzel Jun 12, 2018
6c02224
Merge pull request #152 from apritzel/fit
wens Mar 15, 2021
7a21ba0
fel: add support for R329
Icenowy Jul 15, 2021
c7438f8
uart0-helloworld-sdboot: add support for R329
Icenowy Jul 15, 2021
64d6403
README: Add more information about other requirements
gediz Aug 17, 2021
74273b6
Merge pull request #160 from gediz/mention-dependencies
wens Aug 29, 2021
02a865f
Merge pull request #159 from Icenowy/r329
wens Dec 15, 2021
8882254
Merge remote-tracking branch 'linux-sunxi/master' into f1c100s
marsfan Dec 25, 2021
2953223
Merge branch 'linux-sunxi-master' into f1c100s
marsfan Dec 25, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -138,9 +138,9 @@ FEL_LIB := fel_lib.c fel_lib.h
SPI_FLASH:= fel-spiflash.c fel-spiflash.h fel-remotefunc-spi-data-transfer.h
THUNKS := thunk.c thunk.h thunks/fel-to-spl-thunk.h thunks/fel-to-spl-thunk-armv5.h

sunxi-fel: fel.c $(THUNKS) $(PROGRESS) $(SOC_INFO) $(FEL_LIB) $(SPI_FLASH)
sunxi-fel: fel.c fit_image.c thunks/fel-to-spl-thunk.h $(THUNKS) $(PROGRESS) $(SOC_INFO) $(FEL_LIB) $(SPI_FLASH)
$(CC) $(HOST_CFLAGS) $(LIBUSB_CFLAGS) $(ZLIB_CFLAGS) $(LDFLAGS) -o $@ \
$(filter %.c,$^) $(LIBS) $(LIBUSB_LIBS) $(ZLIB_LIBS)
$(filter %.c,$^) $(LIBS) $(LIBUSB_LIBS) $(ZLIB_LIBS) -lfdt

sunxi-nand-part: nand-part-main.c nand-part.c nand-part-a10.h nand-part-a20.h
$(CC) $(HOST_CFLAGS) -c -o nand-part-main.o nand-part-main.c
Expand Down
8 changes: 7 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,13 @@ To build this, get a toolchain and run:
Compilation requires the development version of *libusb-1.0* (include header
and library) to be installed for `sunxi-fel`. Unless you explicitly pass
*LIBUSB_CFLAGS* and *LIBUSB_LIBS* to the make utility, `pkg-config` is also
needed.
needed. Development versions of zlib and libfdt are also required.

To install the dependencies on Ubuntu 20.04 using package manager:

```bash
sudo apt install libusb-1.0-0-dev libz-dev libfdt-dev
```

Available build targets:

Expand Down
163 changes: 122 additions & 41 deletions fel-spiflash.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ spi_flash_info_t spi_flash_info[] = {
.small_erase_cmd = 0x20, .small_erase_size = 4 * 1024,
.program_cmd = 0x02, .program_size = 256,
.text_description = "Macronix MX25Lxxxx" },
{ .id = 0x1C70, .write_enable_cmd = 0x6,
.large_erase_cmd = 0xD8, .large_erase_size = 64 * 1024,
.small_erase_cmd = 0x20, .small_erase_size = 4 * 1024,
.program_cmd = 0x02, .program_size = 256,
.text_description = "Eon EN25QHxx" },
};

spi_flash_info_t default_spi_flash_info = {
Expand Down Expand Up @@ -77,6 +82,11 @@ void fel_writel(feldev_handle *dev, uint32_t addr, uint32_t val);
#define SUN6I_SPI0_RST (1 << 20)

#define SUNIV_GPC_SPI0 (2)

#define H6_CCM_SPI0_CLK (0x03001000 + 0x940)
#define H6_CCM_SPI_BGR (0x03001000 + 0x96C)
#define H6_CCM_SPI0_GATE_RESET (1 << 0 | 1 << 16)

#define SUNXI_GPC_SPI0 (3)
#define SUN50I_GPC_SPI0 (4)

Expand All @@ -86,40 +96,70 @@ void fel_writel(feldev_handle *dev, uint32_t addr, uint32_t val);
#define SUN4I_CTL_RF_RST (1 << 9)
#define SUN4I_CTL_XCH (1 << 10)

#define SUN6I_TCR_XCH (1 << 31)

static uint32_t spi0_base;

#define SUN4I_SPI0_CCTL (spi0_base + 0x1C)
#define SUN4I_SPI0_CTL (spi0_base + 0x08)
#define SUN4I_SPI0_RX (spi0_base + 0x00)
#define SUN4I_SPI0_TX (spi0_base + 0x04)
#define SUN4I_SPI0_FIFO_STA (spi0_base + 0x28)
#define SUN4I_SPI0_BC (spi0_base + 0x20)
#define SUN4I_SPI0_TC (spi0_base + 0x24)

#define SUN6I_SPI0_CCTL (spi0_base + 0x24)
#define SUN6I_SPI0_GCR (spi0_base + 0x04)
#define SUN6I_SPI0_TCR (spi0_base + 0x08)
#define SUN6I_SPI0_FIFO_STA (spi0_base + 0x1C)
#define SUN6I_SPI0_MBC (spi0_base + 0x30)
#define SUN6I_SPI0_MTC (spi0_base + 0x34)
#define SUN6I_SPI0_BCC (spi0_base + 0x38)
#define SUN6I_SPI0_TXD (spi0_base + 0x200)
#define SUN6I_SPI0_RXD (spi0_base + 0x300)
#define SUN6I_TCR_XCH (1U << 31)

#define SUN4I_SPI0_CCTL (spi_base(dev) + 0x1C)
#define SUN4I_SPI0_CTL (spi_base(dev) + 0x08)
#define SUN4I_SPI0_RX (spi_base(dev) + 0x00)
#define SUN4I_SPI0_TX (spi_base(dev) + 0x04)
#define SUN4I_SPI0_FIFO_STA (spi_base(dev) + 0x28)
#define SUN4I_SPI0_BC (spi_base(dev) + 0x20)
#define SUN4I_SPI0_TC (spi_base(dev) + 0x24)

#define SUN6I_SPI0_CCTL (spi_base(dev) + 0x24)
#define SUN6I_SPI0_GCR (spi_base(dev) + 0x04)
#define SUN6I_SPI0_TCR (spi_base(dev) + 0x08)
#define SUN6I_SPI0_FIFO_STA (spi_base(dev) + 0x1C)
#define SUN6I_SPI0_MBC (spi_base(dev) + 0x30)
#define SUN6I_SPI0_MTC (spi_base(dev) + 0x34)
#define SUN6I_SPI0_BCC (spi_base(dev) + 0x38)
#define SUN6I_SPI0_TXD (spi_base(dev) + 0x200)
#define SUN6I_SPI0_RXD (spi_base(dev) + 0x300)

#define CCM_SPI0_CLK_DIV_BY_2 (0x1000)
#define CCM_SPI0_CLK_DIV_BY_4 (0x1001)
#define CCM_SPI0_CLK_DIV_BY_6 (0x1002)
#define CCM_SPI0_CLK_DIV_BY_32 (0x100f)

static uint32_t gpio_base(feldev_handle *dev)
{
soc_info_t *soc_info = dev->soc_info;
switch (soc_info->soc_id) {
case 0x1817: /* V831 */
case 0x1728: /* H6 */
case 0x1823: /* H616 */
return 0x0300B000;
default:
return 0x01C20800;
}
}

static uint32_t spi_base(feldev_handle *dev)
{
soc_info_t *soc_info = dev->soc_info;
switch (soc_info->soc_id) {
case 0x1623: /* A10 */
case 0x1625: /* A13 */
case 0x1651: /* A20 */
case 0x1701: /* R40 */
case 0x1663: /* F1C100s/F1C600/R6/F1C100A/F1C500 */
return 0x01C05000;
case 0x1817: /* V831 */
case 0x1728: /* H6 */
case 0x1823: /* H616 */
return 0x05010000;
default:
return 0x01C68000;
}
}

/*
* Configure pin function on a GPIO port
*/
static void gpio_set_cfgpin(feldev_handle *dev, int port_num, int pin_num,
int val)
{
uint32_t port_base = 0x01C20800 + port_num * 0x24;
uint32_t port_base = gpio_base(dev) + port_num * 0x24;
uint32_t cfg_reg = port_base + 4 * (pin_num / 8);
uint32_t pin_idx = pin_num % 8;
uint32_t x = readl(cfg_reg);
Expand All @@ -141,6 +181,19 @@ static bool spi_is_sun6i(feldev_handle *dev)
}
}

static bool soc_is_h6_style(feldev_handle *dev)
{
soc_info_t *soc_info = dev->soc_info;
switch (soc_info->soc_id) {
case 0x1817: /* V831 */
case 0x1728: /* H6 */
case 0x1823: /* H616 */
return true;
default:
return false;
}
}

/*
* Init the SPI0 controller and setup pins muxing.
*/
Expand All @@ -154,15 +207,6 @@ static bool spi0_init(feldev_handle *dev)
return false;
}

/*
* suniv has the SPI0 base in the same position with A10/A13/A20, but it's
* a sun6i-style SPI controller.
*/
if (!spi_is_sun6i(dev) || soc_info->soc_id == 0x1663)
spi0_base = 0x01c05000;
else
spi0_base = 0x01c68000;

/* Setup SPI0 pins muxing */
switch (soc_info->soc_id) {
case 0x1663: /* Allwinner F1C100s/F1C600/R6/F1C100A/F1C500 */
Expand All @@ -173,13 +217,16 @@ static bool spi0_init(feldev_handle *dev)
break;
case 0x1625: /* Allwinner A13 */
case 0x1680: /* Allwinner H3 */
case 0x1681: /* Allwinner V3s */
case 0x1718: /* Allwinner H5 */
gpio_set_cfgpin(dev, PC, 0, SUNXI_GPC_SPI0);
gpio_set_cfgpin(dev, PC, 1, SUNXI_GPC_SPI0);
gpio_set_cfgpin(dev, PC, 2, SUNXI_GPC_SPI0);
gpio_set_cfgpin(dev, PC, 3, SUNXI_GPC_SPI0);
break;
case 0x1623: /* Allwinner A10 */
case 0x1651: /* Allwinner A20 */
case 0x1701: /* Allwinner R40 */
gpio_set_cfgpin(dev, PC, 0, SUNXI_GPC_SPI0);
gpio_set_cfgpin(dev, PC, 1, SUNXI_GPC_SPI0);
gpio_set_cfgpin(dev, PC, 2, SUNXI_GPC_SPI0);
Expand All @@ -191,27 +238,58 @@ static bool spi0_init(feldev_handle *dev)
gpio_set_cfgpin(dev, PC, 2, SUN50I_GPC_SPI0);
gpio_set_cfgpin(dev, PC, 3, SUN50I_GPC_SPI0);
break;
case 0x1817: /* Allwinner V831 */
gpio_set_cfgpin(dev, PC, 1, SUN50I_GPC_SPI0); /* SPI0-CS */
/* fall-through */
case 0x1728: /* Allwinner H6 */
gpio_set_cfgpin(dev, PC, 0, SUN50I_GPC_SPI0);
gpio_set_cfgpin(dev, PC, 2, SUN50I_GPC_SPI0);
gpio_set_cfgpin(dev, PC, 3, SUN50I_GPC_SPI0);
/* PC5 is SPI0-CS on the H6, and SPI0-HOLD on the V831 */
gpio_set_cfgpin(dev, PC, 5, SUN50I_GPC_SPI0);
break;
case 0x1823: /* Allwinner H616 */
gpio_set_cfgpin(dev, PC, 0, SUN50I_GPC_SPI0); /* SPI0_CLK */
gpio_set_cfgpin(dev, PC, 2, SUN50I_GPC_SPI0); /* SPI0_MOSI */
gpio_set_cfgpin(dev, PC, 3, SUN50I_GPC_SPI0); /* SPI0_CS0 */
gpio_set_cfgpin(dev, PC, 4, SUN50I_GPC_SPI0); /* SPI0_MISO */
break;
default: /* Unknown/Unsupported SoC */
printf("SPI support not implemented yet for %x (%s)!\n",
soc_info->soc_id, soc_info->name);
return false;
}

reg_val = readl(CCM_AHB_GATING0);
reg_val |= CCM_AHB_GATE_SPI0;
writel(reg_val, CCM_AHB_GATING0);
if (soc_is_h6_style(dev)) {
reg_val = readl(H6_CCM_SPI_BGR);
reg_val |= H6_CCM_SPI0_GATE_RESET;
writel(reg_val, H6_CCM_SPI_BGR);
} else {
if (spi_is_sun6i(dev)) {
/* Deassert SPI0 reset */
reg_val = readl(SUN6I_BUS_SOFT_RST_REG0);
reg_val |= SUN6I_SPI0_RST;
writel(reg_val, SUN6I_BUS_SOFT_RST_REG0);
}

reg_val = readl(CCM_AHB_GATING0);
reg_val |= CCM_AHB_GATE_SPI0;
writel(reg_val, CCM_AHB_GATING0);
}

/* divide by 4 */
writel(CCM_SPI0_CLK_DIV_BY_4, spi_is_sun6i(dev) ? SUN6I_SPI0_CCTL :
SUN4I_SPI0_CCTL);
/* Choose 24MHz from OSC24M and enable clock */
writel(1U << 31, soc_is_h6_style(dev) ? H6_CCM_SPI0_CLK : CCM_SPI0_CLK);

if (spi_is_sun6i(dev)) {
/* Deassert SPI0 reset */
reg_val = readl(SUN6I_BUS_SOFT_RST_REG0);
reg_val |= SUN6I_SPI0_RST;
writel(reg_val, SUN6I_BUS_SOFT_RST_REG0);
/* Enable SPI in the master mode and do a soft reset */
reg_val = readl(SUN6I_SPI0_GCR);
reg_val |= (1 << 31) | 3;
reg_val |= (1U << 31) | 3;
writel(reg_val, SUN6I_SPI0_GCR);
/* Wait for completion */
while (readl(SUN6I_SPI0_GCR) & (1 << 31)) {}
while (readl(SUN6I_SPI0_GCR) & (1U << 31)) {}
} else {
reg_val = readl(SUN4I_SPI0_CTL);
reg_val |= SUN4I_CTL_MASTER;
Expand Down Expand Up @@ -504,13 +582,16 @@ void aw_fel_spiflash_info(feldev_handle *dev)
case 0xC2:
manufacturer = "Macronix";
break;
case 0x1C:
manufacturer = "Eon";
break;
default:
manufacturer = "Unknown";
break;
}

printf("Manufacturer: %s (%02Xh), model: %02Xh, size: %d bytes.\n",
manufacturer, buf[3], buf[4], (1 << buf[5]));
manufacturer, buf[3], buf[4], (1U << buf[5]));
}

/*
Expand Down
Loading