mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet
       [not found] <[RFC][PATCH] archosg9: add support for tablet>
@ 2012-09-25 22:59 ` vj
  2012-09-25 22:59   ` [PATCH 1/7] Improved an error message and solved a minor bug vj
                     ` (9 more replies)
  0 siblings, 10 replies; 17+ messages in thread
From: vj @ 2012-09-25 22:59 UTC (permalink / raw)
  To: barebox; +Cc: vj

Hello,
A this is my first contribution, so I'm basically requesting for comments.

The attached patch adds support for Archos G9 tablet wich uses an OMAP4460 cpu.
The tablet by default only boots from internal flash, so to test barebox on it a hardware tweak is required: change the sys_boot configuration.
Once done the tablet can be booted with the following command:
A sudo scripts/usbboot <first_stage> <rootfs>

The patch contains
A 1.- specific changes for OMAP4460
A 2.- support for usb-booting
A 3.- support for console on usb
A 4.- support for file transfer through usb
A 5.- some minor bug fixes
A 6.- adds support for archosg9 board

A question I have is what does omap_vector_init do?
It breaks usb-booting.
An improvement to be done would be to split the file "scripts/usbboot.c" into a header and two c files, but the Makefile framework seemed to me to do not allow that.

In any case the patch should be tested with other boards to check it does not breaks something.

vj (7):
  Improved an error message and solved a minor bug
  added debug info for twl6030
  OMAP specific changes
  Add USB booting capabilities to OMAP
  add console support over the same USB used for booting
  add filesystem support over the same USB used for booting
  Add support for Archos G9 tablet

 arch/arm/Makefile                               |   1 +
 arch/arm/boards/archosg9/Makefile               |   1 +
 arch/arm/boards/archosg9/board.c                |  58 ++
 arch/arm/boards/archosg9/env/bin/init           |  18 +
 arch/arm/boards/archosg9/env/config             |   2 +
 arch/arm/boards/archosg9/lowlevel.c             | 126 ++++
 arch/arm/boards/archosg9/mux.c                  | 226 +++++++
 arch/arm/configs/archosg9_defconfig             |  70 +++
 arch/arm/configs/archosg9_xload_defconfig       |  25 +
 arch/arm/cpu/cpu.c                              |   1 +
 arch/arm/lib/armlinux.c                         |   2 +-
 arch/arm/lib/barebox.lds.S                      |  10 +
 arch/arm/mach-omap/Kconfig                      |  30 +
 arch/arm/mach-omap/Makefile                     |   1 +
 arch/arm/mach-omap/include/mach/omap4-mux.h     |  80 ++-
 arch/arm/mach-omap/include/mach/omap4-silicon.h |  13 +
 arch/arm/mach-omap/include/mach/omap4_rom_usb.h | 146 +++++
 arch/arm/mach-omap/include/mach/xload.h         |   1 +
 arch/arm/mach-omap/omap4_generic.c              |   6 +
 arch/arm/mach-omap/omap4_rom_usb.c              | 189 ++++++
 arch/arm/mach-omap/xload.c                      |  26 +
 arch/arm/tools/mach-types                       |   1 +
 drivers/mci/omap_hsmmc.c                        |   2 +-
 drivers/mfd/twl6030.c                           |  13 +
 drivers/serial/Kconfig                          |   7 +
 drivers/serial/Makefile                         |   1 +
 drivers/serial/serial_usb.c                     |  64 ++
 fs/Kconfig                                      |   5 +
 fs/Makefile                                     |   1 +
 fs/usbbootfs.c                                  | 195 ++++++
 include/mfd/twl6030.h                           |   8 +
 scripts/.gitignore                              |   1 +
 scripts/Makefile                                |   3 +
 scripts/usbboot.c                               | 797 ++++++++++++++++++++++++
 34 files changed, 2100 insertions(+), 30 deletions(-)
 create mode 100644 arch/arm/boards/archosg9/Makefile
 create mode 100644 arch/arm/boards/archosg9/board.c
 create mode 100644 arch/arm/boards/archosg9/env/bin/init
 create mode 100644 arch/arm/boards/archosg9/env/config
 create mode 100644 arch/arm/boards/archosg9/lowlevel.c
 create mode 100644 arch/arm/boards/archosg9/mux.c
 create mode 100644 arch/arm/configs/archosg9_defconfig
 create mode 100644 arch/arm/configs/archosg9_xload_defconfig
 create mode 100644 arch/arm/mach-omap/include/mach/omap4_rom_usb.h
 create mode 100644 arch/arm/mach-omap/omap4_rom_usb.c
 create mode 100644 drivers/serial/serial_usb.c
 create mode 100644 fs/usbbootfs.c
 create mode 100644 scripts/usbboot.c

-- 
1.7.12.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 1/7] Improved an error message and solved a minor bug
  2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
@ 2012-09-25 22:59   ` vj
  2012-09-26  7:11     ` Sascha Hauer
  2012-09-25 22:59   ` [PATCH 2/7] added debug info for twl6030 vj
                     ` (8 subsequent siblings)
  9 siblings, 1 reply; 17+ messages in thread
From: vj @ 2012-09-25 22:59 UTC (permalink / raw)
  To: barebox; +Cc: vj

---
 arch/arm/lib/armlinux.c  | 2 +-
 drivers/mci/omap_hsmmc.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c
index 191274e..74d59a9 100644
--- a/arch/arm/lib/armlinux.c
+++ b/arch/arm/lib/armlinux.c
@@ -80,7 +80,7 @@ void armlinux_set_revision(unsigned int rev)
 #ifdef CONFIG_ENVIRONMENT_VARIABLES
 	export_env_ull("armlinux_system_rev", rev);
 #else
-	return armlinux_system_rev;
+	armlinux_system_rev = rev;
 #endif
 }
 
diff --git a/drivers/mci/omap_hsmmc.c b/drivers/mci/omap_hsmmc.c
index e0b245b..e6f4e47 100644
--- a/drivers/mci/omap_hsmmc.c
+++ b/drivers/mci/omap_hsmmc.c
@@ -238,7 +238,7 @@ static int mmc_init_setup(struct mci_host *mci, struct device_d *dev)
 	start = get_time_ns();
 	while ((readl(&mmc_base->sysstatus) & RESETDONE) == 0) {
 		if (is_timeout(start, SECOND)) {
-			dev_dbg(hsmmc->dev, "timedout waiting for cc2!\n");
+			dev_dbg(hsmmc->dev, "timeout waiting for reset done\n");
 			return -ETIMEDOUT;
 		}
 	}
-- 
1.7.12.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 2/7] added debug info for twl6030
  2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
  2012-09-25 22:59   ` [PATCH 1/7] Improved an error message and solved a minor bug vj
