Unable to get CF working on HP Jornada 700 flashrom

Kristoffer Ericson kristoffer.ericson at gmail.com
Wed Sep 22 12:52:37 EDT 2010


Greetings,

Ive looked at this for a couple of days now and havent reached any solution.
So any feedback whatsoever is greatly appreciated.

It boots up (from u-boot) but is unable to find the compact flash card and therefore
panics. I have however earlier (cant seem to reproduce it now) had a situation when the CF worked at the expense of the MCU, havent managed to get both working at same time.





Best wishes
Kristoffer Ericson

-------------- next part --------------
diff --git a/arch/arm/mach-sa1100/jornada720.c b/arch/arm/mach-sa1100/jornada720.c
index d3ec620..c3dd677 100644
--- a/arch/arm/mach-sa1100/jornada720.c
+++ b/arch/arm/mach-sa1100/jornada720.c
@@ -35,12 +35,13 @@
 
 #include "generic.h"
 
+#define SBI_SKCR	__REG(SA1111_VBASE)
+
 /*
  * HP Documentation referred in this file:
  * http://www.jlime.com/downloads/development/docs/jornada7xx/jornada720.txt
  */
 
-/* line 110 of HP's doc */
 #define TUCR_VAL	0x20000400
 
 /* memory space (line 52 of HP's doc) */
@@ -241,32 +242,104 @@ static struct platform_device jornada_ts_device = {
 	.id		= -1,
 };
 
+static struct platform_device jornada_bl_device = {
+	.name		= "jornada_bl",
+	.id		= -1,
+};
+
+static struct platform_device jornada_lcd_device = {
+	.name		= "jornada_lcd",
+	.id		= -1,
+};
+
+
 static struct platform_device *devices[] __initdata = {
 	&sa1111_device,
 	&jornada_ssp_device,
 	&s1d13xxxfb_device,
 	&jornada_kbd_device,
 	&jornada_ts_device,
+	&jornada_bl_device,
+	&jornada_lcd_device,
 };
 
 static int __init jornada720_init(void)
 {
 	int ret = -ENODEV;
+	int i;
 
-	if (machine_is_jornada720()) {
-		/* we want to use gpio20 as input to drive the clock of our uart 3 */
-		GPDR |= GPIO_GPIO20;	/* Clear gpio20 pin as input */
-		TUCR = TUCR_VAL;
-		GPSR = GPIO_GPIO20;	/* start gpio20 pin */
-		udelay(1);
-		GPCR = GPIO_GPIO20;	/* stop gpio20 */
-		udelay(1);
-		GPSR = GPIO_GPIO20;	/* restart gpio20 */
-		udelay(20);		/* give it some time to restart */
-
-		ret = platform_add_devices(devices, ARRAY_SIZE(devices));
-	}
+	printk(KERN_INFO "HP Jornada 710/720/728 Machine Init\n");
+
+/*
+ * PIN Settings from wince
+ *
+ * (GPDR) PINs configured as outputs (all others are inputs)
+ * GPIO8, GPIO11, GPIO17, GPIO19, GPIO20, GPIO21, GPIO24, GPIO25, GPIO27
+ *
+ * (GPSR) PINs configures as outputs with level high
+ * GPIO11, GPIO20, GPIO25
+ *
+ * (GPCR) PINs configured as pin level low
+ * GPIO08, GPIO17, GPIO19, GPIO21, GPIO24, GPIO27
+ *
+ * (GRER) PINs configured to detect rising edge GPIOs
+ * GPIO01, GPIO15, GPIO18
+ *
+ * (GFER) PINs configured to detect falling edge GPIOs
+ * GPIO15, GPIO18
+ *
+ * (GAFR) PINs configure to use alternate function
+ * GPIO21, GPIO22, GPIO27
+ *
+ * (PPDR) PIN directions (default after reset is input)
+ *  LDD(0,1,2,3) = General Purpose Output
+ *
+ * (PPSR) Pin Directions
+ *  LDD(4,5,6)
+ *  L_BIAS
+ */
+
+	sa1110_mb_disable();
+
+	/* we want to use gpio20 as input to drive the clock of our uart 3 */
+	GPDR |= GPIO_GPIO20;	/* make sure its set as ouput */
+	TUCR = TUCR_VAL; // reserve GPIO21/22 for use as MBGNT/MBREQ
+	GPSR = GPIO_GPIO20;	/* start gpio20 pin */
+	udelay(50);
+	GPCR = GPIO_GPIO20;	/* clear pin level gpio20 */
+	udelay(50);
+	GPSR = GPIO_GPIO20;	/* restart gpio20 */
+	udelay(50);		/* give it some time to restart */
+
+	SBI_SKCR = (SKCR_OE_EN | SKCR_PLL_BYPASS | SKCR_RDYEN);
+	mdelay(200);
+
+	SBI_SKCR = (SKCR_OE_EN | SKCR_PLL_BYPASS | SKCR_RDYEN | SKCR_RCLKEN);
+	PPDR = 0x000049FF;
+
+	/* Reset the MCU */
+	PPSR &= (PPC_L_FCLK | 0x80 | PPC_LDD(1) | PPC_LDD(0));
+	udelay(1000);
+
+	PPDR |= (PPC_L_FCLK | 0x80 | PPC_LDD(1) | PPC_LDD(0));
+	udelay(1000);
+
+	PPSR |= PPC_L_FCLK;
+	udelay(1000);
+
+	GPSR = GPIO_GPIO25;
+	GPDR |= GPIO_GPIO25;
+
+	Ser4SSCR0 = 0x0307;	// set 8-bit data, setting transmission rate
+	Ser4MCCR0 = 0x0;	// disable MCP and leave everything to the SSP
+	Ser4SSSR = 0x0;	// remove overruns (rest is read-only)
+	Ser4SSCR1 = 0x18;	// Inactive SCLK = high, starting position
+	Ser4SSCR0 = 0x0387;
+
+	while(Ser4SSSR & SSSR_RNE)
+		i = Ser4SSDR;
 
+	ret = platform_add_devices(devices, ARRAY_SIZE(devices));
 	return ret;
 }
 
@@ -353,7 +426,7 @@ static struct flash_platform_data jornada720_flash_data = {
 
 static struct resource jornada720_flash_resource = {
 	.start		= SA1100_CS0_PHYS,
-	.end		= SA1100_CS0_PHYS + SZ_32M - 1,
+	.end		= SA1100_CS0_PHYS + SZ_64M - 1,
 	.flags		= IORESOURCE_MEM,
 };
 


More information about the linux-arm-kernel mailing list