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