@ 2012-09-25 22:59   ` vj
  2012-09-25 22:59   ` [PATCH 3/7] OMAP specific changes vj
                     ` (7 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: vj @ 2012-09-25 22:59 UTC (permalink / raw)
  To: barebox; +Cc: vj

---
 drivers/mfd/twl6030.c | 13 +++++++++++++
 include/mfd/twl6030.h |  8 ++++++++
 2 files changed, 21 insertions(+)

diff --git a/drivers/mfd/twl6030.c b/drivers/mfd/twl6030.c
index 7ecfed8..a2d16a1 100644
--- a/drivers/mfd/twl6030.c
+++ b/drivers/mfd/twl6030.c
@@ -39,6 +39,19 @@ static int twl_probe(struct device_d *dev)
 
 	devfs_create(&(twl_dev->core.cdev));
 
+#ifdef DEBUG
+    {
+        u8 i, jtag_rev, eprom_rev;
+        int r;
+        u64 dieid;
+        r =twl6030_reg_read(twl_dev, TWL6030_JTAG_JTAGVERNUM, &jtag_rev );
+        r|=twl6030_reg_read(twl_dev, TWL6030_JTAG_EPROM_REV , &eprom_rev);
+        for(i=0; i<8; i++) r|=twl6030_reg_read(twl_dev, TWL6030_DIEID_0+i, ((u8*)(&dieid))+i);
+        if(r) debug("TWL6030 Error reading ID\n");
+        else  debug("TWL6030 JTAG REV: 0x%02X, EPROM REV: 0x%02X DIE ID: 0x%016llX\n", (unsigned)jtag_rev, (unsigned)eprom_rev, dieid);
+    }
+#endif
+
 	return 0;
 }
 
diff --git a/include/mfd/twl6030.h b/include/mfd/twl6030.h
index f1278d4..bb4f773 100644
--- a/include/mfd/twl6030.h
+++ b/include/mfd/twl6030.h
@@ -371,6 +371,14 @@ enum twl6030_reg {
 	/* JTAG */
 	TWL6030_JTAG_JTAGVERNUM = 0x0287,
 	TWL6030_JTAG_EPROM_REV = 0x02DF,
+	TWL6030_DIEID_0 = 0x02C0,
+	TWL6030_DIEID_1 = 0x02C1,
+	TWL6030_DIEID_2 = 0x02C2,
+	TWL6030_DIEID_3 = 0x02C3,
+	TWL6030_DIEID_4 = 0x02C4,
+	TWL6030_DIEID_5 = 0x02C5,
+	TWL6030_DIEID_6 = 0x02C6,
+	TWL6030_DIEID_7 = 0x02C7,
 	/* GPADC Trimming */
 	TWL6030_GPADC_TRIM1 = 0x02CD,
 	TWL6030_GPADC_TRIM2 = 0x02CE,
-- 
1.7.12.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 3/7] OMAP specific changes
  2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
  2012-09-25 22:59   ` [PATCH 1/7] Improved an error message and solved a minor bug vj
  2012-09-25 22:59   ` [PATCH 2/7] added debug info for twl6030 vj
@ 2012-09-25 22:59   ` vj
  2012-09-26  7:18     ` Sascha Hauer
  2012-09-25 22:59   ` [PATCH 4/7] Add USB booting capabilities to OMAP vj
                     ` (6 subsequent siblings)
  9 siblings, 1 reply; 17+ messages in thread
From: vj @ 2012-09-25 22:59 UTC (permalink / raw)
  To: barebox; +Cc: vj

mux:
  added definitions with the same names as in the datasheet
  added two new definitions
  changed PAD definitions to have the same names in the datasheet
  changed value for jtag_tck to match the one on the datasheet
added base addresses and usb bootsrc
---
 arch/arm/mach-omap/include/mach/omap4-mux.h     | 80 ++++++++++++++++---------
 arch/arm/mach-omap/include/mach/omap4-silicon.h | 13 ++++
 arch/arm/mach-omap/include/mach/xload.h         |  1 +
 arch/arm/mach-omap/omap4_generic.c              |  4 ++
 4 files changed, 70 insertions(+), 28 deletions(-)

diff --git a/arch/arm/mach-omap/include/mach/omap4-mux.h b/arch/arm/mach-omap/include/mach/omap4-mux.h
index d06beaa..4938f1b 100644
--- a/arch/arm/mach-omap/include/mach/omap4-mux.h
+++ b/arch/arm/mach-omap/include/mach/omap4-mux.h
@@ -36,6 +36,7 @@ struct pad_conf_entry {
 
 } __attribute__ ((packed));
 
+#define WAKEUP_EN       (1 << 14)
 #ifdef CONFIG_OFF_PADCONF
 #define OFF_PD          (1 << 12)
 #define OFF_PU          (3 << 12)
@@ -127,14 +128,23 @@ struct pad_conf_entry {
 #define GPMC_WAIT0		0x008A
 #define GPMC_WAIT1		0x008C
 #define C2C_DATA11		0x008E
+#define GPMC_WAIT2		0x008E
 #define C2C_DATA12		0x0090
+#define GPMC_NCS4		0x0090
 #define C2C_DATA13		0x0092
+#define GPMC_NCS5		0x0092
 #define C2C_DATA14		0x0094
+#define GPMC_NCS6		0x0094
 #define C2C_DATA15		0x0096
+#define GPMC_NCS7		0x0096
 #define HDMI_HPD		0x0098
+#define GPIO63			0x0098
 #define HDMI_CEC		0x009A
+#define GPIO64			0x009A
 #define HDMI_DDC_SCL		0x009C
+#define GPIO65			0x009C
 #define HDMI_DDC_SDA		0x009E
+#define GPIO66			0x009E
 #define CSI21_DX0		0x00A0
 #define CSI21_DY0		0x00A2
 #define CSI21_DX1		0x00A4
@@ -246,17 +256,29 @@ struct pad_conf_entry {
 #define USBB2_HSIC_DATA		0x0178
 #define USBB2_HSIC_STROBE	0x017A
 #define UNIPRO_TX0		0x017C
+#define KPD_COL3		0x017C
 #define UNIPRO_TY0		0x017E
+#define KPD_COL4		0x017E
 #define UNIPRO_TX1		0x0180
+#define KPD_COL5		0x0180
 #define UNIPRO_TY1		0x0182
+#define KPD_COL0		0x0182
 #define UNIPRO_TX2		0x0184
+#define KPD_COL1		0x0184
 #define UNIPRO_TY2		0x0186
+#define KPD_COL2		0x0186
 #define UNIPRO_RX0		0x0188
+#define KPD_ROW3		0x0188
 #define UNIPRO_RY0		0x018A
+#define KPD_ROW4		0x018A
 #define UNIPRO_RX1		0x018C
+#define KPD_ROW5		0x018C
 #define UNIPRO_RY1		0x018E
+#define KPD_ROW0		0x018E
 #define UNIPRO_RX2		0x0190
+#define KPD_ROW1		0x0190
 #define UNIPRO_RY2		0x0192
+#define KPD_ROW2		0x0192
 #define USBA0_OTG_CE		0x0194
 #define USBA0_OTG_DP		0x0196
 #define USBA0_OTG_DM		0x0198
@@ -290,6 +312,8 @@ struct pad_conf_entry {
 #define DPM_EMU17		0x01D0
 #define DPM_EMU18		0x01D2
 #define DPM_EMU19		0x01D4
+#define CSI22_DX2		0x01D6
+#define CSI22_DY2		0x01F4
 #define WAKEUPEVENT_0		0x01D8
 #define WAKEUPEVENT_1		0x01DC
 #define WAKEUPEVENT_2		0x01E0
@@ -301,34 +325,34 @@ struct pad_conf_entry {
 #define WKUP_REVISION		0x0000
 #define WKUP_HWINFO		0x0004
 #define WKUP_SYSCONFIG		0x0010
-#define PAD0_SIM_IO		0x0040
-#define PAD1_SIM_CLK		0x0042
-#define PAD0_SIM_RESET		0x0044
-#define PAD1_SIM_CD		0x0046
-#define PAD0_SIM_PWRCTRL		0x0048
-#define PAD1_SR_SCL		0x004A
-#define PAD0_SR_SDA		0x004C
-#define PAD1_FREF_XTAL_IN		0x004E
-#define PAD0_FREF_SLICER_IN	0x0050
-#define PAD1_FREF_CLK_IOREQ	0x0052
-#define PAD0_FREF_CLK0_OUT		0x0054
-#define PAD1_FREF_CLK3_REQ		0x0056
-#define PAD0_FREF_CLK3_OUT		0x0058
-#define PAD1_FREF_CLK4_REQ		0x005A
-#define PAD0_FREF_CLK4_OUT		0x005C
-#define PAD1_SYS_32K		0x005E
-#define PAD0_SYS_NRESPWRON		0x0060
-#define PAD1_SYS_NRESWARM		0x0062
-#define PAD0_SYS_PWR_REQ		0x0064
-#define PAD1_SYS_PWRON_RESET	0x0066
-#define PAD0_SYS_BOOT6		0x0068
-#define PAD1_SYS_BOOT7		0x006A
-#define PAD0_JTAG_NTRST		0x006C
-#define PAD1_JTAG_TCK		0x006D
-#define PAD0_JTAG_RTCK		0x0070
-#define PAD1_JTAG_TMS_TMSC		0x0072
-#define PAD0_JTAG_TDI		0x0074
-#define PAD1_JTAG_TDO		0x0076
+#define GPIO_WK0		0x0040
+#define GPIO_WK1		0x0042
+#define GPIO_WK2		0x0044
+#define GPIO_WK3		0x0046
+#define GPIO_WK4		0x0048
+#define SR_SCL			0x004A
+#define SR_SDA			0x004C
+#define FREF_XTAL_IN		0x004E
+#define FREF_SLICER_IN		0x0050
+#define FREF_CLK_IOREQ		0x0052
+#define FREF_CLK0_OUT		0x0054
+#define FREF_CLK3_REQ		0x0056
+#define FREF_CLK3_OUT		0x0058
+#define FREF_CLK4_REQ		0x005A
+#define FREF_CLK4_OUT		0x005C
+#define SYS_32K		0x005E
+#define SYS_NRESPWRON		0x0060
+#define SYS_NRESWARM		0x0062
+#define SYS_PWR_REQ		0x0064
+#define SYS_PWRON_RESET_OUT	0x0066
+#define SYS_BOOT6		0x0068
+#define SYS_BOOT7		0x006A
+#define JTAG_NTRST		0x006C
+#define JTAG_TCK		0x006E
+#define JTAG_RTCK		0x0070
+#define JTAG_TMS_TMSC		0x0072
+#define JTAG_TDI		0x0074
+#define JTAG_TDO		0x0076
 #define PADCONF_WAKEUPEVENT_0	0x007C
 #define CONTROL_SMART1NOPMIO_PADCONF_0		0x05A0
 #define CONTROL_SMART1NOPMIO_PADCONF_1		0x05A4
diff --git a/arch/arm/mach-omap/include/mach/omap4-silicon.h b/arch/arm/mach-omap/include/mach/omap4-silicon.h
index 4082bac..a6b3f2b 100644
--- a/arch/arm/mach-omap/include/mach/omap4-silicon.h
+++ b/arch/arm/mach-omap/include/mach/omap4-silicon.h
@@ -76,6 +76,12 @@
 #define OMAP44XX_UART2_BASE		(OMAP44XX_L4_PER_BASE + 0x6c000)
 #define OMAP44XX_UART3_BASE		(OMAP44XX_L4_PER_BASE + 0x20000)
 
+/* I2C */
+#define OMAP44XX_I2C1_BASE		(OMAP44XX_L4_PER_BASE + 0x070000)
+#define OMAP44XX_I2C2_BASE		(OMAP44XX_L4_PER_BASE + 0x072000)
+#define OMAP44XX_I2C3_BASE		(OMAP44XX_L4_PER_BASE + 0x060000)
+#define OMAP44XX_I2C4_BASE		(OMAP44XX_L4_PER_BASE + 0x350000)
+
 /* General Purpose Timers */
 #define OMAP44XX_GPT1_BASE		(OMAP44XX_L4_WKUP_BASE + 0x18000)
 #define OMAP44XX_GPT2_BASE		(OMAP44XX_L4_PER_BASE  + 0x32000)
@@ -92,6 +98,13 @@
 /* 32KTIMER */
 #define OMAP_32KTIMER_BASE		(OMAP44XX_L4_WKUP_BASE + 0x4000)
 
+/* MMC */
+#define OMAP44XX_MMC1_BASE		(OMAP44XX_L4_PER_BASE + 0x09C100)
+#define OMAP44XX_MMC2_BASE		(OMAP44XX_L4_PER_BASE + 0x0B4100)
+#define OMAP44XX_MMC3_BASE		(OMAP44XX_L4_PER_BASE + 0x0AD100)
+#define OMAP44XX_MMC4_BASE		(OMAP44XX_L4_PER_BASE + 0x0D1100)
+#define OMAP44XX_MMC5_BASE		(OMAP44XX_L4_PER_BASE + 0x0D5100)
+
 /* GPMC */
 #define OMAP_GPMC_BASE		0x50000000
 
diff --git a/arch/arm/mach-omap/include/mach/xload.h b/arch/arm/mach-omap/include/mach/xload.h
index 844b57f..cfc3f68 100644
--- a/arch/arm/mach-omap/include/mach/xload.h
+++ b/arch/arm/mach-omap/include/mach/xload.h
@@ -8,6 +8,7 @@ enum omap_boot_src {
 	OMAP_BOOTSRC_UNKNOWN,
 	OMAP_BOOTSRC_MMC1,
 	OMAP_BOOTSRC_NAND,
+	OMAP_BOOTSRC_USB1,
 };
 
 enum omap_boot_src omap3_bootsrc(void);
diff --git a/arch/arm/mach-omap/omap4_generic.c b/arch/arm/mach-omap/omap4_generic.c
index 617d786..55d8fe3 100644
--- a/arch/arm/mach-omap/omap4_generic.c
+++ b/arch/arm/mach-omap/omap4_generic.c
@@ -481,6 +481,10 @@ enum omap_boot_src omap4_bootsrc(void)
 		return OMAP_BOOTSRC_MMC1;
 	if (bootsrc & (1 << 3))
 		return OMAP_BOOTSRC_NAND;
+#ifdef CONFIG_USB_BOOT
+	if (bootsrc & (1<<20))
+		return OMAP_BOOTSRC_USB1;
+#endif
 	return OMAP_BOOTSRC_UNKNOWN;
 }
 
-- 
1.7.12.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 4/7] Add USB booting capabilities to OMAP
  2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
                     ` (2 preceding siblings ...)
  2012-09-25 22:59   ` [PATCH 3/7] OMAP specific changes vj
@ 2012-09-25 22:59   ` vj
  2012-09-26  7:45     ` Sascha Hauer
  2012-09-25 22:59   ` [PATCH 5/7] add console support over the same USB used for booting vj
                     ` (5 subsequent siblings)
  9 siblings, 1 reply; 17+ messages in thread
From: vj @ 2012-09-25 22:59 UTC (permalink / raw)
  To: barebox; +Cc: vj

---
 arch/arm/cpu/cpu.c                              |   1 +
 arch/arm/lib/barebox.lds.S                      |  10 +
 arch/arm/mach-omap/Kconfig                      |  21 +
 arch/arm/mach-omap/Makefile                     |   1 +
 arch/arm/mach-omap/include/mach/omap4_rom_usb.h | 146 +++++
 arch/arm/mach-omap/omap4_generic.c              |   2 +
 arch/arm/mach-omap/omap4_rom_usb.c              | 189 ++++++
 arch/arm/mach-omap/xload.c                      |  26 +
 scripts/.gitignore                              |   1 +
 scripts/Makefile                                |   3 +
 scripts/usbboot.c                               | 797 ++++++++++++++++++++++++
 11 files changed, 1197 insertions(+)
 create mode 100644 arch/arm/mach-omap/include/mach/omap4_rom_usb.h
 create mode 100644 arch/arm/mach-omap/omap4_rom_usb.c
 create mode 100644 scripts/usbboot.c

diff --git a/arch/arm/cpu/cpu.c b/arch/arm/cpu/cpu.c
index 71ef8c0..05343de 100644
--- a/arch/arm/cpu/cpu.c
+++ b/arch/arm/cpu/cpu.c
@@ -89,6 +89,7 @@ void arch_shutdown(void)
 		: "r0", "r1", "r2", "r3", "r6", "r10", "r12", "lr", "cc", "memory"
 	);
 #endif
+	__asm__ __volatile__ ("cpsid i\n");
 }
 
 #ifdef CONFIG_THUMB2_BAREBOX
diff --git a/arch/arm/lib/barebox.lds.S b/arch/arm/lib/barebox.lds.S
index a69013f..ff7b63d 100644
--- a/arch/arm/lib/barebox.lds.S
+++ b/arch/arm/lib/barebox.lds.S
@@ -97,6 +97,16 @@ SECTIONS
 	__bss_start = .;
 	.bss : { *(.bss*) }
 	__bss_stop = .;
+#ifdef CONFIG_SHARE_USB_HANDLE
+    /*
+     * Reserve space for the USB handle
+     */
+	. = CONFIG_USB_HANDLE_HANDOVER;
+	. = ALIGN(4);
+	__usb_handle = .;
+	/* . += sizeof(struct usb); */
+	. += 84;
+#endif
 	_end = .;
 	_barebox_image_size = __bss_start - TEXT_BASE;
 }
diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig
index d735284..8e0a0b3 100644
--- a/arch/arm/mach-omap/Kconfig
+++ b/arch/arm/mach-omap/Kconfig
@@ -96,6 +96,27 @@ config ARCH_TEXT_BASE
 	default 0x80e80000 if MACH_OMAP343xSDP
 	default 0x80e80000 if MACH_BEAGLE
 
+config USB_BOOT
+	bool "enable booting from USB"
+	default n
+	depends on ARCH_OMAP4
+	help
+	  Enable this to have USB booting
+
+config SHARE_USB_HANDLE
+	bool "share the usb handle"
+	default n
+	depends on USB_BOOT
+	help
+	  Enable this to share the usb handle between the xloader and the second stage bootloader.
+
+config USB_HANDLE_HANDOVER
+	hex "address where to put the usb handle"
+	default  0x4030BFAC
+	depends on SHARE_USB_HANDLE
+	help
+	  The Address where barebox will put the usb handle to be used in the second stage.
+
 config BOARDINFO
 	default "Texas Instrument's SDP343x" if MACH_OMAP343xSDP
 	default "Texas Instrument's Beagle" if MACH_BEAGLE
diff --git a/arch/arm/mach-omap/Makefile b/arch/arm/mach-omap/Makefile
index f087f4b..8b35333 100644
--- a/arch/arm/mach-omap/Makefile
+++ b/arch/arm/mach-omap/Makefile
@@ -30,4 +30,5 @@ obj-$(CONFIG_OMAP3_CLOCK_CONFIG) += omap3_clock.o
 obj-$(CONFIG_OMAP_GPMC) += gpmc.o devices-gpmc-nand.o
 obj-$(CONFIG_SHELL_NONE) += xload.o
 obj-$(CONFIG_I2C_TWL6030) += omap4_twl6030_mmc.o
+obj-$(CONFIG_USB_BOOT) += omap4_rom_usb.o
 obj-y += gpio.o
diff --git a/arch/arm/mach-omap/include/mach/omap4_rom_usb.h b/arch/arm/mach-omap/include/mach/omap4_rom_usb.h
new file mode 100644
index 0000000..5866a21
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/omap4_rom_usb.h
@@ -0,0 +1,146 @@
+/*
+ * This code is based on:
+ * git://github.com/swetland/omap4boot.git
+ */
+
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _OMAP4_ROM_USB_H_
+#define _OMAP4_ROM_USB_H_
+
+/* public api */
+#define PUBLIC_API_BASE_4430		(0x28400)
+#define PUBLIC_API_BASE_4460		(0x30400)
+
+#define PUBLIC_GET_DRIVER_MEM_OFFSET (0x04)
+#define PUBLIC_GET_DRIVER_PER_OFFSET (0x08)
+#define PUBLIC_GET_DEVICE_MEM_OFFSET (0x80)
+#define PUBLIC_GET_DEVICE_PER_OFFSET (0x84)
+
+#define DEVICE_NULL	0x40
+#define DEVICE_UART1	0x41
+#define DEVICE_UART2	0x42
+#define DEVICE_UART3	0x43
+#define DEVICE_UART4	0x44
+#define DEVICE_USB	0x45
+#define DEVICE_USBEXT	0x46
+
+#define XFER_MODE_CPU 0
+#define XFER_MODE_DMA 1
+
+#define STATUS_OKAY		0
+#define STATUS_FAILED		1
+#define STATUS_TIMEOUT		2
+#define STATUS_BAD_PARAM	3
+#define STATUS_WAITING		4
+#define STATUS_NO_MEMORY	5
+#define STATUS_INVALID_PTR	6
+
+/* Memory ROM interface */
+struct read_desc {
+	u32 sector_start;
+	u32 sector_count;
+	void *destination;
+};
+
+struct mem_device {
+	u32 initialized;
+	u8 device_type;
+	u8 trials_count;
+	u32 xip_device;
+	u16 search_size;
+	u32 base_address;
+	u16 hs_toc_mask;
+	u16 gp_toc_mask;
+	void *device_data;
+	u16 *boot_options;
+};
+
+struct mem_driver {
+	int (*init)(struct mem_device *md);
+	int (*read)(struct mem_device *md, struct read_desc *rd);
+	int (*configure)(struct mem_device *md, void *config);
+};
+
+
+/* Peripheral ROM interface */
+struct per_handle {
+	void *set_to_null;
+	void (*callback)(struct per_handle *rh);
+	void *data;
+	u32 length;
+	u16 *options;
+	u32 xfer_mode;
+	u32 device_type;
+	volatile u32 status;
+	u16 hs_toc_mask;
+	u16 gp_toc_mask;
+	u32 config_timeout;
+};
+
+struct per_driver {
+	int (*init)(struct per_handle *rh);
+	int (*read)(struct per_handle *rh);
+	int (*write)(struct per_handle *rh);
+	int (*close)(struct per_handle *rh);
+	int (*config)(struct per_handle *rh, void *x);
+};
+
+#define USB_SETCONFIGDESC_ATTRIBUTES      (0)
+#define USB_SETCONFIGDESC_MAXPOWER        (1)
+#define USB_SETSUSPEND_CALLBACK           (2)
+struct per_usb_config {
+	u32 configid;
+	u32 value;
+};
+
+#define API(n) ( (void*) (*((u32 *) (n))) )
+/* ROM API End */
+
+struct usb {
+	struct per_handle dread;
+	struct per_handle dwrite;
+	struct per_driver *io;
+};
+extern struct usb *pusb;
+
+int usb_open(void);
+void usb_close(void);
+
+void usb_queue_read(void *data, unsigned len);
+int usb_wait_read(void);
+
+void usb_queue_write(void *data, unsigned len);
+int usb_wait_write(void);
+
+int usb_read(void *data, unsigned len);
+int usb_write(void *data, unsigned len);
+void usb_puts(const char *s);
+
+#endif
diff --git a/arch/arm/mach-omap/omap4_generic.c b/arch/arm/mach-omap/omap4_generic.c
index 55d8fe3..3e00d9f 100644
--- a/arch/arm/mach-omap/omap4_generic.c
+++ b/arch/arm/mach-omap/omap4_generic.c
@@ -457,6 +457,7 @@ static int watchdog_init(void)
 }
 late_initcall(watchdog_init);
 
+#ifndef CONFIG_USB_BOOT
 static int omap_vector_init(void)
 {
 	__asm__ __volatile__ (
@@ -470,6 +471,7 @@ static int omap_vector_init(void)
 	return 0;
 }
 core_initcall(omap_vector_init);
+#endif
 
 #define OMAP4_TRACING_VECTOR3 0x4030d048
 
diff --git a/arch/arm/mach-omap/omap4_rom_usb.c b/arch/arm/mach-omap/omap4_rom_usb.c
new file mode 100644
index 0000000..c328570
--- /dev/null
+++ b/arch/arm/mach-omap/omap4_rom_usb.c
@@ -0,0 +1,189 @@
+/*
+ * This code is based on:
+ * git://github.com/swetland/omap4boot.git
+ */
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <common.h>
+#include <mach/omap4-silicon.h>
+#include <mach/omap4_rom_usb.h>
+
+struct usb *pusb;
+
+int usb_open(void)
+{
+#ifdef CONFIG_OMAP_BUILD_IFT
+	int (*rom_get_per_driver)(struct per_driver **io, u32 device_type);
+	int (*rom_get_per_device)(struct per_handle **rh);
+	struct per_handle *boot;
+	int n;
+	u32 base;
+
+#ifdef CONFIG_SHARE_USB_HANDLE
+	pusb = (struct usb *)CONFIG_USB_HANDLE_HANDOVER;
+	memset(pusb, 0, sizeof(*pusb));
+#else
+	pusb = xzalloc(sizeof(struct usb));
+#endif
+
+	if (omap4_revision() >= OMAP4460_ES1_0)
+		base = PUBLIC_API_BASE_4460;
+	else
+		base = PUBLIC_API_BASE_4430;
+
+	rom_get_per_driver = API(base + PUBLIC_GET_DRIVER_PER_OFFSET);
+	rom_get_per_device = API(base + PUBLIC_GET_DEVICE_PER_OFFSET);
+
+	n = rom_get_per_device(&boot);
+	if (n)
+		return n;
+
+	if ((boot->device_type != DEVICE_USB) &&
+	    (boot->device_type != DEVICE_USBEXT))
+		return -1;
+
+	n = rom_get_per_driver(&pusb->io, boot->device_type);
+	if (n)
+		return n;
+
+	pusb->dread.xfer_mode = boot->xfer_mode;
+	pusb->dread.options = boot->options;
+	pusb->dread.device_type = boot->device_type;
+
+	pusb->dwrite.xfer_mode = boot->xfer_mode;
+	pusb->dwrite.options = boot->options;
+	pusb->dwrite.device_type = boot->device_type;
+#else
+#ifdef CONFIG_MMU
+#error USB communications not working under MMU
+	pusb = (struct usb *)phys_to_virt(CONFIG_USB_HANDLE_HANDOVER);
+#else
+	pusb = (struct usb *)CONFIG_USB_HANDLE_HANDOVER;
+#endif
+#endif
+	__asm__ __volatile__ ("cpsie i\n");
+	return 0;
+}
+
+
+static void rom_read_callback(struct per_handle *rh)
+{
+
+	pusb->dread.status = rh->status;
+	return;
+}
+
+void usb_queue_read(void *data, unsigned len)
+{
+	int n;
+	pusb->dread.data = data;
+	pusb->dread.length = len;
+	pusb->dread.status = -1;
+	pusb->dread.xfer_mode = 1;
+	pusb->dread.callback = rom_read_callback;
+	n = pusb->io->read(&pusb->dread);
+	if (n)
+		pusb->dread.status = n;
+}
+
+int usb_wait_read(void)
+{
+	for (;;) {
+		if (pusb->dread.status == -1)
+			continue;
+		if (pusb->dread.status == STATUS_WAITING)
+			continue;
+		return pusb->dread.status;
+	}
+}
+
+void rom_write_callback(struct per_handle *rh)
+{
+	pusb->dwrite.status = rh->status;
+	return;
+}
+
+void usb_queue_write(void *data, unsigned len)
+{
+	int n;
+	pusb->dwrite.data = data;
+	pusb->dwrite.length = len;
+	pusb->dwrite.status = -1;
+	pusb->dwrite.xfer_mode = 1;
+	pusb->dwrite.callback = rom_write_callback;
+	n = pusb->io->write(&pusb->dwrite);
+	if (n)
+		pusb->dwrite.status = n;
+}
+
+int usb_wait_write(void)
+{
+	for (;;) {
+		if (pusb->dwrite.status == -1)
+			continue;
+		if (pusb->dwrite.status == STATUS_WAITING)
+			continue;
+		return pusb->dwrite.status;
+	}
+}
+
+#define USB_MAX_IO 65536
+int usb_read(void *data, unsigned len)
+{
+	unsigned xfer;
+	unsigned char *x = data;
+	int n;
+	while (len > 0) {
+		xfer = (len > USB_MAX_IO) ? USB_MAX_IO : len;
+		usb_queue_read(x, xfer);
+		n = usb_wait_read();
+		if (n)
+			return n;
+		x += xfer;
+		len -= xfer;
+	}
+	return 0;
+}
+
+int usb_write(void *data, unsigned len)
+{
+	usb_queue_write(data, len);
+	return usb_wait_write();
+}
+
+void usb_close(void)
+{
+	pusb->io->close(&pusb->dread);
+}
+
+void usb_puts(const char *s)
+{
+	u32 c;
+	while((c=*s++)) usb_write(&c, 4);
+}
diff --git a/arch/arm/mach-omap/xload.c b/arch/arm/mach-omap/xload.c
index 13024ab..36dfd26 100644
--- a/arch/arm/mach-omap/xload.c
+++ b/arch/arm/mach-omap/xload.c
@@ -54,6 +54,26 @@ void *omap_xload_boot_mmc(void)
 	return buf;
 }
 
+#ifdef CONFIG_USB_BOOT
+void *omap_xload_boot_usb(){
+	int ret;
+	void *buf;
+	int len;
+
+	ret = mount("usbboot", "usbbootfs", "/");
+	if (ret) {
+		printf("Unable to mount usbbootfs (%d)\n", ret);
+		return NULL;
+	}
+
+	buf = read_file("/barebox.bin", &len);
+	if (!buf)
+		printf("could not read barebox.bin from usbbootfs\n");
+
+	return buf;
+}
+#endif
+
 enum omap_boot_src omap_bootsrc(void)
 {
 #if defined(CONFIG_ARCH_OMAP3)
@@ -76,6 +96,12 @@ int run_shell(void)
 		printf("booting from MMC1\n");
 		func = omap_xload_boot_mmc();
 		break;
+#ifdef CONFIG_USB_BOOT
+	case OMAP_BOOTSRC_USB1:
+		printf("booting from USB1\n");
+		func = omap_xload_boot_usb();
+		break;
+#endif
 	case OMAP_BOOTSRC_UNKNOWN:
 		printf("unknown boot source. Fall back to nand\n");
 	case OMAP_BOOTSRC_NAND:
diff --git a/scripts/.gitignore b/scripts/.gitignore
index 6e63f85..017c81c 100644
--- a/scripts/.gitignore
+++ b/scripts/.gitignore
@@ -5,3 +5,4 @@ kallsyms
 mkimage
 mkublheader
 omap_signGP
+usbboot
diff --git a/scripts/Makefile b/scripts/Makefile
index 7ca5e29..c8f68fb 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -4,12 +4,15 @@
 # ---------------------------------------------------------------------------
 # kallsyms:      Find all symbols in barebox
 
+HOSTCFLAGS   += -lpthread
+
 hostprogs-$(CONFIG_KALLSYMS)     += kallsyms
 hostprogs-y                      += bin2c
 hostprogs-y                      += mkimage
 hostprogs-y                      += bareboxenv
 hostprogs-$(CONFIG_ARCH_NETX)    += gen_netx_image
 hostprogs-$(CONFIG_ARCH_OMAP)    += omap_signGP
+hostprogs-$(CONFIG_USB_BOOT)     += usbboot
 hostprogs-$(CONFIG_ARCH_S5PCxx)  += s5p_cksum
 hostprogs-$(CONFIG_ARCH_DAVINCI) += mkublheader
 
diff --git a/scripts/usbboot.c b/scripts/usbboot.c
new file mode 100644
index 0000000..bf43d79
--- /dev/null
+++ b/scripts/usbboot.c
@@ -0,0 +1,797 @@
+/*
+ * This code is based on:
+ * git://github.com/swetland/omap4boot.git
+ */
+
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _USB_H_
+#define _USB_H_
+
+typedef struct usb_handle usb_handle;
+
+typedef struct usb_ifc_info usb_ifc_info;
+
+struct usb_ifc_info
+{
+        /* from device descriptor */
+    unsigned short dev_vendor;
+    unsigned short dev_product;
+
+    unsigned char dev_class;
+    unsigned char dev_subclass;
+    unsigned char dev_protocol;
+
+    unsigned char ifc_class;
+    unsigned char ifc_subclass;
+    unsigned char ifc_protocol;
+
+    unsigned char has_bulk_in;
+    unsigned char has_bulk_out;
+
+    unsigned char writable;
+
+    char serial_number[256];
+};
+
+typedef int (*ifc_match_func)(usb_ifc_info *ifc);
+
+usb_handle *usb_open(ifc_match_func callback);
+int usb_close(usb_handle *h);
+int usb_read(usb_handle *h, void *_data, int len);
+int usb_write(usb_handle *h, const void *_data, int len);
+
+
+#endif
+
+
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <pthread.h>
+#include <ctype.h>
+
+#include <linux/usbdevice_fs.h>
+#include <linux/usbdevice_fs.h>
+#include <linux/version.h>
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 20)
+#include <linux/usb/ch9.h>
+#else
+#include <linux/usb_ch9.h>
+#endif
+#include <asm/byteorder.h>
+
+#define MAX_RETRIES 5
+
+#ifdef TRACE_USB
+#define DBG1(x...) fprintf(stderr, x)
+#define DBG(x...) fprintf(stderr, x)
+#else
+#define DBG(x...)
+#define DBG1(x...)
+#endif
+
+struct usb_handle
+{
+    char fname[64];
+    int desc;
+    unsigned char ep_in;
+    unsigned char ep_out;
+};
+
+static inline int badname(const char *name)
+{
+    while(*name) {
+        if(!isdigit(*name++)) return 1;
+    }
+    return 0;
+}
+
+static int check(void *_desc, int len, unsigned type, int size)
+{
+    unsigned char *desc = _desc;
+
+    if(len < size) return -1;
+    if(desc[0] < size) return -1;
+    if(desc[0] > len) return -1;
+    if(desc[1] != type) return -1;
+
+    return 0;
+}
+
+static int filter_usb_device(int fd, char *ptr, int len, int writable,
+                             ifc_match_func callback,
+                             int *ept_in_id, int *ept_out_id, int *ifc_id)
+{
+    struct usb_device_descriptor *dev;
+    struct usb_config_descriptor *cfg;
+    struct usb_interface_descriptor *ifc;
+    struct usb_endpoint_descriptor *ept;
+    struct usb_ifc_info info;
+
+    int in, out;
+    unsigned i;
+    unsigned e;
+
+    if(check(ptr, len, USB_DT_DEVICE, USB_DT_DEVICE_SIZE))
+        return -1;
+    dev = (void*) ptr;
+    len -= dev->bLength;
+    ptr += dev->bLength;
+
+    if(check(ptr, len, USB_DT_CONFIG, USB_DT_CONFIG_SIZE))
+        return -1;
+    cfg = (void*) ptr;
+    len -= cfg->bLength;
+    ptr += cfg->bLength;
+
+    info.dev_vendor = dev->idVendor;
+    info.dev_product = dev->idProduct;
+    info.dev_class = dev->bDeviceClass;
+    info.dev_subclass = dev->bDeviceSubClass;
+    info.dev_protocol = dev->bDeviceProtocol;
+    info.writable = writable;
+
+    // read device serial number (if there is one)
+    info.serial_number[0] = 0;
+    if (dev->iSerialNumber) {
+        struct usbdevfs_ctrltransfer  ctrl;
+        __u16 buffer[128];
+        int result;
+
+        memset(buffer, 0, sizeof(buffer));
+
+        ctrl.bRequestType = USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE;
+        ctrl.bRequest = USB_REQ_GET_DESCRIPTOR;
+        ctrl.wValue = (USB_DT_STRING << 8) | dev->iSerialNumber;
+        ctrl.wIndex = 0;
+        ctrl.wLength = sizeof(buffer);
+        ctrl.data = buffer;
+        ctrl.timeout = 50;
+
+        result = ioctl(fd, USBDEVFS_CONTROL, &ctrl);
+        if (result > 0) {
+            int i;
+            // skip first word, and copy the rest to the serial string, changing shorts to bytes.
+            result /= 2;
+            for (i = 1; i < result; i++)
+                info.serial_number[i - 1] = buffer[i];
+            info.serial_number[i - 1] = 0;
+        }
+    }
+
+    for(i = 0; i < cfg->bNumInterfaces; i++) {
+        if(check(ptr, len, USB_DT_INTERFACE, USB_DT_INTERFACE_SIZE))
+            return -1;
+        ifc = (void*) ptr;
+        len -= ifc->bLength;
+        ptr += ifc->bLength;
+
+        in = -1;
+        out = -1;
+        info.ifc_class = ifc->bInterfaceClass;
+        info.ifc_subclass = ifc->bInterfaceSubClass;
+        info.ifc_protocol = ifc->bInterfaceProtocol;
+
+        for(e = 0; e < ifc->bNumEndpoints; e++) {
+            if(check(ptr, len, USB_DT_ENDPOINT, USB_DT_ENDPOINT_SIZE))
+                return -1;
+            ept = (void*) ptr;
+            len -= ept->bLength;
+            ptr += ept->bLength;
+
+            if((ept->bmAttributes & 0x03) != 0x02)
+                continue;
+
+            if(ept->bEndpointAddress & 0x80) {
+                in = ept->bEndpointAddress;
+            } else {
+                out = ept->bEndpointAddress;
+            }
+        }
+
+        info.has_bulk_in = (in != -1);
+        info.has_bulk_out = (out != -1);
+
+        if(callback(&info) == 0) {
+            *ept_in_id = in;
+            *ept_out_id = out;
+            *ifc_id = ifc->bInterfaceNumber;
+            return 0;
+        }
+    }
+
+    return -1;
+}
+
+static usb_handle *find_usb_device(const char *base, ifc_match_func callback)
+{
+    usb_handle *usb = 0;
+    char busname[64], devname[64];
+    char desc[1024];
+    int n, in, out, ifc;
+
+    DIR *busdir, *devdir;
+    struct dirent *de;
+    int fd;
+    int writable;
+
+    busdir = opendir(base);
+    if(busdir == 0) return 0;
+
+    while((de = readdir(busdir)) && (usb == 0)) {
+        if(badname(de->d_name)) continue;
+
+        sprintf(busname, "%s/%s", base, de->d_name);
+        devdir = opendir(busname);
+        if(devdir == 0) continue;
+
+//        DBG("[ scanning %s ]\n", busname);
+        while((de = readdir(devdir)) && (usb == 0)) {
+
+            if(badname(de->d_name)) continue;
+            sprintf(devname, "%s/%s", busname, de->d_name);
+
+//            DBG("[ scanning %s ]\n", devname);
+            writable = 1;
+            if((fd = open(devname, O_RDWR)) < 0) {
+                // Check if we have read-only access, so we can give a helpful
+                // diagnostic like "adb devices" does.
+                writable = 0;
+                if((fd = open(devname, O_RDONLY)) < 0) {
+                    continue;
+                }
+            }
+
+            n = read(fd, desc, sizeof(desc));
+
+            if(filter_usb_device(fd, desc, n, writable, callback,
+                                 &in, &out, &ifc) == 0) {
+                usb = calloc(1, sizeof(usb_handle));
+                strcpy(usb->fname, devname);
+                usb->ep_in = in;
+                usb->ep_out = out;
+                usb->desc = fd;
+
+                n = ioctl(fd, USBDEVFS_CLAIMINTERFACE, &ifc);
+                if(n != 0) {
+                    close(fd);
+                    free(usb);
+                    usb = 0;
+                    continue;
+                }
+            } else {
+                close(fd);
+            }
+        }
+        closedir(devdir);
+    }
+    closedir(busdir);
+
+    return usb;
+}
+
+int usb_write(usb_handle *h, const void *_data, int len)
+{
+    unsigned char *data = (unsigned char*) _data;
+    unsigned count = 0;
+    struct usbdevfs_bulktransfer bulk;
+    int n;
+
+    if(h->ep_out == 0) {
+        return -1;
+    }
+
+    if(len == 0) {
+        bulk.ep = h->ep_out;
+        bulk.len = 0;
+        bulk.data = data;
+        bulk.timeout = 0;
+
+        n = ioctl(h->desc, USBDEVFS_BULK, &bulk);
+        if(n != 0) {
+            fprintf(stderr,"ERROR: n = %d, errno = %d (%s)\n",
+                    n, errno, strerror(errno));
+            return -1;
+        }
+        return 0;
+    }
+
+    while(len > 0) {
+        int xfer;
+        xfer = (len > 4096) ? 4096 : len;
+
+        bulk.ep = h->ep_out;
+        bulk.len = xfer;
+        bulk.data = data;
+        bulk.timeout = 0;
+
+        n = ioctl(h->desc, USBDEVFS_BULK, &bulk);
+        if(n != xfer) {
+            DBG("ERROR: n = %d, errno = %d (%s)\n",
+                n, errno, strerror(errno));
+            return -1;
+        }
+
+        count += xfer;
+        len -= xfer;
+        data += xfer;
+    }
+
+    return count;
+}
+
+int usb_read(usb_handle *h, void *_data, int len)
+{
+    unsigned char *data = (unsigned char*) _data;
+    unsigned count = 0;
+    struct usbdevfs_bulktransfer bulk;
+    int n, retry;
+
+    if(h->ep_in == 0) {
+        return -1;
+    }
+
+    while(len > 0) {
+        int xfer = (len > 4096) ? 4096 : len;
+
+        bulk.ep = h->ep_in;
+        bulk.len = xfer;
+        bulk.data = data;
+        bulk.timeout = 0;
+        retry = 0;
+
+        do{
+           DBG("[ usb read %d fd = %d], fname=%s\n", xfer, h->desc, h->fname);
+           n = ioctl(h->desc, USBDEVFS_BULK, &bulk);
+           DBG("[ usb read %d ] = %d, fname=%s, Retry %d \n", xfer, n, h->fname, retry);
+
+           if( n < 0 ) {
+            DBG1("ERROR: n = %d, errno = %d (%s)\n",n, errno, strerror(errno));
+            if ( ++retry > MAX_RETRIES ) return -1;
+            sleep( 1 );
+           }
+        }
+        while( n < 0 );
+
+        count += n;
+        len -= n;
+        data += n;
+
+        if(n < xfer) {
+            break;
+        }
+    }
+
+    return count;
+}
+
+void usb_kick(usb_handle *h)
+{
+    int fd;
+
+    fd = h->desc;
+    h->desc = -1;
+    if(fd >= 0) {
+        close(fd);
+        DBG("[ usb closed %d ]\n", fd);
+    }
+}
+
+int usb_close(usb_handle *h)
+{
+    int fd;
+
+    fd = h->desc;
+    h->desc = -1;
+    if(fd >= 0) {
+        close(fd);
+        DBG("[ usb closed %d ]\n", fd);
+    }
+
+    return 0;
+}
+
+usb_handle *usb_open(ifc_match_func callback)
+{
+    return find_usb_device("/dev/bus/usb", callback);
+}
+
+
+
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <stdint.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <pthread.h>
+#include <termios.h>
+
+#define USBBOOT_FS_MAGIC     0x5562464D
+#define USBBOOT_FS_CMD_OPEN  0x46530000
+#define USBBOOT_FS_CMD_CLOSE 0x46530001
+#define USBBOOT_FS_CMD_READ  0x46530002
+#define USBBOOT_FS_CMD_END   0x4653FFFF
+#define MAX_OPEN_FILES       1000
+
+#define STR_PROMPT "barebox>"
+#define STR_RESET  "reset\r\n"
+
+#define RESET  0
+#define BRIGHT 1
+#define WHITE  8
+#define RED    1
+#define BLACK  0
+#define FORMAT "%c[%d;%d;%dm"
+#define TARGET_FORMAT 0x1B,BRIGHT,RED+30,BLACK+40
+#define HOST_FORMAT   0x1B,RESET,WHITE+30,BLACK+40
+
+struct thread_vars {
+    usb_handle *usb;
+    int hide;
+};
+void *listenerTask(void *argument){
+    struct thread_vars *vars = argument;
+    int c;
+    for(;;){
+        c=getchar();
+        if(c==EOF) return NULL;
+        while(vars->hide) usleep(10000);
+        if(usb_write(vars->usb, &c, 4)!=4)
+            printf(FORMAT"could not send '%c' to target"FORMAT"\n", HOST_FORMAT, c, TARGET_FORMAT);
+        usleep(10000);
+    }
+    return NULL;
+}
+struct file_data {
+    int fd;
+    size_t size;
+    void *data;
+};
+
+int usb_boot(usb_handle *usb, void *data, unsigned sz, const char *rootfs){
+#define LINEWIDTH 16
+    const uint32_t msg_boot  = 0xF0030002;
+    const uint32_t msg_getid = 0xF0030003;
+    uint32_t msg_size = sz;
+    uint8_t id[81];
+    int i, j, k;
+    char line[LINEWIDTH*4+64];
+    char c;
+    int pr, rt, prl, rtl;
+    pthread_t thread;
+    struct thread_vars vars;
+    struct termios to, tn;
+    struct file_data fd_vector[MAX_OPEN_FILES];
+    struct stat s;
+    int fd;
+    uint32_t pos, size;
+
+    printf("reading ASIC ID\n");
+    memset(id , 0xee, sizeof(id));
+    usb_write(usb, &msg_getid, sizeof(msg_getid));
+    usb_read(usb, id, sizeof(id));
+    for(i=0; i<sizeof(id); i+=LINEWIDTH){
+        sprintf(line, "%02X: ", i);
+        for(j=0; j<LINEWIDTH && j<sizeof(id)-i; j++)
+            sprintf(line+j*3+4,"%02X ",id[i+j]);
+        line[j*3+4]='\n';
+        line[j*3+5]=0;
+        printf(line);
+    }
+
+    for(i=1, j=0; i<sizeof(id) && j<id[0]; i+=2+id[i+1], j++){
+        if(i+2+id[i+1]>sizeof(id)) printf("Truncated subblock\n");
+        else{
+            switch(id[i]){
+                case 0x01: // ID subblock
+                    if(id[i+1]!=0x05) printf("Unexpected ID subblock size\n");
+                    else{
+                        if(id[i+2]!=0x01) printf("Unexpected fixed value\n");
+                        k= (id[i+3]<<8) | id[i+4];
+                        switch(k){
+                            case 0x4440: printf("OMAP 4460 Device\n"); break;
+                            default    : printf("Unknown Device\n"); break;
+                        }
+                        switch(id[i+5]){
+                            case 0x07: printf("CH enabled (read from eFuse)\n"); break;
+                            case 0x17: printf("CH disabled (read from eFuse)\n"); break;
+                            default  : printf("Unknown CH setting\n"); break;
+                        }
+                        printf("Rom version: %hhu\n", id[i+6]);
+                    }
+                    break;
+                case 0x15: // Checksum subblock
+                    if(id[i+1]!=0x09) printf("Unexpected Checksum subblock size\n");
+                    else{
+                        if(id[i+2]!=0x01) printf("Unexpected fixed value\n");
+                        k = (id[i+3]<<24) | (id[i+4]<<16) | (id[i+5]<<8) | id[i+6];
+                        printf("Rom CRC: 0x%08X\n", k);
+                        k = (id[i+7]<<24) | (id[i+8]<<16) | (id[i+9]<<8) | id[i+10];
+                        switch(k){
+                            case  0: printf("A GP device\n"); break;
+                            default: printf("Unknown device\n"); break;
+                        }
+                    }
+                    break;
+            }
+        }
+    }
+    if(i!=sizeof(id) || j!=id[0]) printf("Unexpected ASIC ID structure size.\n");
+
+    printf("sending xload to target...\n");
+    usb_write(usb, &msg_boot, sizeof(msg_boot));
+    usb_write(usb, &msg_size, sizeof(msg_size));
+    usb_write(usb, data, sz);
+    munmap(data, msg_size);
+    for(i=0; i<MAX_OPEN_FILES; i++) fd_vector[i].fd=-1;
+
+    vars.usb=usb;
+    vars.hide=0;
+    pr=rt=0;
+    prl=strlen(STR_PROMPT);
+    rtl=strlen(STR_RESET);
+    tcgetattr(STDIN_FILENO, &to);
+    tn = to;
+    tn.c_lflag &= ~(ICANON | ECHO);
+    printf(FORMAT, TARGET_FORMAT);
+    for(;;){
+        usb_read(usb, &i, 4); c=i;
+        if(i>0xFF) vars.hide=1;
+        if(!vars.hide){
+            printf("%c", c);
+            fflush(stdout);
+            if(pr<prl){
+                if(c==STR_PROMPT[pr]){
+                    if(++pr==prl){
+                        tcsetattr(STDIN_FILENO, TCSANOW, &tn);
+                        if(pthread_create(&thread, NULL, listenerTask, &vars))
+                            printf(FORMAT"listenerTask failed"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                    }
+                }
+                else if(c==STR_PROMPT[0])
+                    pr=1;
+                else
+                    pr=0;
+            }
+            else{
+                if(c==STR_RESET[rt]){
+                    if(++rt==rtl){
+                        tcsetattr(STDIN_FILENO, TCSANOW, &to);
+                        printf(FORMAT, HOST_FORMAT);
+                        return 0;
+                    }
+                }
+                else if(c==STR_RESET[0])
+                    rt=1;
+                else
+                    rt=0;
+            }
+        }
+        if(i==USBBOOT_FS_MAGIC){
+            usb_read(usb, &i, 4);
+            switch(i){
+            case USBBOOT_FS_CMD_OPEN :
+                for(j=0; rootfs[j]; j++) line[j] = rootfs[j];
+                for(;;j++){
+                    usb_read(usb, &i, 4);
+                    if(i!=USBBOOT_FS_CMD_END){
+                        if(i>0xFF) printf(FORMAT"Error in filename"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                        line[j] = i;
+                    }
+                    else{
+                        line[j] = 0;
+                        break;
+                    }
+                }
+                for(i=0; i<MAX_OPEN_FILES && fd_vector[i].fd>=0; i++);
+                if(i>=MAX_OPEN_FILES){
+                    printf(FORMAT"MAX_OPEN_FILES exceeded"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                    goto open_error_1;
+                }
+                if((fd_vector[i].fd=open(line, O_RDONLY))<0){
+                    printf(FORMAT"cannot open '%s'"FORMAT"\n", HOST_FORMAT, line, TARGET_FORMAT);
+                    goto open_error_1;
+                }
+                if(fstat(fd_vector[i].fd, &s)){
+                    printf(FORMAT"cannot stat '%s'"FORMAT"\n", HOST_FORMAT, line, TARGET_FORMAT);
+                    goto open_error_2;
+                }
+                if((fd_vector[i].data=mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd_vector[i].fd, 0))==MAP_FAILED){
+                    printf(FORMAT"cannot mmap '%s'"FORMAT"\n", HOST_FORMAT, line, TARGET_FORMAT);
+                    goto open_error_2;
+                }
+                close(fd_vector[i].fd);
+                fd_vector[i].size=size=s.st_size;
+                fd_vector[i].fd=fd=i;
+                goto open_ok;
+                
+                open_error_2:
+                close(fd_vector[i].fd);
+                open_error_1:
+                fd_vector[i].size=size=0;
+                fd_vector[i].fd=fd=-1;
+                open_ok:
+                if(usb_write(usb, &fd, 4)!=4 || usb_write(usb, &size, 4)!=4)
+                    printf(FORMAT"could not send file size to target"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                break;
+            case USBBOOT_FS_CMD_CLOSE:
+                usb_read(usb, &i, 4);
+                if(i<0 || i>=MAX_OPEN_FILES || fd_vector[i].fd<0){
+                    printf(FORMAT"invalid close index"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                    break;
+                }
+                usb_read(usb, &j, 4);
+                if(j!=USBBOOT_FS_CMD_END){
+                    printf(FORMAT"invalid close"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                    break;
+                }
+                munmap(fd_vector[i].data, fd_vector[i].size);
+                fd_vector[i].fd=-1;
+                break;
+            case USBBOOT_FS_CMD_READ :
+                usb_read(usb, &i, 4);
+                if(i<0 || i>=MAX_OPEN_FILES || fd_vector[i].fd<0){
+                    printf(FORMAT"invalid read index"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                    break;
+                }
+                usb_read(usb, &pos, 4);
+                if(pos>=fd_vector[i].size){
+                    printf(FORMAT"invalid read pos"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                    break;
+                }
+                usb_read(usb, &size, 4);
+                if(pos+size>fd_vector[i].size){
+                    printf(FORMAT"invalid read size"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                    break;
+                }
+                usb_read(usb, &j, 4);
+                if(j!=USBBOOT_FS_CMD_END){
+                    printf(FORMAT"invalid read"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                    break;
+                }
+                if(usb_write(usb, fd_vector[i].data+pos, size)!=size)
+                    printf(FORMAT"could not send file to target"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                break;
+            case USBBOOT_FS_CMD_END  :
+            default:
+                printf(FORMAT"Unknown filesystem command"FORMAT"\n", HOST_FORMAT, TARGET_FORMAT);
+                break;
+            }
+            vars.hide=0;
+        }
+    }
+    tcsetattr(STDIN_FILENO, TCSANOW, &to);
+    return 0;
+}
+
+int match_omap4_bootloader(usb_ifc_info *ifc){
+    if (ifc->dev_vendor != 0x0451) return -1;
+    if ((ifc->dev_product != 0xD010) && (ifc->dev_product != 0xD00F)) return -1;
+    return 0;
+}
+
+int main(int argc, char **argv){
+    void *data;
+    unsigned sz;
+    struct stat s;
+    int fd;
+    usb_handle *usb;
+    int once;
+
+    if(argc!=3){
+        printf("usage: %s <xloader> <rootfs>\n", argv[0]);
+        return 0;
+    }
+    argv++;
+    if((fd=open(argv[0], O_RDONLY))<0 || fstat(fd, &s) || (data=mmap(NULL, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0))==MAP_FAILED){
+        printf("cannot load '%s'\n", argv[0]);
+        return -1;
+    }
-- 
1.7.12.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 5/7] add console support over the same USB used for booting
  2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
                     ` (3 preceding siblings ...)
  2012-09-25 22:59   ` [PATCH 4/7] Add USB booting capabilities to OMAP vj
@ 2012-09-25 22:59   ` vj
  2012-09-25 22:59   ` [PATCH 6/7] add filesystem " vj
                     ` (4 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: vj @ 2012-09-25 22:59 UTC (permalink / raw)
  To: barebox; +Cc: vj

---
 drivers/serial/Kconfig      |  7 +++++
 drivers/serial/Makefile     |  1 +
 drivers/serial/serial_usb.c | 64 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 72 insertions(+)
 create mode 100644 drivers/serial/serial_usb.c

diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 7eb96ed..4e85e1f 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -100,4 +100,11 @@ config DRIVER_SERIAL_PXA
 	bool "PXA serial driver"
 	depends on ARCH_PXA
 
+config DRIVER_SERIAL_USB
+	bool "serial driver over omap4 usb"
+	default n
+	depends on USB_BOOT
+	help
+	  Enable this to get console support over the usb bus used to boot an OMAP4
+
 endmenu
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index e2d56b9..a89bb44 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -19,3 +19,4 @@ obj-$(CONFIG_DRIVER_SERIAL_S3C)			+= serial_s3c.o
 obj-$(CONFIG_DRIVER_SERIAL_ALTERA)		+= serial_altera.o
 obj-$(CONFIG_DRIVER_SERIAL_ALTERA_JTAG)		+= serial_altera_jtag.o
 obj-$(CONFIG_DRIVER_SERIAL_PXA)			+= serial_pxa.o
+obj-$(CONFIG_DRIVER_SERIAL_USB)			+= serial_usb.o
diff --git a/drivers/serial/serial_usb.c b/drivers/serial/serial_usb.c
new file mode 100644
index 0000000..25391db
--- /dev/null
+++ b/drivers/serial/serial_usb.c
@@ -0,0 +1,64 @@
+/*
+ * Use of usb-port as a serial communications port
+*/
+
+#include <common.h>
+#include <init.h>
+#include <malloc.h>
+#include <errno.h>
+#include <mach/omap4_rom_usb.h>
+
+struct serial_usb_priv {
+	struct console_device cdev;
+	int val;
+};
+
+static void serial_usb_putc(struct console_device *cdev, char c){
+	unsigned b = c;
+	usb_write(&b, 4);
+}
+
+static int serial_usb_tstc(struct console_device *cdev){
+	struct serial_usb_priv *priv = container_of(cdev, struct serial_usb_priv, cdev);
+	if(pusb->dread.status == -1 || pusb->dread.status == STATUS_WAITING)
+		return 0;
+	else if(pusb->dread.status != STATUS_OKAY)
+		usb_queue_read(&priv->val, 4);
+	return pusb->dread.status == STATUS_OKAY;
+}
+
+static int serial_usb_getc(struct console_device *cdev){
+	struct serial_usb_priv *priv = container_of(cdev, struct serial_usb_priv, cdev);
+	if(pusb->dread.status == -1 || pusb->dread.status == STATUS_WAITING)
+		;
+	else if(pusb->dread.status != STATUS_OKAY)
+		usb_queue_read(&priv->val, 4);
+	usb_wait_read();
+	pusb->dread.status = -2;
+	return priv->val;
+}
+
+static int serial_usb_probe(struct device_d *dev){
+	struct serial_usb_priv *priv;
+	priv = xzalloc(sizeof(*priv));
+	pusb->dread.status=-2;
+
+	priv->cdev.dev = dev;
+	priv->cdev.f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
+	priv->cdev.tstc = serial_usb_tstc;
+	priv->cdev.putc = serial_usb_putc;
+	priv->cdev.getc = serial_usb_getc;
+	priv->cdev.setbrg = NULL;
+
+	return console_register(&priv->cdev);
+}
+
+static struct driver_d serial_usb_driver = {
+	.name = "serial_usb",
+	.probe = serial_usb_probe,
+};
+
+static int serial_usb_init(void){
+	return register_driver(&serial_usb_driver);
+}
+console_initcall(serial_usb_init);
-- 
1.7.12.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 6/7] add filesystem support over the same USB used for booting
  2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
                     ` (4 preceding siblings ...)
  2012-09-25 22:59   ` [PATCH 5/7] add console support over the same USB used for booting vj
