* [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