@ 2012-09-25 22:59   ` vj
  2012-09-25 22:59   ` [PATCH 7/7] Add support for Archos G9 tablet vj
                     ` (3 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: vj @ 2012-09-25 22:59 UTC (permalink / raw)
  To: barebox; +Cc: vj

---
 fs/Kconfig     |   5 ++
 fs/Makefile    |   1 +
 fs/usbbootfs.c | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 201 insertions(+)
 create mode 100644 fs/usbbootfs.c

diff --git a/fs/Kconfig b/fs/Kconfig
index 4c66543..1b89aec 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -29,6 +29,11 @@ config FS_TFTP
 	prompt "tftp support"
 	depends on NET
 
+config FS_USBBOOT
+	bool
+	prompt "Filesystem over usb boot"
+	depends on USB_BOOT
+
 config FS_NFS
 	depends on NET
 	bool
diff --git a/fs/Makefile b/fs/Makefile
index 1b52bee..d4f9a59 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -5,4 +5,5 @@ obj-$(CONFIG_FS_DEVFS)	+= devfs.o
 obj-$(CONFIG_FS_FAT)	+= fat/
 obj-y	+= fs.o
 obj-$(CONFIG_FS_TFTP)	+= tftp.o
+obj-$(CONFIG_FS_USBBOOT)	+= usbbootfs.o
 obj-$(CONFIG_FS_NFS)	+= nfs.o
diff --git a/fs/usbbootfs.c b/fs/usbbootfs.c
new file mode 100644
index 0000000..a40abbf
--- /dev/null
+++ b/fs/usbbootfs.c
@@ -0,0 +1,195 @@
+/*
+ * usbbootfs.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include <common.h>
+#include <malloc.h>
+#include <fs.h>
+#include <fcntl.h>
+#include <init.h>
+#include <linux/stat.h>
+#include <linux/err.h>
+#include <mach/omap4_rom_usb.h>
+
+#define USBBOOT_FS_MAGIC     0x5562464D
+#define USBBOOT_FS_CMD_OPEN  0x46530000
+#define USBBOOT_FS_CMD_CLOSE 0x46530001
+#define USBBOOT_FS_CMD_READ  0x46530002
+#define USBBOOT_FS_CMD_END   0x4653FFFF
+
+struct file_priv {
+    s32 id;
+    u32 size;
+};
+/*
+static int usbbootfs_create(struct device_d *dev, const char *pathname, mode_t mode){
+    return -ENOSYS;
+}
+
+static int usbbootfs_unlink(struct device_d *dev, const char *pathname){
+    return -ENOSYS;
+}
+
+static int usbbootfs_mkdir(struct device_d *dev, const char *pathname){
+    return -ENOSYS;
+}
+
+static int usbbootfs_rmdir(struct device_d *dev, const char *pathname){
+    return -ENOSYS;
+}
+
+static int usbbootfs_write(struct device_d *_dev, FILE *f, const void *inbuf, size_t size){
+    return -ENOSYS;
+}
+
+static int usbbootfs_truncate(struct device_d *dev, FILE *f, ulong size){
+    return -ENOSYS;
+}
+*/
+
+static struct file_priv *usbbootfs_do_open(struct device_d *dev, int accmode, const char *filename){
+    struct file_priv *priv;
+    u32 data;
+
+    if(accmode & O_ACCMODE)
+        return ERR_PTR(-ENOSYS);
+
+    priv = xzalloc(sizeof(*priv));
+    if(!priv)
+        return ERR_PTR(-ENOMEM);
+
+    data = USBBOOT_FS_MAGIC   ; usb_write(&data, 4);
+    data = USBBOOT_FS_CMD_OPEN; usb_write(&data, 4);
+    usb_puts(filename);
+    data = USBBOOT_FS_CMD_END ; usb_write(&data, 4);
+    
+    if(usb_read(&priv->id, 4) || usb_read(&priv->size, 4)){
+        free(priv);
+        return ERR_PTR(-EIO);
+    }
+    if(priv->id<0){
+        free(priv);
+        return ERR_PTR(-ENOENT);
+    }
+    
+    return priv;
+}
+
+static int usbbootfs_open(struct device_d *dev, FILE *file, const char *filename){
+    struct file_priv *priv;
+
+    priv = usbbootfs_do_open(dev, file->flags, filename);
+    if (IS_ERR(priv))
+        return PTR_ERR(priv);
+
+    file->inode = priv;
+    file->size = priv->size;
+
+    return 0;
+}
+
+static int usbbootfs_do_close(struct file_priv *priv){
+    u32 data;
+    data = USBBOOT_FS_MAGIC    ; usb_write(&data, 4);
+    data = USBBOOT_FS_CMD_CLOSE; usb_write(&data, 4);
+    usb_write(&priv->id, 4);
+    data = USBBOOT_FS_CMD_END  ; usb_write(&data, 4);
+    free(priv);
+    return 0;
+}
+
+static int usbbootfs_close(struct device_d *dev, FILE *f){
+    struct file_priv *priv = f->inode;
+    return usbbootfs_do_close(priv);
+}
+
+static int usbbootfs_read(struct device_d *dev, FILE *f, void *buf, size_t size){
+    struct file_priv *priv = f->inode;
+    u32 data;
+
+    if( size > priv->size - f->pos)
+        size = priv->size - f->pos;
+    if(!size)
+        return 0;
+
+    data = USBBOOT_FS_MAGIC   ; usb_write(&data, 4);
+    data = USBBOOT_FS_CMD_READ; usb_write(&data, 4);
+    usb_write(&priv->id, 4);
+    usb_write(&f->pos, 4);
+    usb_write(&size, 4);
+    data = USBBOOT_FS_CMD_END ; usb_write(&data, 4);
+
+    if(usb_read(buf, size))
+        return -EIO;
+
+    return size;
+}
+
+static loff_t usbbootfs_lseek(struct device_d *dev, FILE *f, loff_t pos){
+    f->pos = pos;
+    return pos;
+}
+
+static DIR* usbbootfs_opendir(struct device_d *dev, const char *pathname){
+    return NULL;
+}
+
+static int usbbootfs_stat(struct device_d *dev, const char *filename, struct stat *s){
+    struct file_priv *priv;
+
+    priv = usbbootfs_do_open(dev, O_RDONLY, filename);
+    if (IS_ERR(priv))
+        return PTR_ERR(priv);
+
+    s->st_mode = S_IFREG |
+                 S_IRUSR | S_IRGRP | S_IROTH |
+                 S_IXUSR | S_IXGRP | S_IXOTH ;
+    s->st_size = priv->size;
+
+    usbbootfs_do_close(priv);
+
+    return 0;
+}
+
+static int usbbootfs_probe(struct device_d *dev){ return 0; }
+static void usbbootfs_remove(struct device_d *dev){}
+
+static struct fs_driver_d usbbootfs_driver = {
+    .open      = usbbootfs_open,
+    .close     = usbbootfs_close,
+    .read      = usbbootfs_read,
+    .lseek     = usbbootfs_lseek,
+    .opendir   = usbbootfs_opendir,
+    .stat      = usbbootfs_stat,
+/*
+    .create    = usbbootfs_create,
+    .unlink    = usbbootfs_unlink,
+    .mkdir     = usbbootfs_mkdir,
+    .rmdir     = usbbootfs_rmdir,
+    .write     = usbbootfs_write,
+    .truncate  = usbbootfs_truncate,
+*/
+    .flags     = 0,
+    .drv = {
+        .probe  = usbbootfs_probe,
+        .remove = usbbootfs_remove,
+        .name = "usbbootfs",
+    }
+};
+
+static int usbbootfs_init(void){
+    return register_fs_driver(&usbbootfs_driver);
+}
+coredevice_initcall(usbbootfs_init);
-- 
1.7.12.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* [PATCH 7/7] Add support for Archos G9 tablet
  2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
                     ` (5 preceding siblings ...)
  2012-09-25 22:59   ` [PATCH 6/7] add filesystem " vj
@ 2012-09-25 22:59   ` vj
  2012-09-26  3:57   ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet Antony Pavlov
                     ` (2 subsequent siblings)
  9 siblings, 0 replies; 17+ messages in thread
From: vj @ 2012-09-25 22:59 UTC (permalink / raw)
  To: barebox; +Cc: vj

---
 arch/arm/Makefile                         |   1 +
 arch/arm/boards/archosg9/Makefile         |   1 +
 arch/arm/boards/archosg9/board.c          |  58 ++++++++
 arch/arm/boards/archosg9/env/bin/init     |  18 +++
 arch/arm/boards/archosg9/env/config       |   2 +
 arch/arm/boards/archosg9/lowlevel.c       | 126 +++++++++++++++++
 arch/arm/boards/archosg9/mux.c            | 226 ++++++++++++++++++++++++++++++
 arch/arm/configs/archosg9_defconfig       |  70 +++++++++
 arch/arm/configs/archosg9_xload_defconfig |  25 ++++
 arch/arm/mach-omap/Kconfig                |   9 ++
 arch/arm/tools/mach-types                 |   1 +
 11 files changed, 537 insertions(+)
 create mode 100644 arch/arm/boards/archosg9/Makefile
 create mode 100644 arch/arm/boards/archosg9/board.c
 create mode 100644 arch/arm/boards/archosg9/env/bin/init
 create mode 100644 arch/arm/boards/archosg9/env/config
 create mode 100644 arch/arm/boards/archosg9/lowlevel.c
 create mode 100644 arch/arm/boards/archosg9/mux.c
 create mode 100644 arch/arm/configs/archosg9_defconfig
 create mode 100644 arch/arm/configs/archosg9_xload_defconfig

diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 8e660be..8598005 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -100,6 +100,7 @@ board-$(CONFIG_MACH_OMAP343xSDP)		:= omap343xdsp
 board-$(CONFIG_MACH_BEAGLE)			:= beagle
 board-$(CONFIG_MACH_OMAP3EVM)			:= omap3evm
 board-$(CONFIG_MACH_PANDA)			:= panda
+board-$(CONFIG_MACH_ARCHOSG9)			:= archosg9
 board-$(CONFIG_MACH_PCM049)			:= pcm049
 board-$(CONFIG_MACH_PCA100)			:= phycard-i.MX27
 board-$(CONFIG_MACH_PCAAL1)			:= phycard-a-l1
diff --git a/arch/arm/boards/archosg9/Makefile b/arch/arm/boards/archosg9/Makefile
new file mode 100644
index 0000000..c55e26e
--- /dev/null
+++ b/arch/arm/boards/archosg9/Makefile
@@ -0,0 +1 @@
+obj-y += board.o lowlevel.o mux.o
diff --git a/arch/arm/boards/archosg9/board.c b/arch/arm/boards/archosg9/board.c
new file mode 100644
index 0000000..5ddb953
--- /dev/null
+++ b/arch/arm/boards/archosg9/board.c
@@ -0,0 +1,58 @@
+#include <common.h>
+#include <init.h>
+#include <ns16550.h>
+#include <asm/armlinux.h>
+#include <generated/mach-types.h>
+#include <mach/silicon.h>
+#include <sizes.h>
+#include <i2c/i2c.h>
+#include <gpio.h>
+#ifdef CONFIG_USB_BOOT
+#include <mach/omap4_rom_usb.h>
+#endif
+
+#ifdef CONFIG_DRIVER_SERIAL_NS16550
+static struct NS16550_plat serial_plat = {
+	.clock = 48000000, /* 48MHz (APLL96/2) */
+	.shift = 2,
+};
+#endif
+static int archosg9_console_init(void){
+#ifdef CONFIG_USB_BOOT
+    usb_open();
+    usb_puts("USB communications initialized\n");
+# ifdef CONFIG_DRIVER_SERIAL_USB
+    add_generic_device("serial_usb", DEVICE_ID_DYNAMIC, NULL, 0, 0, 0, NULL);
+# endif
+#endif
+#if defined (CONFIG_DRIVER_SERIAL_NS16550) && ( !defined (CONFIG_OMAP_BUILD_IFT) || !defined (CONFIG_DRIVER_SERIAL_USB) )
+    gpio_direction_output( 41, 0); // gps_disable
+    gpio_direction_output( 34, 1); // 1v8_pwron
+    add_ns16550_device(DEVICE_ID_DYNAMIC, OMAP44XX_UART1_BASE, 1024, IORESOURCE_MEM_8BIT, &serial_plat);
+#endif
+    return 0;
+}
+console_initcall(archosg9_console_init);
+
+static int archosg9_mem_init(void){
+	arm_add_mem_device("ram0", 0x80000000, SZ_1G);
+	return 0;
+}
+mem_initcall(archosg9_mem_init);
+
+static struct i2c_board_info i2c_devices[] = {
+	{ I2C_BOARD_INFO("twl6030", 0x48), },
+};
+
+static int archosg9_devices_init(void){
+    i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices));
+    add_generic_device("i2c-omap"  , DEVICE_ID_DYNAMIC, NULL, OMAP44XX_I2C1_BASE, 0x100, IORESOURCE_MEM, NULL);
+    add_generic_device("omap-hsmmc", DEVICE_ID_DYNAMIC, NULL, OMAP44XX_MMC1_BASE, SZ_4K, IORESOURCE_MEM, NULL);
+ /* add_generic_device("omap-hsmmc", DEVICE_ID_DYNAMIC, NULL, OMAP44XX_MMC2_BASE, SZ_4K, IORESOURCE_MEM, NULL); */
+
+	armlinux_set_bootparams((void *)0x80000100);
+	armlinux_set_architecture(MACH_TYPE_OMAP4_ARCHOSG9);
+
+	return 0;
+}
+device_initcall(archosg9_devices_init);
diff --git a/arch/arm/boards/archosg9/env/bin/init b/arch/arm/boards/archosg9/env/bin/init
new file mode 100644
index 0000000..4c0f244
--- /dev/null
+++ b/arch/arm/boards/archosg9/env/bin/init
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+PATH=/env/bin
+export PATH
+
+. /env/config
+
+if [ -n $autoboot_timeout ]; then
+	echo
+	echo -n "Hit any key to stop autoboot: "
+	timeout -a $autoboot_timeout
+	if [ $? != 0 ]; then
+		exit
+	fi
+fi
+mkdir /usb
+mount -t usbbootfs usbboot /usb
+bootm /usb/boot/zImage
diff --git a/arch/arm/boards/archosg9/env/config b/arch/arm/boards/archosg9/env/config
new file mode 100644
index 0000000..9e8c1db
--- /dev/null
+++ b/arch/arm/boards/archosg9/env/config
@@ -0,0 +1,2 @@
+autoboot_timeout=3
+bootargs="earlyprintk=serial console=ttyO1,57600n8"
diff --git a/arch/arm/boards/archosg9/lowlevel.c b/arch/arm/boards/archosg9/lowlevel.c
new file mode 100644
index 0000000..312edd5
--- /dev/null
+++ b/arch/arm/boards/archosg9/lowlevel.c
@@ -0,0 +1,126 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <io.h>
+#include <mach/omap4-mux.h>
+#include <mach/omap4-silicon.h>
+#include <mach/omap4-clock.h>
+#include <mach/syslib.h>
+#include <asm/barebox-arm.h>
+
+#define TPS62361_VSEL0_GPIO    7
+
+void set_muxconf_regs(void);
+
+static const struct ddr_regs ddr_regs_400_mhz_2cs = {
+    .tim1        = 0x10EB0662,
+    .tim2        = 0x20370DD2,
+    .tim3        = 0x00B1C33F,
+    .phy_ctrl_1  = 0x849FF408,
+    .ref_ctrl    = 0x00000618,
+    .config_init = 0x80000EB9,
+    .config_final= 0x80001AB9,
+    .zq_config   = 0xD00B3215,
+    .mr1         = 0x83,
+    .mr2         = 0x4
+};
+
+static void noinline archosg9_init_lowlevel(void)
+{
+    struct dpll_param core = OMAP4_CORE_DPLL_PARAM_19M2_DDR400;
+    struct dpll_param mpu = OMAP4_MPU_DPLL_PARAM_19M2_MPU600;
+    struct dpll_param iva = OMAP4_IVA_DPLL_PARAM_19M2;
+    struct dpll_param per = OMAP4_PER_DPLL_PARAM_19M2;
+    struct dpll_param abe = OMAP4_ABE_DPLL_PARAM_19M2;
+    struct dpll_param usb = OMAP4_USB_DPLL_PARAM_19M2;
+
+    writel(CM_SYS_CLKSEL_19M2, CM_SYS_CLKSEL);
+
+    /* Configure all DPLL's at 100% OPP */
+    omap4_configure_mpu_dpll(&mpu);
+    omap4_configure_iva_dpll(&iva);
+    omap4_configure_per_dpll(&per);
+    omap4_configure_abe_dpll(&abe);
+    omap4_configure_usb_dpll(&usb);
+
+    /* Enable all clocks */
+    omap4_enable_all_clocks();
+
+    set_muxconf_regs();
+
+    omap4_ddr_init(&ddr_regs_400_mhz_2cs, &core);
+
+    /* Set VCORE1 = 1.3 V, VCORE2 = VCORE3 = 1.21V */
+    omap4_scale_vcores(TPS62361_VSEL0_GPIO);
+}
+
+void board_init_lowlevel(void)
+{
+    u32 r;
+
+    r = 0x4030D000;
+        __asm__ __volatile__("mov sp, %0" : : "r"(r));
+
+    archosg9_init_lowlevel();
+}
+
+
+/*
+    / * Memory test * /
+    / *memtest((void*)0x82000000, 8*1024*1024);* /
+    / * Full memory test * /
+    / *memtest((void*)0x80000000, 1024*1024*1024);* /
+static unsigned prbs(unsigned state){
+    const unsigned POL = (1<<(32-1)) | (1<<(31-1)) | (1<<(20-1)) | (1<<(19-1)) | (1<<(13-1)) | (1<<(1-1));
+    unsigned i;
+    for(i=0; i<32; i++){
+        if(state&1) state = (state >> 1) ^ POL;
+        else        state =  state >> 1;
+    }
+    return state;
+}
+static void memtest(void *x, unsigned count) {
+    unsigned *w = x;
+    unsigned n, m;
+    unsigned chk;
+    count /= 8;
+
+#define PRINT early_printf
+// #define PRINT usb_puts
+    PRINT("memtest write\n");
+    for(chk=0xa5a5a5a5, n=0, m=count; n<count; n++, m++) {
+        chk = prbs(chk);
+        w[n] =  chk;
+        w[m] = ~chk;
+    }
+    PRINT("memtest read\n");
+    for(n=0, m=count; n<count; n++, m++) {
+        if(w[n] != ~w[m]){
+            PRINT("ERROR [%08X]%08X != [%08X]%08X\n", (unsigned) (w+n), w[n], (unsigned) (w+m), ~w[m]);
+            return;
+        }
+    }
+    PRINT("memtest read2\n");
+    for(chk=0xa5a5a5a5, n=0, m=count; n<count; n++, m++) {
+        chk = prbs(chk);
+        if(w[n] != chk || w[m] != ~chk){
+            PRINT("ERROR [%08X]%08X != [%08X]%08X != %08X\n", (unsigned) (w+n), w[n], (unsigned) (w+m), ~w[m], chk);
+            return;
+        }
+    }
+    PRINT("OK!\n");
+}
+*/
diff --git a/arch/arm/boards/archosg9/mux.c b/arch/arm/boards/archosg9/mux.c
new file mode 100644
index 0000000..fb66f97
--- /dev/null
+++ b/arch/arm/boards/archosg9/mux.c
@@ -0,0 +1,226 @@
+#include <common.h>
+#include <init.h>
+#include <io.h>
+#include <mach/omap4-silicon.h>
+#include <mach/omap4-mux.h>
+
+static const struct pad_conf_entry core_padconf_array[] = {
+    { GPMC_AD0            ,                              IEN|PTU|M1 }, /* sdmmc2_dat0         */ /* internal FLASH */
+    { GPMC_AD1            ,                              IEN|PTU|M1 }, /* sdmmc2_dat1         */ /* internal FLASH */
+    { GPMC_AD2            ,                              IEN|PTU|M1 }, /* sdmmc2_dat2         */ /* internal FLASH */
+    { GPMC_AD3            ,                              IEN|PTU|M1 }, /* sdmmc2_dat3         */ /* internal FLASH */
+    { GPMC_AD4            ,                              IEN|PTU|M1 }, /* sdmmc2_dat4         */ /* internal FLASH */
+    { GPMC_AD5            ,                              IEN|PTU|M1 }, /* sdmmc2_dat5         */ /* internal FLASH */
+    { GPMC_AD6            ,                              IEN|PTU|M1 }, /* sdmmc2_dat6         */ /* internal FLASH */
+    { GPMC_AD7            ,                              IEN|PTU|M1 }, /* sdmmc2_dat7         */ /* internal FLASH */
+    { GPMC_AD8            ,                              IEN|PTD|M3 }, /* gpio_32             */
+    { GPMC_AD9            ,                              IEN|PTU|M0 }, /* gpmc_ad9            */
+    { GPMC_AD10           ,                              IEN|PTU|M3 }, /* gpio_34             */ /* 1v8_pwron */
+    { GPMC_AD11           ,                              IEN|PTU|M3 }, /* gpio_35             */ /* vcc_pwron */
+    { GPMC_AD12           ,                              IEN    |M3 }, /* gpio_36             */ /* 5v_pwron */
+    { GPMC_AD13           ,                              IEN    |M3 }, /* gpio_37             */ /* hdmi_pwr */
+    { GPMC_AD14           ,                              IEN    |M3 }, /* gpio_38             */ /* lcd_pwon */
+    { GPMC_AD15           ,                              IEN    |M3 }, /* gpio_39             */ /* lvds_en */
+    { GPMC_A16            ,                              IEN    |M3 }, /* gpio_40             */ /* 3g_enable */
+    { GPMC_A17            ,                              IEN    |M3 }, /* gpio_41             */ /* gps_enable */
+    { GPMC_A18            ,                              IEN    |M3 }, /* gpio_42             */ /* ehci_enable */
+    { GPMC_A19            ,                              IEN    |M3 }, /* gpio_43             */ /* volume up */
+    { GPMC_A20            ,                              IEN    |M3 }, /* gpio_44             */ /* volume down */
+    { GPMC_A21            ,                              IEN|PTU|M3 }, /* gpio_45             */ /* accel_int1 */
+    { GPMC_A22            ,                              IEN|PTD|M1 }, /* kpd_col6            */
+    { GPMC_A23            ,                              IEN|PTD|M1 }, /* kpd_col7            */
+    { GPMC_A24            ,                              IEN    |M3 }, /* gpio_48             */ /* vbus_detect */
+    { GPMC_A25            ,                              IEN|PTU|M3 }, /* gpio_49             */ /* id */
+    { GPMC_NCS0           ,                              IEN|PTU|M0 }, /* gpmc_ncs0           */
+    { GPMC_NCS1           ,                              IEN    |M3 }, /* gpio_51             */ /* compass_data_ready */
+    { GPMC_NCS2           ,                              IEN|PTU|M7 }, /* safe_mode           */
+    { GPMC_NCS3           ,                              IEN    |M3 }, /* gpio_53             */ /* lcd_rst */
+    { GPMC_NWP            ,                              IEN|PTD|M0 }, /* gpmc_nwp            */
+    { GPMC_CLK            ,                              IEN|PTD|M0 }, /* gpmc_clk            */
+    { GPMC_NADV_ALE       ,                              IEN|PTD|M0 }, /* gpmc_nadv_ale       */
+    { GPMC_NOE            ,                              IEN|PTU|M1 }, /* sdmmc2_clk          */ /* internal FLASH */
+    { GPMC_NWE            ,                              IEN|PTU|M1 }, /* sdmmc2_cmd          */ /* internal FLASH */
+    { GPMC_NBE0_CLE       ,                              IEN|PTD|M0 }, /* gpmc_nbe0_cle       */
+    { GPMC_NBE1           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { GPMC_WAIT0          ,                              IEN|PTU|M0 }, /* gpmc_wait0          */
+    { GPMC_WAIT1          ,                              IEN    |M3 }, /* gpio_62             */ /* camera_reset */
+    { GPMC_WAIT2          ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { GPMC_NCS4           ,                                      M3 }, /* gpio_101            */ /* lcd_stdby */
+    { GPMC_NCS5           ,                              IEN    |M3 }, /* gpio_102            */ /* wifi_irq */
+    { GPMC_NCS6           ,                                      M3 }, /* gpio_103            */ /* wifi_power */
+    { GPMC_NCS7           ,                              IEN    |M3 }, /* gpio_104            */ /* bt_power */
+    { GPIO63              ,                              IEN|PTD|M3 }, /* gpio_63             */ /* hdmi_hpd ?? */
+    { GPIO64              ,                              IEN    |M0 }, /*                     */
+    { GPIO65              ,                              IEN    |M0 }, /*                     */
+    { GPIO66              ,                              IEN    |M0 }, /*                     */
+    { CSI21_DX0           ,                              IEN    |M0 }, /* csi21_dx0           */
+    { CSI21_DY0           ,                              IEN    |M0 }, /* csi21_dy0           */
+    { CSI21_DX1           ,                              IEN    |M0 }, /* csi21_dx1           */
+    { CSI21_DY1           ,                              IEN    |M0 }, /* csi21_dy1           */
+    { CSI21_DX2           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CSI21_DY2           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CSI21_DX3           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CSI21_DY3           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CSI21_DX4           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CSI21_DY4           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CSI22_DX0           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CSI22_DY0           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CSI22_DX1           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CSI22_DY1           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CAM_SHUTTER         ,                                  PTD|M0 }, /* cam_shutter         */
+    { CAM_STROBE          ,                                  PTD|M0 }, /* cam_strobe          */
+    { CAM_GLOBALRESET     ,                                  PTD|M3 }, /* gpio_83             */
+    { USBB1_ULPITLL_CLK   ,                              IEN|PTD|M4 }, /* usbb1_ulpiphy_clk   */
+    { USBB1_ULPITLL_STP   ,                                      M4 }, /* usbb1_ulpiphy_stp   */
+    { USBB1_ULPITLL_DIR   ,                              IEN|PTD|M4 }, /* usbb1_ulpiphy_dir   */
+    { USBB1_ULPITLL_NXT   ,                              IEN|PTD|M4 }, /* usbb1_ulpiphy_nxt   */
+    { USBB1_ULPITLL_DAT0  , WAKEUP_EN                   |IEN|PTD|M4 }, /* usbb1_ulpiphy_dat0  */
+    { USBB1_ULPITLL_DAT1  ,                              IEN|PTD|M4 }, /* usbb1_ulpiphy_dat1  */
+    { USBB1_ULPITLL_DAT2  ,                              IEN|PTD|M4 }, /* usbb1_ulpiphy_dat2  */
+    { USBB1_ULPITLL_DAT3  ,                              IEN|PTD|M4 }, /* usbb1_ulpiphy_dat3  */
+    { USBB1_ULPITLL_DAT4  ,                              IEN|PTD|M4 }, /* usbb1_ulpiphy_dat4  */
+    { USBB1_ULPITLL_DAT5  ,                              IEN|PTD|M4 }, /* usbb1_ulpiphy_dat5  */
+    { USBB1_ULPITLL_DAT6  ,                              IEN|PTD|M4 }, /* usbb1_ulpiphy_dat6  */
+    { USBB1_ULPITLL_DAT7  ,                              IEN|PTD|M4 }, /* usbb1_ulpiphy_dat7  */
+    { USBB1_HSIC_DATA     ,                                      M0 }, /* usbb1_hsic_data     */
+    { USBB1_HSIC_STROBE   ,                                      M0 }, /* usbb1_hsic_strobe   */
+    { USBC1_ICUSB_DP      ,                                      M0 }, /* usbc1_icusb_dp      */
+    { USBC1_ICUSB_DM      ,                                      M0 }, /* usbc1_icusb_dm      */
+    { SDMMC1_CLK          ,                                  PTU|M0 }, /* sdmmc1_clk          */ /* SD card */
+    { SDMMC1_CMD          ,                              IEN|PTU|M0 }, /* sdmmc1_cmd          */ /* SD card */
+    { SDMMC1_DAT0         ,                              IEN|PTU|M0 }, /* sdmmc1_dat0         */ /* SD card */
+    { SDMMC1_DAT1         ,                              IEN|PTU|M0 }, /* sdmmc1_dat1         */ /* SD card */
+    { SDMMC1_DAT2         ,                              IEN|PTU|M0 }, /* sdmmc1_dat2         */ /* SD card */
+    { SDMMC1_DAT3         ,                              IEN|PTU|M0 }, /* sdmmc1_dat3         */ /* SD card */
+    { SDMMC1_DAT4         ,                              IEN|PTU|M0 }, /* sdmmc1_dat4         */ /* SD card */
+    { SDMMC1_DAT5         ,                              IEN|PTU|M0 }, /* sdmmc1_dat5         */ /* SD card */
+    { SDMMC1_DAT6         ,                              IEN|PTU|M0 }, /* sdmmc1_dat6         */ /* SD card */
+    { SDMMC1_DAT7         ,                              IEN|PTU|M0 }, /* sdmmc1_dat7         */ /* SD card */
+    { ABE_MCBSP2_CLKX     ,                                      M3 }, /* gpio_110            */ /* tsp_pwr_gpio */
+    { ABE_MCBSP2_DR       ,                              IEN    |M3 }, /* gpio_111            */ /* vbus_musb_pwron */
+    { ABE_MCBSP2_DX       , WAKEUP_EN                   |IEN|PTU|M3 }, /* gpio_112            */ /* tsp_irq_gpio */
+    { ABE_MCBSP2_FSX      ,                              IEN|PTU|M3 }, /* gpio_113            */ /* vbus_flag */
+    { ABE_MCBSP1_CLKX     ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { ABE_MCBSP1_DR       ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { ABE_MCBSP1_DX       ,                                      M0 }, /* abe_mcbsp1_dx       */
+    { ABE_MCBSP1_FSX      ,                              IEN    |M0 }, /* abe_mcbsp1_fsx      */
+    { ABE_PDM_UL_DATA     ,                              IEN    |M0 }, /* abe_pdm_ul_data     */
+    { ABE_PDM_DL_DATA     ,                                      M0 }, /* abe_pdm_dl_data     */
+    { ABE_PDM_FRAME       ,                              IEN    |M0 }, /* abe_pdm_frame       */
+    { ABE_PDM_LB_CLK      ,                              IEN    |M0 }, /* abe_pdm_lb_clk      */
+    { ABE_CLKS            ,                              IEN    |M0 }, /* abe_clks            */
+    { ABE_DMIC_CLK1       ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { ABE_DMIC_DIN1       ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { ABE_DMIC_DIN2       ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { ABE_DMIC_DIN3       ,                              IEN|PTD|M7 }, /* safe_mode           */ /* bkl_en on gpio_122 ?? */
+    { UART2_CTS           , WAKEUP_EN|OFF_PU|OFF_IN             |M0 }, /* uart2_cts           */
+    { UART2_RTS           ,           OFF_PU|OFF_IN             |M7 }, /* safe_mode           */
+    { UART2_RX            ,                              IEN|PTU|M0 }, /* uart2_rx            */
+    { UART2_TX            ,                                      M0 }, /* uart2_tx            */
+    { HDQ_SIO             ,                                      M3 }, /* gpio_127            */ /* audio_power_on */
+    { I2C1_SCL            ,                              IEN    |M0 }, /* i2c1_scl            */
+    { I2C1_SDA            ,                              IEN    |M0 }, /* i2c1_sda            */
+    { I2C2_SCL            ,                              IEN    |M0 }, /* i2c2_scl            */
+    { I2C2_SDA            ,                              IEN    |M0 }, /* i2c2_sda            */
+    { I2C3_SCL            ,                              IEN    |M0 }, /* i2c3_scl            */
+    { I2C3_SDA            ,                              IEN    |M0 }, /* i2c3_sda            */
+    { I2C4_SCL            ,                              IEN    |M0 }, /* i2c4_scl            */
+    { I2C4_SDA            ,                              IEN    |M0 }, /* i2c4_sda            */
+    { MCSPI1_CLK          ,                              IEN    |M0 }, /* mcspi1_clk          */
+    { MCSPI1_SOMI         ,                              IEN    |M0 }, /* mcspi1_somi         */
+    { MCSPI1_SIMO         ,                              IEN    |M0 }, /* mcspi1_simo         */
+    { MCSPI1_CS0          ,                              IEN|PTD|M0 }, /* mcspi1_cs0          */
+    { MCSPI1_CS1          , WAKEUP_EN                   |IEN    |M1 }, /* uart1_rx            */
+    { MCSPI1_CS2          ,                                      M3 }, /* gpio_139            */
+    { MCSPI1_CS3          ,                              IEN|PTU|M7 }, /* safe_mode           */
+    { UART3_CTS_RCTX      ,                                      M1 }, /* uart1_tx            */
+    { UART3_RTS_SD        ,                                      M0 }, /* uart3_rts_sd        */
+    { UART3_RX_IRRX       ,                              IEN|PTU|M7 }, /* safe_mode           */
+    { UART3_TX_IRTX       ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { SDMMC5_CLK          ,                                  PTU|M0 }, /* sdmmc5_clk          */
+    { SDMMC5_CMD          ,                              IEN|PTU|M0 }, /* sdmmc5_cmd          */
+    { SDMMC5_DAT0         ,                              IEN|PTU|M0 }, /* sdmmc5_dat0         */
+    { SDMMC5_DAT1         ,                              IEN|PTU|M0 }, /* sdmmc5_dat1         */
+    { SDMMC5_DAT2         ,                              IEN|PTU|M0 }, /* sdmmc5_dat2         */
+    { SDMMC5_DAT3         ,                              IEN|PTU|M0 }, /* sdmmc5_dat3         */
+    { MCSPI4_CLK          ,                              IEN|PTU|M1 }, /* sdmmc4_clk          */
+    { MCSPI4_SIMO         ,                              IEN|PTU|M1 }, /* sdmmc4_cmd          */
+    { MCSPI4_SOMI         ,                              IEN|PTU|M1 }, /* sdmmc4_dat0         */
+    { MCSPI4_CS0          ,                              IEN|PTU|M1 }, /* sdmmc4_dat3         */
+    { UART4_RX            ,                              IEN|PTU|M1 }, /* sdmmc4_dat2         */
+    { UART4_TX            ,                              IEN|PTU|M1 }, /* sdmmc4_dat1         */
+    { USBB2_ULPITLL_CLK   ,                                      M3 }, /* gpio_157            */
+    { USBB2_ULPITLL_STP   ,                                      M5 }, /* dispc2_data23       */
+    { USBB2_ULPITLL_DIR   ,                                      M5 }, /* dispc2_data22       */
+    { USBB2_ULPITLL_NXT   ,                                      M5 }, /* dispc2_data21       */
+    { USBB2_ULPITLL_DAT0  ,                                      M5 }, /* dispc2_data20       */
+    { USBB2_ULPITLL_DAT1  ,                                      M5 }, /* dispc2_data19       */
+    { USBB2_ULPITLL_DAT2  ,                                      M5 }, /* dispc2_data18       */
+    { USBB2_ULPITLL_DAT3  ,                                      M5 }, /* dispc2_data15       */
+    { USBB2_ULPITLL_DAT4  ,                                      M5 }, /* dispc2_data14       */
+    { USBB2_ULPITLL_DAT5  ,                                      M5 }, /* dispc2_data13       */
+    { USBB2_ULPITLL_DAT6  ,                                      M5 }, /* dispc2_data12       */
+    { USBB2_ULPITLL_DAT7  ,                                      M5 }, /* dispc2_data11       */
+    { USBB2_HSIC_DATA     ,                                      M3 }, /* gpio_169            */
+    { USBB2_HSIC_STROBE   ,                                      M3 }, /* gpio_170            */
+    { KPD_COL3            ,                              IEN|PTD|M1 }, /* kpd_col0            */
+    { KPD_COL4            ,                              IEN|PTD|M1 }, /* kpd_col1            */
+    { KPD_COL5            ,                              IEN|PTD|M1 }, /* kpd_col2            */
+    { KPD_COL0            ,                              IEN|PTU|M3 }, /* gpio_174            */ /* accel_int2 */
+    { KPD_COL1            ,                              IEN|PTD|M3 }, /* gpio_0              */ /* tsp_shtdwn_gpio */
+    { KPD_COL2            ,                              IEN|PTD|M3 }, /* gpio_1              */
+    { KPD_ROW3            ,                              IEN|PTD|M1 }, /* kpd_row0            */
+    { KPD_ROW4            ,                              IEN|PTD|M1 }, /* kpd_row1            */
+    { KPD_ROW5            ,                              IEN|PTD|M1 }, /* kpd_row2            */
+    { KPD_ROW0            ,                              IEN|PTD|M1 }, /* kpd_row3            */
+    { KPD_ROW1            ,                              IEN|PTD|M1 }, /* kpd_row4            */
+    { KPD_ROW2            ,                              IEN|PTD|M1 }, /* kpd_row5            */
+    { USBA0_OTG_CE        ,                                  PTU|M0 }, /* usba0_otg_ce        */
+    { USBA0_OTG_DP        ,                                      M0 }, /* usba0_otg_dp        */
+    { USBA0_OTG_DM        ,                                      M0 }, /* usba0_otg_dm        */
+    { FREF_CLK1_OUT       ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { FREF_CLK2_OUT       ,                                      M0 }, /* fref_clk2_out       */
+    { SYS_NIRQ1           , WAKEUP_EN                   |IEN|PTU|M0 }, /* sys_nirq1           */
+    { SYS_NIRQ2           ,                              IEN|PTU|M0 }, /* sys_nirq2           */ /* audio_irq */
+    { SYS_BOOT0           ,                              IEN|PTD|M0 }, /* sys_boot0           */
+    { SYS_BOOT1           ,                              IEN|PTD|M0 }, /* sys_boot1           */
+    { SYS_BOOT2           ,                              IEN|PTD|M0 }, /* sys_boot2           */
+    { SYS_BOOT3           ,                              IEN|PTD|M0 }, /* sys_boot3           */
+    { SYS_BOOT4           ,                              IEN|PTD|M0 }, /* sys_boot4           */
+    { SYS_BOOT5           ,                              IEN|PTD|M0 }, /* sys_boot5           */
+    { DPM_EMU0            ,                              IEN|PTU|M0 }, /* dpm_emu0            */
+    { DPM_EMU1            ,                              IEN    |M3 }, /* gpio_12             */ /* lcd_avdd_en */
+    { DPM_EMU2            ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { DPM_EMU3            ,                                      M5 }, /* dispc2_data10       */
+    { DPM_EMU4            ,                                      M5 }, /* dispc2_data9        */
+    { DPM_EMU5            ,                                      M5 }, /* dispc2_data16       */
+    { DPM_EMU6            ,                                      M5 }, /* dispc2_data17       */
+    { DPM_EMU7            ,                                      M5 }, /* dispc2_hsync        */
+    { DPM_EMU8            ,                                      M5 }, /* dispc2_pclk         */
+    { DPM_EMU9            ,                                      M5 }, /* dispc2_vsync        */
+    { DPM_EMU10           ,                                      M5 }, /* dispc2_de           */
+    { DPM_EMU11           ,                                      M5 }, /* dispc2_data8        */
+    { DPM_EMU12           ,                                      M5 }, /* dispc2_data7        */
+    { DPM_EMU13           ,                                      M5 }, /* dispc2_data6        */
+    { DPM_EMU14           ,                                      M5 }, /* dispc2_data5        */
+    { DPM_EMU15           ,                                      M5 }, /* dispc2_data4        */
+    { DPM_EMU16           ,                                      M5 }, /* dispc2_data3        */
+    { DPM_EMU17           ,                                      M5 }, /* dispc2_data2        */
+    { DPM_EMU18           ,                                      M5 }, /* dispc2_data1        */
+    { DPM_EMU19           ,                                      M5 }, /* dispc2_data0        */
+    { CSI22_DX2           ,                              IEN|PTD|M7 }, /* safe_mode           */
+    { CSI22_DY2           ,                              IEN|PTD|M7 }, /* safe_mode           */
+};
+
+static const struct pad_conf_entry wkup_padconf_array[] = {
+    { SR_SCL               , IEN        }, /* sr_scl              */
+    { SR_SDA               , IEN        }, /* sr_sda              */
+    { FREF_CLK0_OUT        ,         M0 }, /* fref_clk0_out       */
+    { FREF_CLK3_REQ        ,         M3 }, /* gpio_wk30           */
+    { FREF_CLK4_REQ        , IEN|PTU|M3 }, /* gpio_wk7            */ /* tps62361_vsel0 */
+};
+
+void set_muxconf_regs(void){
+    omap4_do_set_mux(OMAP44XX_CONTROL_PADCONF_CORE, core_padconf_array, ARRAY_SIZE(core_padconf_array));
+    omap4_do_set_mux(OMAP44XX_CONTROL_PADCONF_WKUP, wkup_padconf_array, ARRAY_SIZE(wkup_padconf_array));
+}
diff --git a/arch/arm/configs/archosg9_defconfig b/arch/arm/configs/archosg9_defconfig
new file mode 100644
index 0000000..fa9015e
--- /dev/null
+++ b/arch/arm/configs/archosg9_defconfig
@@ -0,0 +1,70 @@
+CONFIG_MACH_ARCHOSG9=y
+CONFIG_ARCH_OMAP=y
+CONFIG_ARCH_OMAP4=y
+CONFIG_AEABI=y
+CONFIG_MACH_DO_LOWLEVEL_INIT=n
+CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
+CONFIG_ARM_UNWIND=y
+CONFIG_MMU=n
+CONFIG_USB_BOOT=y
+CONFIG_SHARE_USB_HANDLE=y
+CONFIG_TEXT_BASE=0x8f000000
+CONFIG_MALLOC_SIZE=0x2000000
+CONFIG_KALLSYMS=y
+CONFIG_PROMPT="barebox> "
+CONFIG_LONGHELP=y
+CONFIG_GLOB=y
+CONFIG_HUSH_FANCY_PROMPT=y
+CONFIG_CMDLINE_EDITING=y
+CONFIG_AUTO_COMPLETE=y
+# CONFIG_CONSOLE_ACTIVATE_FIRST is not set
+CONFIG_CONSOLE_ACTIVATE_ALL=y
+# CONFIG_TIMESTAMP is not set
+CONFIG_DEFAULT_ENVIRONMENT_GENERIC=y
+CONFIG_DEFAULT_ENVIRONMENT_PATH="defaultenv defaultenv-2 arch/arm/boards/archosg9/env"
+CONFIG_CMD_EDIT=y
+CONFIG_CMD_SLEEP=y
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_EXPORT=y
+CONFIG_CMD_PRINTENV=y
+CONFIG_CMD_READLINE=y
+CONFIG_CMD_TIME=y
+CONFIG_CMD_ECHO_E=y
+CONFIG_CMD_LOADB=y
+CONFIG_CMD_IOMEM=y
+CONFIG_CMD_FLASH=y
+CONFIG_CMD_MD5SUM=y
+CONFIG_CMD_SHA1SUM=y
+CONFIG_CMD_SHA224SUM=y
+CONFIG_CMD_SHA256SUM=y
+CONFIG_CMD_BOOTM_SHOW_TYPE=y
+CONFIG_CMD_BOOTM_VERBOSE=y
+CONFIG_CMD_BOOTM_INITRD=y
+CONFIG_CMD_BOOTM_OFTREE=y
+CONFIG_CMD_BOOTM_OFTREE_UIMAGE=y
+CONFIG_CMD_BOOTM_AIMAGE=y
+CONFIG_CMD_RESET=y
+CONFIG_CMD_GO=y
+CONFIG_CMD_TIMEOUT=y
+CONFIG_CMD_PARTITION=y
+CONFIG_CMD_MAGICVAR=y
+CONFIG_CMD_MAGICVAR_HELP=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_UNCOMPRESS=y
+CONFIG_CMD_I2C=y
+CONFIG_DRIVER_SERIAL_USB=y
+CONFIG_DRIVER_SERIAL_NS16550=y
+CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
+CONFIG_BAUDRATE=57600
+# CONFIG_SPI is not set
+CONFIG_I2C=y
+CONFIG_I2C_OMAP=y
+CONFIG_I2C_TWLCORE=y
+CONFIG_I2C_TWL6030=y
+CONFIG_MCI=y
+CONFIG_MCI_STARTUP=y
+CONFIG_MCI_OMAP_HSMMC=y
+CONFIG_FS_FAT=y
+CONFIG_FS_FAT_WRITE=y
+CONFIG_FS_FAT_LFN=y
+CONFIG_FS_USBBOOT=y
diff --git a/arch/arm/configs/archosg9_xload_defconfig b/arch/arm/configs/archosg9_xload_defconfig
new file mode 100644
index 0000000..6186011
--- /dev/null
+++ b/arch/arm/configs/archosg9_xload_defconfig
@@ -0,0 +1,25 @@
+CONFIG_MACH_ARCHOSG9=y
+CONFIG_ARCH_OMAP=y
+CONFIG_ARCH_OMAP4=y
+# CONFIG_OMAP_GPMC is not set
+CONFIG_OMAP_BUILD_IFT=y
+CONFIG_BAREBOX_MAX_IMAGE_SIZE=0xC000
+CONFIG_AEABI=y
+CONFIG_USB_BOOT=y
+CONFIG_SHARE_USB_HANDLE=y
+# CONFIG_CMD_ARM_CPUINFO is not set
+CONFIG_TEXT_BASE=0x40300000
+CONFIG_MEMORY_LAYOUT_FIXED=y
+CONFIG_STACK_BASE=0x8f000000
+CONFIG_MALLOC_BASE=0x84000000
+CONFIG_MALLOC_SIZE=0x2000000
+CONFIG_SHELL_NONE=y
+# CONFIG_ERRNO_MESSAGES is not set
+# CONFIG_TIMESTAMP is not set
+# CONFIG_CONSOLE_FULL is not set
+# CONFIG_DEFAULT_ENVIRONMENT is not set
+CONFIG_DRIVER_SERIAL_USB=y
+# CONFIG_SPI is not set
+# CONFIG_FS_RAMFS is not set
+# CONFIG_FS_DEVFS is not set
+CONFIG_FS_USBBOOT=y
diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig
index 8e0a0b3..464c8a4 100644
--- a/arch/arm/mach-omap/Kconfig
+++ b/arch/arm/mach-omap/Kconfig
@@ -125,6 +125,7 @@ config BOARDINFO
 	default "Phytec phyCORE pcm049" if MACH_PCM049
 	default "Phytec phyCARD-A-L1" if MACH_PCAAL1
 	default "Phytec phyCARD-A-XL2" if MACH_PCAAXL2
+	default "Archos G9" if MACH_ARCHOSG9
 
 choice
 	prompt "Select OMAP board"
@@ -160,6 +161,14 @@ config MACH_PANDA
 	help
 	  Say Y here if you are using OMAP4 Panda board
 
+config MACH_ARCHOSG9
+	bool "Archos G9 tablets"
+	select HAVE_NOSHELL
+	select MACH_HAS_LOWLEVEL_INIT
+	depends on ARCH_OMAP4
+	help
+	  Say Y here if you are using OMAP4-based Archos G9 tablet
+
 config MACH_PCM049
 	bool "Phytec phyCORE pcm049"
 	select HAVE_NOSHELL
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types
index 325513f..a21da3b 100644
--- a/arch/arm/tools/mach-types
+++ b/arch/arm/tools/mach-types
@@ -4148,3 +4148,4 @@ msm8625_evt		MACH_MSM8625_EVT	MSM8625_EVT		4193
 mx53_sellwood		MACH_MX53_SELLWOOD	MX53_SELLWOOD		4194
 somiq_am35		MACH_SOMIQ_AM35		SOMIQ_AM35		4195
 somiq_am37		MACH_SOMIQ_AM37		SOMIQ_AM37		4196
+omap4_archosg9		MACH_OMAP4_ARCHOSG9	OMAP4_ARCHOSG9		5032
-- 
1.7.12.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet
  2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
                     ` (6 preceding siblings ...)
  2012-09-25 22:59   ` [PATCH 7/7] Add support for Archos G9 tablet vj
@ 2012-09-26  3:57   ` Antony Pavlov
  2012-09-26  7:06   ` Sascha Hauer
  2012-09-26  8:16   ` Sascha Hauer
  9 siblings, 0 replies; 17+ messages in thread
From: Antony Pavlov @ 2012-09-26  3:57 UTC (permalink / raw)
  To: vj; +Cc: barebox

Hi!

You have did a good job!

But please check your patch series with the scripts/checkpatch.pl
script before submiting it to the maillist.

On 26 September 2012 02:59, vj <vicencb@gmail.com> wrote:
> Hello,
> A this is my first contribution, so I'm basically requesting for comments.
>
> The attached patch adds support for Archos G9 tablet wich uses an OMAP4460 cpu.
> The tablet by default only boots from internal flash, so to test barebox on it a hardware tweak is required: change the sys_boot configuration.
> Once done the tablet can be booted with the following command:
> A sudo scripts/usbboot <first_stage> <rootfs>
>
> The patch contains
> A 1.- specific changes for OMAP4460
> A 2.- support for usb-booting
> A 3.- support for console on usb
> A 4.- support for file transfer through usb
> A 5.- some minor bug fixes
> A 6.- adds support for archosg9 board
>
> A question I have is what does omap_vector_init do?
> It breaks usb-booting.
> An improvement to be done would be to split the file "scripts/usbboot.c" into a header and two c files, but the Makefile framework seemed to me to do not allow that.
>
> In any case the patch should be tested with other boards to check it does not breaks something.
>
> vj (7):
>   Improved an error message and solved a minor bug
>   added debug info for twl6030
>   OMAP specific changes
>   Add USB booting capabilities to OMAP
>   add console support over the same USB used for booting
>   add filesystem support over the same USB used for booting
>   Add support for Archos G9 tablet
>
>  arch/arm/Makefile                               |   1 +
>  arch/arm/boards/archosg9/Makefile               |   1 +
>  arch/arm/boards/archosg9/board.c                |  58 ++
>  arch/arm/boards/archosg9/env/bin/init           |  18 +
>  arch/arm/boards/archosg9/env/config             |   2 +
>  arch/arm/boards/archosg9/lowlevel.c             | 126 ++++
>  arch/arm/boards/archosg9/mux.c                  | 226 +++++++
>  arch/arm/configs/archosg9_defconfig             |  70 +++
>  arch/arm/configs/archosg9_xload_defconfig       |  25 +
>  arch/arm/cpu/cpu.c                              |   1 +
>  arch/arm/lib/armlinux.c                         |   2 +-
>  arch/arm/lib/barebox.lds.S                      |  10 +
>  arch/arm/mach-omap/Kconfig                      |  30 +
>  arch/arm/mach-omap/Makefile                     |   1 +
>  arch/arm/mach-omap/include/mach/omap4-mux.h     |  80 ++-
>  arch/arm/mach-omap/include/mach/omap4-silicon.h |  13 +
>  arch/arm/mach-omap/include/mach/omap4_rom_usb.h | 146 +++++
>  arch/arm/mach-omap/include/mach/xload.h         |   1 +
>  arch/arm/mach-omap/omap4_generic.c              |   6 +
>  arch/arm/mach-omap/omap4_rom_usb.c              | 189 ++++++
>  arch/arm/mach-omap/xload.c                      |  26 +
>  arch/arm/tools/mach-types                       |   1 +
>  drivers/mci/omap_hsmmc.c                        |   2 +-
>  drivers/mfd/twl6030.c                           |  13 +
>  drivers/serial/Kconfig                          |   7 +
>  drivers/serial/Makefile                         |   1 +
>  drivers/serial/serial_usb.c                     |  64 ++
>  fs/Kconfig                                      |   5 +
>  fs/Makefile                                     |   1 +
>  fs/usbbootfs.c                                  | 195 ++++++
>  include/mfd/twl6030.h                           |   8 +
>  scripts/.gitignore                              |   1 +
>  scripts/Makefile                                |   3 +
>  scripts/usbboot.c                               | 797 ++++++++++++++++++++++++
>  34 files changed, 2100 insertions(+), 30 deletions(-)
>  create mode 100644 arch/arm/boards/archosg9/Makefile
>  create mode 100644 arch/arm/boards/archosg9/board.c
>  create mode 100644 arch/arm/boards/archosg9/env/bin/init
>  create mode 100644 arch/arm/boards/archosg9/env/config
>  create mode 100644 arch/arm/boards/archosg9/lowlevel.c
>  create mode 100644 arch/arm/boards/archosg9/mux.c
>  create mode 100644 arch/arm/configs/archosg9_defconfig
>  create mode 100644 arch/arm/configs/archosg9_xload_defconfig
>  create mode 100644 arch/arm/mach-omap/include/mach/omap4_rom_usb.h
>  create mode 100644 arch/arm/mach-omap/omap4_rom_usb.c
>  create mode 100644 drivers/serial/serial_usb.c
>  create mode 100644 fs/usbbootfs.c
>  create mode 100644 scripts/usbboot.c
>
> --
> 1.7.12.1
>
>
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox



-- 
Best regards,
  Antony Pavlov

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet
  2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
                     ` (7 preceding siblings ...)
  2012-09-26  3:57   ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet Antony Pavlov
@ 2012-09-26  7:06   ` Sascha Hauer
  2012-09-26 22:38     ` vj
  2012-09-26  8:16   ` Sascha Hauer
  9 siblings, 1 reply; 17+ messages in thread
From: Sascha Hauer @ 2012-09-26  7:06 UTC (permalink / raw)
  To: vj; +Cc: barebox

On Wed, Sep 26, 2012 at 12:59:47AM +0200, vj wrote:
> Hello,
> A this is my first contribution, so I'm basically requesting for comments.
> 
> The attached patch adds support for Archos G9 tablet wich uses an OMAP4460 cpu.

Nice :)
I should have bought that one instead of a Acer.


> 
> A question I have is what does omap_vector_init do?
> It breaks usb-booting.

I digged around a bit. The funny thing is that this was introduced with
OMAP4 support and is only done on OMAP4. U-Boot instead has the following:

> #if !defined(CONFIG_TEGRA2)
> /*
>  * Setup vector:
>  * (OMAP4 spl TEXT_BASE is not 32 byte aligned.
>  * Continue to use ROM code vector only in OMAP4 spl)
>  */
> #if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))
> 	/* Set V=0 in CP15 SCTRL register - for VBAR to point to vector
>  * */
> 	mrc	p15, 0, r0, c1, c0, 0	@ Read CP15 SCTRL Register
> 	bic	r0, #CR_V		@ V = 0
> 	mcr	p15, 0, r0, c1, c0, 0	@ Write CP15 SCTRL Register
> 
> 	/* Set vector address in CP15 VBAR register */
> 	ldr	r0, =_start
> 	mcr	p15, 0, r0, c12, c0, 0	@Set VBAR
> #endif
> #endif	/* !Tegra2 */

So in U-Boot it's done for every ARMv7 *except* OMAP4 (and Tegra)

ARM has this information about it:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0434b/CIHHDAIH.html

> Purpose
> 
>     Provides the exception base address for exceptions that are not
>     handled in monitor mode.
> 
> Usage constraints
> 
>     The VBAR is:
> 
>         * only accessible in privileged modes
>         * only accessible in Secure state.

I think this is necessary to move the exception vector from ROM to our
own code. Does it work to read the VBAR register using the following
instruction:

	MRC p15, 0, <Rd>, c12, c0, 0 ; Read VBAR Register

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 1/7] Improved an error message and solved a minor bug
  2012-09-25 22:59   ` [PATCH 1/7] Improved an error message and solved a minor bug vj
@ 2012-09-26  7:11     ` Sascha Hauer
  0 siblings, 0 replies; 17+ messages in thread
From: Sascha Hauer @ 2012-09-26  7:11 UTC (permalink / raw)
  To: vj; +Cc: barebox

On Wed, Sep 26, 2012 at 12:59:48AM +0200, vj wrote:
> ---
>  arch/arm/lib/armlinux.c  | 2 +-
>  drivers/mci/omap_hsmmc.c | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c
> index 191274e..74d59a9 100644
> --- a/arch/arm/lib/armlinux.c
> +++ b/arch/arm/lib/armlinux.c
> @@ -80,7 +80,7 @@ void armlinux_set_revision(unsigned int rev)
>  #ifdef CONFIG_ENVIRONMENT_VARIABLES
>  	export_env_ull("armlinux_system_rev", rev);
>  #else
> -	return armlinux_system_rev;
> +	armlinux_system_rev = rev;
>  #endif
>  }
>  
> diff --git a/drivers/mci/omap_hsmmc.c b/drivers/mci/omap_hsmmc.c
> index e0b245b..e6f4e47 100644
> --- a/drivers/mci/omap_hsmmc.c
> +++ b/drivers/mci/omap_hsmmc.c
> @@ -238,7 +238,7 @@ static int mmc_init_setup(struct mci_host *mci, struct device_d *dev)
>  	start = get_time_ns();
>  	while ((readl(&mmc_base->sysstatus) & RESETDONE) == 0) {
>  		if (is_timeout(start, SECOND)) {
> -			dev_dbg(hsmmc->dev, "timedout waiting for cc2!\n");
> +			dev_dbg(hsmmc->dev, "timeout waiting for reset done\n");
>  			return -ETIMEDOUT;
>  		}
>  	}

This looks good, but it should be two patches. Please always give the
subject the context of the patches, that would be "ARM: ..." for the
first one and "mmc omap: ..."

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 3/7] OMAP specific changes
  2012-09-25 22:59   ` [PATCH 3/7] OMAP specific changes vj
@ 2012-09-26  7:18     ` Sascha Hauer
  0 siblings, 0 replies; 17+ messages in thread
From: Sascha Hauer @ 2012-09-26  7:18 UTC (permalink / raw)
  To: vj; +Cc: barebox

On Wed, Sep 26, 2012 at 12:59:50AM +0200, vj wrote:
> mux:
>   added definitions with the same names as in the datasheet
>   added two new definitions
>   changed PAD definitions to have the same names in the datasheet
>   changed value for jtag_tck to match the one on the datasheet
> added base addresses and usb bootsrc
> ---
>  arch/arm/mach-omap/include/mach/omap4-mux.h     | 80 ++++++++++++++++---------
>  arch/arm/mach-omap/include/mach/omap4-silicon.h | 13 ++++
>  arch/arm/mach-omap/include/mach/xload.h         |  1 +
>  arch/arm/mach-omap/omap4_generic.c              |  4 ++
>  4 files changed, 70 insertions(+), 28 deletions(-)
> 
> @@ -301,34 +325,34 @@ struct pad_conf_entry {
>  #define WKUP_REVISION		0x0000
>  #define WKUP_HWINFO		0x0004
>  #define WKUP_SYSCONFIG		0x0010
> -#define PAD0_SIM_IO		0x0040
> -#define PAD1_SIM_CLK		0x0042
> -#define PAD0_SIM_RESET		0x0044
> -#define PAD1_SIM_CD		0x0046
> -#define PAD0_SIM_PWRCTRL		0x0048
> -#define PAD1_SR_SCL		0x004A
> -#define PAD0_SR_SDA		0x004C
> -#define PAD1_FREF_XTAL_IN		0x004E
> -#define PAD0_FREF_SLICER_IN	0x0050
> -#define PAD1_FREF_CLK_IOREQ	0x0052
> -#define PAD0_FREF_CLK0_OUT		0x0054
> -#define PAD1_FREF_CLK3_REQ		0x0056
> -#define PAD0_FREF_CLK3_OUT		0x0058
> -#define PAD1_FREF_CLK4_REQ		0x005A
> -#define PAD0_FREF_CLK4_OUT		0x005C
> -#define PAD1_SYS_32K		0x005E
> -#define PAD0_SYS_NRESPWRON		0x0060
> -#define PAD1_SYS_NRESWARM		0x0062
> -#define PAD0_SYS_PWR_REQ		0x0064
> -#define PAD1_SYS_PWRON_RESET	0x0066
> -#define PAD0_SYS_BOOT6		0x0068
> -#define PAD1_SYS_BOOT7		0x006A
> -#define PAD0_JTAG_NTRST		0x006C
> -#define PAD1_JTAG_TCK		0x006D
> -#define PAD0_JTAG_RTCK		0x0070
> -#define PAD1_JTAG_TMS_TMSC		0x0072
> -#define PAD0_JTAG_TDI		0x0074
> -#define PAD1_JTAG_TDO		0x0076
> +#define GPIO_WK0		0x0040
> +#define GPIO_WK1		0x0042
> +#define GPIO_WK2		0x0044
> +#define GPIO_WK3		0x0046
> +#define GPIO_WK4		0x0048
> +#define SR_SCL			0x004A
> +#define SR_SDA			0x004C
> +#define FREF_XTAL_IN		0x004E
> +#define FREF_SLICER_IN		0x0050
> +#define FREF_CLK_IOREQ		0x0052
> +#define FREF_CLK0_OUT		0x0054
> +#define FREF_CLK3_REQ		0x0056
> +#define FREF_CLK3_OUT		0x0058
> +#define FREF_CLK4_REQ		0x005A
> +#define FREF_CLK4_OUT		0x005C
> +#define SYS_32K		0x005E
> +#define SYS_NRESPWRON		0x0060
> +#define SYS_NRESWARM		0x0062
> +#define SYS_PWR_REQ		0x0064
> +#define SYS_PWRON_RESET_OUT	0x0066
> +#define SYS_BOOT6		0x0068
> +#define SYS_BOOT7		0x006A
> +#define JTAG_NTRST		0x006C
> +#define JTAG_TCK		0x006E
> +#define JTAG_RTCK		0x0070
> +#define JTAG_TMS_TMSC		0x0072
> +#define JTAG_TDI		0x0074
> +#define JTAG_TDO		0x0076

Renaming these is ok, but you have to change the code which uses these
defines aswell:

./arch/arm/boards/phycard-a-xl2/mux.c:220:      {PAD1_SR_SCL, (PTU | IEN| M0)}, /* sr_scl */
./arch/arm/boards/pcm049/mux.c:220:     {PAD1_SR_SCL, (PTU | IEN | M0)},/* sr_scl */
./arch/arm/boards/panda/mux.c:220:      { PAD1_SR_SCL, PTU | IEN | M0/* sr_scl */ },

> diff --git a/arch/arm/mach-omap/include/mach/xload.h b/arch/arm/mach-omap/include/mach/xload.h
> index 844b57f..cfc3f68 100644
> --- a/arch/arm/mach-omap/include/mach/xload.h
> +++ b/arch/arm/mach-omap/include/mach/xload.h
> @@ -8,6 +8,7 @@ enum omap_boot_src {
>  	OMAP_BOOTSRC_UNKNOWN,
>  	OMAP_BOOTSRC_MMC1,
>  	OMAP_BOOTSRC_NAND,
> +	OMAP_BOOTSRC_USB1,
>  };
>  
>  enum omap_boot_src omap3_bootsrc(void);
> diff --git a/arch/arm/mach-omap/omap4_generic.c b/arch/arm/mach-omap/omap4_generic.c
> index 617d786..55d8fe3 100644
> --- a/arch/arm/mach-omap/omap4_generic.c
> +++ b/arch/arm/mach-omap/omap4_generic.c
> @@ -481,6 +481,10 @@ enum omap_boot_src omap4_bootsrc(void)
>  		return OMAP_BOOTSRC_MMC1;
>  	if (bootsrc & (1 << 3))
>  		return OMAP_BOOTSRC_NAND;
> +#ifdef CONFIG_USB_BOOT
> +	if (bootsrc & (1<<20))
> +		return OMAP_BOOTSRC_USB1;
> +#endif

This seems to be too early in the series, CONFIG_USB_BOOT is not yet
introduced. You can drop the ifdef anyway, disabling CONFIG_USB_BOOT
doesn't necessarily mean the SoC has not been booted from USB ;)

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 4/7] Add USB booting capabilities to OMAP
  2012-09-25 22:59   ` [PATCH 4/7] Add USB booting capabilities to OMAP vj
@ 2012-09-26  7:45     ` Sascha Hauer
  2012-09-28  0:27       ` vj
  0 siblings, 1 reply; 17+ messages in thread
From: Sascha Hauer @ 2012-09-26  7:45 UTC (permalink / raw)
  To: vj; +Cc: barebox

On Wed, Sep 26, 2012 at 12:59:51AM +0200, vj wrote:
> ---
>  arch/arm/cpu/cpu.c                              |   1 +
>  arch/arm/lib/barebox.lds.S                      |  10 +
>  arch/arm/mach-omap/Kconfig                      |  21 +
>  arch/arm/mach-omap/Makefile                     |   1 +
>  arch/arm/mach-omap/include/mach/omap4_rom_usb.h | 146 +++++
>  arch/arm/mach-omap/omap4_generic.c              |   2 +
>  arch/arm/mach-omap/omap4_rom_usb.c              | 189 ++++++
>  arch/arm/mach-omap/xload.c                      |  26 +
>  scripts/.gitignore                              |   1 +
>  scripts/Makefile                                |   3 +
>  scripts/usbboot.c                               | 797 ++++++++++++++++++++++++
>  11 files changed, 1197 insertions(+)
>  create mode 100644 arch/arm/mach-omap/include/mach/omap4_rom_usb.h
>  create mode 100644 arch/arm/mach-omap/omap4_rom_usb.c
>  create mode 100644 scripts/usbboot.c
> 
> diff --git a/arch/arm/cpu/cpu.c b/arch/arm/cpu/cpu.c
> index 71ef8c0..05343de 100644
> --- a/arch/arm/cpu/cpu.c
> +++ b/arch/arm/cpu/cpu.c
> @@ -89,6 +89,7 @@ void arch_shutdown(void)
>  		: "r0", "r1", "r2", "r3", "r6", "r10", "r12", "lr", "cc", "memory"
>  	);
>  #endif
> +	__asm__ __volatile__ ("cpsid i\n");
>  }
>  
>  #ifdef CONFIG_THUMB2_BAREBOX
> diff --git a/arch/arm/lib/barebox.lds.S b/arch/arm/lib/barebox.lds.S
> index a69013f..ff7b63d 100644
> --- a/arch/arm/lib/barebox.lds.S
> +++ b/arch/arm/lib/barebox.lds.S
> @@ -97,6 +97,16 @@ SECTIONS
>  	__bss_start = .;
>  	.bss : { *(.bss*) }
>  	__bss_stop = .;
> +#ifdef CONFIG_SHARE_USB_HANDLE
> +    /*
> +     * Reserve space for the USB handle
> +     */
> +	. = CONFIG_USB_HANDLE_HANDOVER;
> +	. = ALIGN(4);
> +	__usb_handle = .;
> +	/* . += sizeof(struct usb); */
> +	. += 84;
> +#endif

If I understand correctly the first stage loader puts some data here
where a second stage barebox (configured with the same value for
CONFIG_USB_HANDLE_HANDOVER) will pick it up.

This seems to be a bit fragile. Fortunately Jan has posted a series
that gives the control of the reset vector to the boards, which means
that both stages do not have to agree on an addres, but instead a
pointer can be passed from the first to the second stage.

> +int usb_open(void)

So this uses the OMAP4 ROM to do USB communication, right? The functions
should have a omap_rom_* prefix then, otherwise it's not clear for a
reader which context these functions have.

The calling of the ROM code btw explains why the setting of VBAR breaks
USB boot. The ROM probably uses the vectors.

> +
> +	n = rom_get_per_driver(&pusb->io, boot->device_type);
> +	if (n)
> +		return n;
> +
> +	pusb->dread.xfer_mode = boot->xfer_mode;
> +	pusb->dread.options = boot->options;
> +	pusb->dread.device_type = boot->device_type;
> +
> +	pusb->dwrite.xfer_mode = boot->xfer_mode;
> +	pusb->dwrite.options = boot->options;
> +	pusb->dwrite.device_type = boot->device_type;
> +#else
> +#ifdef CONFIG_MMU
> +#error USB communications not working under MMU

You can add the following to CONFIG_OMAP4_USB_BOOT instead:

	depends on !MMU

So that an invalid config is not allowed in the first place.


> diff --git a/scripts/usbboot.c b/scripts/usbboot.c

This should also be named omap4-usbboot.c, or maybe, if the works on
other OMAPs, just omap-usboot.c

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet
  2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
                     ` (8 preceding siblings ...)
  2012-09-26  7:06   ` Sascha Hauer
@ 2012-09-26  8:16   ` Sascha Hauer
  9 siblings, 0 replies; 17+ messages in thread
From: Sascha Hauer @ 2012-09-26  8:16 UTC (permalink / raw)
  To: vj; +Cc: barebox

On Wed, Sep 26, 2012 at 12:59:47AM +0200, vj wrote:
> Hello,
> A this is my first contribution, so I'm basically requesting for comments.
> 
> The attached patch adds support for Archos G9 tablet wich uses an OMAP4460 cpu.
> The tablet by default only boots from internal flash, so to test
> barebox on it a hardware tweak is required: change the sys_boot
> configuration.  Once done the tablet can be booted with the following
> command:
> A sudo scripts/usbboot <first_stage> <rootfs>
> 
> The patch contains
> A 1.- specific changes for OMAP4460
> A 2.- support for usb-booting
> A 3.- support for console on usb
> A 4.- support for file transfer through usb
> A 5.- some minor bug fixes
> A 6.- adds support for archosg9 board
> 
> A question I have is what does omap_vector_init do?
> It breaks usb-booting.
> An improvement to be done would be to split the file
> "scripts/usbboot.c" into a header and two c files, but the Makefile
> framework seemed to me to do not allow that.
> 
> In any case the patch should be tested with other boards to check it
> does not breaks something.


This is very interesting stuff indeed.

Now that I read through the series I can say that the biggest single
problem with it is the missing context of filenames and function names.
All OMAP specific stuff should have a omap_ or omap4_ prefix.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet
  2012-09-26  7:06   ` Sascha Hauer
@ 2012-09-26 22:38     ` vj
  0 siblings, 0 replies; 17+ messages in thread
From: vj @ 2012-09-26 22:38 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox


[-- Attachment #1.1: Type: text/plain, Size: 2984 bytes --]

Hi Sascha,
 I'm not an expert in ARM assembly, so, if this is correct:
    u32 r=0;
    asm ("mrc p15, 0, %0, c12, c0, 0" : "=r" (r));
    printf("MRC p15, 0, <Rd>, c12, c0, 0 returns 0x%08X\n", r);
    r=-1;
    asm ("mrc p15, 0, %0, c12, c0, 0" : "=r" (r));
    printf("MRC p15, 0, <Rd>, c12, c0, 0 returns 0x%08X\n", r);
the return value is:
    MRC p15, 0, <Rd>, c12, c0, 0 returns 0x00030000
    MRC p15, 0, <Rd>, c12, c0, 0 returns 0x00030000
Which is the base address of "ROM exception vectors" and the address of the
"Reset" exception vector.
This is the value when omap_vector_init is disabled.

Hope this helps,
  Vicente.


On Wed, Sep 26, 2012 at 9:06 AM, Sascha Hauer <s.hauer@pengutronix.de>wrote:

> On Wed, Sep 26, 2012 at 12:59:47AM +0200, vj wrote:
> > Hello,
> > A this is my first contribution, so I'm basically requesting for
> comments.
> >
> > The attached patch adds support for Archos G9 tablet wich uses an
> OMAP4460 cpu.
>
> Nice :)
> I should have bought that one instead of a Acer.
>
>
> >
> > A question I have is what does omap_vector_init do?
> > It breaks usb-booting.
>
> I digged around a bit. The funny thing is that this was introduced with
> OMAP4 support and is only done on OMAP4. U-Boot instead has the following:
>
> > #if !defined(CONFIG_TEGRA2)
> > /*
> >  * Setup vector:
> >  * (OMAP4 spl TEXT_BASE is not 32 byte aligned.
> >  * Continue to use ROM code vector only in OMAP4 spl)
> >  */
> > #if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))
> >       /* Set V=0 in CP15 SCTRL register - for VBAR to point to vector
> >  * */
> >       mrc     p15, 0, r0, c1, c0, 0   @ Read CP15 SCTRL Register
> >       bic     r0, #CR_V               @ V = 0
> >       mcr     p15, 0, r0, c1, c0, 0   @ Write CP15 SCTRL Register
> >
> >       /* Set vector address in CP15 VBAR register */
> >       ldr     r0, =_start
> >       mcr     p15, 0, r0, c12, c0, 0  @Set VBAR
> > #endif
> > #endif        /* !Tegra2 */
>
> So in U-Boot it's done for every ARMv7 *except* OMAP4 (and Tegra)
>
> ARM has this information about it:
>
>
> http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0434b/CIHHDAIH.html
>
> > Purpose
> >
> >     Provides the exception base address for exceptions that are not
> >     handled in monitor mode.
> >
> > Usage constraints
> >
> >     The VBAR is:
> >
> >         * only accessible in privileged modes
> >         * only accessible in Secure state.
>
> I think this is necessary to move the exception vector from ROM to our
> own code. Does it work to read the VBAR register using the following
> instruction:
>
>         MRC p15, 0, <Rd>, c12, c0, 0 ; Read VBAR Register
>
> Sascha
>
> --
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
>

[-- Attachment #1.2: Type: text/html, Size: 4143 bytes --]

[-- Attachment #2: Type: text/plain, Size: 149 bytes --]

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 4/7] Add USB booting capabilities to OMAP
  2012-09-26  7:45     ` Sascha Hauer
@ 2012-09-28  0:27       ` vj
  2012-09-28  7:32         ` Sascha Hauer
  0 siblings, 1 reply; 17+ messages in thread
From: vj @ 2012-09-28  0:27 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox


[-- Attachment #1.1: Type: text/plain, Size: 4290 bytes --]

Hi Sascha,
 I've been playing with passing some data from first to second stage using
Jan's patches.
It worked fine, but in my case I want to store this data on a global
variable, which is cleared as it's in the BSS.
There is a clean workarround to this issue?

Thanks,
  Vicente.

On Wed, Sep 26, 2012 at 9:45 AM, Sascha Hauer <s.hauer@pengutronix.de>wrote:

> On Wed, Sep 26, 2012 at 12:59:51AM +0200, vj wrote:
> > ---
> >  arch/arm/cpu/cpu.c                              |   1 +
> >  arch/arm/lib/barebox.lds.S                      |  10 +
> >  arch/arm/mach-omap/Kconfig                      |  21 +
> >  arch/arm/mach-omap/Makefile                     |   1 +
> >  arch/arm/mach-omap/include/mach/omap4_rom_usb.h | 146 +++++
> >  arch/arm/mach-omap/omap4_generic.c              |   2 +
> >  arch/arm/mach-omap/omap4_rom_usb.c              | 189 ++++++
> >  arch/arm/mach-omap/xload.c                      |  26 +
> >  scripts/.gitignore                              |   1 +
> >  scripts/Makefile                                |   3 +
> >  scripts/usbboot.c                               | 797
> ++++++++++++++++++++++++
> >  11 files changed, 1197 insertions(+)
> >  create mode 100644 arch/arm/mach-omap/include/mach/omap4_rom_usb.h
> >  create mode 100644 arch/arm/mach-omap/omap4_rom_usb.c
> >  create mode 100644 scripts/usbboot.c
> >
> > diff --git a/arch/arm/cpu/cpu.c b/arch/arm/cpu/cpu.c
> > index 71ef8c0..05343de 100644
> > --- a/arch/arm/cpu/cpu.c
> > +++ b/arch/arm/cpu/cpu.c
> > @@ -89,6 +89,7 @@ void arch_shutdown(void)
> >               : "r0", "r1", "r2", "r3", "r6", "r10", "r12", "lr", "cc",
> "memory"
> >       );
> >  #endif
> > +     __asm__ __volatile__ ("cpsid i\n");
> >  }
> >
> >  #ifdef CONFIG_THUMB2_BAREBOX
> > diff --git a/arch/arm/lib/barebox.lds.S b/arch/arm/lib/barebox.lds.S
> > index a69013f..ff7b63d 100644
> > --- a/arch/arm/lib/barebox.lds.S
> > +++ b/arch/arm/lib/barebox.lds.S
> > @@ -97,6 +97,16 @@ SECTIONS
> >       __bss_start = .;
> >       .bss : { *(.bss*) }
> >       __bss_stop = .;
> > +#ifdef CONFIG_SHARE_USB_HANDLE
> > +    /*
> > +     * Reserve space for the USB handle
> > +     */
> > +     . = CONFIG_USB_HANDLE_HANDOVER;
> > +     . = ALIGN(4);
> > +     __usb_handle = .;
> > +     /* . += sizeof(struct usb); */
> > +     . += 84;
> > +#endif
>
> If I understand correctly the first stage loader puts some data here
> where a second stage barebox (configured with the same value for
> CONFIG_USB_HANDLE_HANDOVER) will pick it up.
>
> This seems to be a bit fragile. Fortunately Jan has posted a series
> that gives the control of the reset vector to the boards, which means
> that both stages do not have to agree on an addres, but instead a
> pointer can be passed from the first to the second stage.
>
> > +int usb_open(void)
>
> So this uses the OMAP4 ROM to do USB communication, right? The functions
> should have a omap_rom_* prefix then, otherwise it's not clear for a
> reader which context these functions have.
>
> The calling of the ROM code btw explains why the setting of VBAR breaks
> USB boot. The ROM probably uses the vectors.
>
> > +
> > +     n = rom_get_per_driver(&pusb->io, boot->device_type);
> > +     if (n)
> > +             return n;
> > +
> > +     pusb->dread.xfer_mode = boot->xfer_mode;
> > +     pusb->dread.options = boot->options;
> > +     pusb->dread.device_type = boot->device_type;
> > +
> > +     pusb->dwrite.xfer_mode = boot->xfer_mode;
> > +     pusb->dwrite.options = boot->options;
> > +     pusb->dwrite.device_type = boot->device_type;
> > +#else
> > +#ifdef CONFIG_MMU
> > +#error USB communications not working under MMU
>
> You can add the following to CONFIG_OMAP4_USB_BOOT instead:
>
>         depends on !MMU
>
> So that an invalid config is not allowed in the first place.
>
>
> > diff --git a/scripts/usbboot.c b/scripts/usbboot.c
>
> This should also be named omap4-usbboot.c, or maybe, if the works on
> other OMAPs, just omap-usboot.c
>
> Sascha
>
> --
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
>

[-- Attachment #1.2: Type: text/html, Size: 5677 bytes --]

[-- Attachment #2: Type: text/plain, Size: 149 bytes --]

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH 4/7] Add USB booting capabilities to OMAP
  2012-09-28  0:27       ` vj
@ 2012-09-28  7:32         ` Sascha Hauer
  0 siblings, 0 replies; 17+ messages in thread
From: Sascha Hauer @ 2012-09-28  7:32 UTC (permalink / raw)
  To: vj; +Cc: barebox

On Fri, Sep 28, 2012 at 02:27:54AM +0200, vj wrote:
> Hi Sascha,
>  I've been playing with passing some data from first to second stage using
> Jan's patches.
> It worked fine, but in my case I want to store this data on a global
> variable, which is cleared as it's in the BSS.
> There is a clean workarround to this issue?

The workaound would be to initialize the variable so it can't be in bss.
I'm still looking for a better way to do it.

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

end of thread, other threads:[~2012-09-28  7:32 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <[RFC][PATCH] archosg9: add support for tablet>
2012-09-25 22:59 ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet vj
2012-09-25 22:59   ` [PATCH 1/7] Improved an error message and solved a minor bug vj
2012-09-26  7:11     ` Sascha Hauer
2012-09-25 22:59   ` [PATCH 2/7] added debug info for twl6030 vj
2012-09-25 22:59   ` [PATCH 3/7] OMAP specific changes vj
2012-09-26  7:18     ` Sascha Hauer
2012-09-25 22:59   ` [PATCH 4/7] Add USB booting capabilities to OMAP vj
2012-09-26  7:45     ` Sascha Hauer
2012-09-28  0:27       ` vj
2012-09-28  7:32         ` Sascha Hauer
2012-09-25 22:59   ` [PATCH 5/7] add console support over the same USB used for booting vj
2012-09-25 22:59   ` [PATCH 6/7] add filesystem " vj
2012-09-25 22:59   ` [PATCH 7/7] Add support for Archos G9 tablet vj
2012-09-26  3:57   ` [PATCH 0/7] [RFC][PATCH] archosg9: add support for tablet Antony Pavlov
2012-09-26  7:06   ` Sascha Hauer
2012-09-26 22:38     ` vj
2012-09-26  8:16   ` Sascha Hauer

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