From bc057f91b55e95ba63810bd9c3a7b1734cebdfce Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Fri, 8 Feb 2008 06:34:11 +0000 Subject: Gigabeat S: Get boot to go a little father. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16245 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/imx31/gigabeat-s/ata-imx31.c | 39 +++++++++---------- firmware/target/arm/imx31/gigabeat-s/ata-target.h | 23 ++++++----- .../target/arm/imx31/gigabeat-s/button-imx31.c | 44 ++++++++++------------ 3 files changed, 51 insertions(+), 55 deletions(-) (limited to 'firmware/target/arm/imx31') diff --git a/firmware/target/arm/imx31/gigabeat-s/ata-imx31.c b/firmware/target/arm/imx31/gigabeat-s/ata-imx31.c index a61e848594..19e440724a 100644 --- a/firmware/target/arm/imx31/gigabeat-s/ata-imx31.c +++ b/firmware/target/arm/imx31/gigabeat-s/ata-imx31.c @@ -26,14 +26,14 @@ #include "pcf50606.h" #include "ata-target.h" -#define ATA_RST (1 << 6) - void ata_reset(void) { - ATA_CONTROL &= ~ATA_RST; + ATA_INTF_CONTROL &= ~ATA_ATA_RST; sleep(1); - ATA_CONTROL |= ATA_RST; + ATA_INTF_CONTROL |= ATA_ATA_RST; sleep(1); + + while (!(ATA_INTERRUPT_PENDING & ATA_CONTROLLER_IDLE)); } /* This function is called before enabling the USB bus */ @@ -44,7 +44,7 @@ void ata_enable(bool on) bool ata_is_coldstart(void) { - return 0; + return true; } unsigned long get_pll(bool serial) { @@ -110,26 +110,27 @@ unsigned long get_ata_clock(void) { void ata_device_init(void) { - ATA_CONTROL |= ATA_RST; /* Make sure we're not in reset mode */ + ATA_INTF_CONTROL |= ATA_ATA_RST; /* Make sure we're not in reset mode */ + + while (!(ATA_INTERRUPT_PENDING & ATA_CONTROLLER_IDLE)); /* Setup the timing for PIO mode */ int T = 1000 * 1000 * 1000 / get_ata_clock(); - TIME_OFF = 3; - TIME_ON = 3; - - TIME_1 = (T + 70)/T; - TIME_2W = (T + 290)/T; - TIME_2R = (T + 290)/T; - TIME_AX = (T + 50)/T; - TIME_PIO_RDX = 1; - TIME_4 = (T + 30)/T; - TIME_9 = (T + 20)/T; + ATA_TIME_OFF = 3; + ATA_TIME_ON = 3; + + ATA_TIME_1 = (T + 70)/T; + ATA_TIME_2W = (T + 290)/T; + ATA_TIME_2R = (T + 290)/T; + ATA_TIME_AX = (T + 50)/T; + ATA_TIME_PIO_RDX = 1; + ATA_TIME_4 = (T + 30)/T; + ATA_TIME_9 = (T + 20)/T; } #if !defined(BOOTLOADER) -void copy_read_sectors(unsigned char* buf, int wordcount) +void copy_write_sectors(const unsigned char* buf, int wordcount) { - (void)buf; - (void)wordcount; + (void)buf; (void)wordcount; } #endif diff --git a/firmware/target/arm/imx31/gigabeat-s/ata-target.h b/firmware/target/arm/imx31/gigabeat-s/ata-target.h index 6dd6da9134..8b37c37d48 100644 --- a/firmware/target/arm/imx31/gigabeat-s/ata-target.h +++ b/firmware/target/arm/imx31/gigabeat-s/ata-target.h @@ -23,20 +23,19 @@ #define PREFER_C_READING #define PREFER_C_WRITING #if !defined(BOOTLOADER) -#define ATA_OPTIMIZED_READING -void copy_read_sectors(unsigned char* buf, int wordcount); +#define ATA_OPTIMIZED_WRITING +void copy_write_sectors(const unsigned char* buf, int wordcount); #endif -#define ATA_IOBASE 0x43F8C000 -#define ATA_DATA (*((volatile unsigned short*)(ATA_IOBASE + 0xA0))) -#define ATA_ERROR (*((volatile unsigned char*)(ATA_IOBASE + 0xA4))) -#define ATA_NSECTOR (*((volatile unsigned char*)(ATA_IOBASE + 0xA8))) -#define ATA_SECTOR (*((volatile unsigned char*)(ATA_IOBASE + 0xAC))) -#define ATA_LCYL (*((volatile unsigned char*)(ATA_IOBASE + 0xB0))) -#define ATA_HCYL (*((volatile unsigned char*)(ATA_IOBASE + 0xB4))) -#define ATA_SELECT (*((volatile unsigned char*)(ATA_IOBASE + 0xB8))) -#define ATA_COMMAND (*((volatile unsigned char*)(ATA_IOBASE + 0xBC))) -#define ATA_CONTROL (*((volatile unsigned char*)(ATA_IOBASE + 0xD8))) +#define ATA_DATA ATA_DRIVE_DATA +#define ATA_ERROR ATA_DRIVE_FEATURES +#define ATA_NSECTOR ATA_DRIVE_SECTOR_COUNT +#define ATA_SECTOR ATA_DRIVE_SECTOR_NUM +#define ATA_LCYL ATA_DRIVE_CYL_LOW +#define ATA_HCYL ATA_DRIVE_CYL_HIGH +#define ATA_SELECT ATA_DRIVE_CYL_HEAD +#define ATA_COMMAND ATA_DRIVE_COMMAND +#define ATA_CONTROL ATA_DRIVE_CONTROL #define STATUS_BSY 0x80 #define STATUS_RDY 0x40 diff --git a/firmware/target/arm/imx31/gigabeat-s/button-imx31.c b/firmware/target/arm/imx31/gigabeat-s/button-imx31.c index 32d2a63c49..eea0faa4eb 100644 --- a/firmware/target/arm/imx31/gigabeat-s/button-imx31.c +++ b/firmware/target/arm/imx31/gigabeat-s/button-imx31.c @@ -36,31 +36,27 @@ void button_init_device(void) { unsigned int reg_val; /* Enable keypad clock */ - //mxc_clks_enable(KPP_CLK); + CLKCTL_CGR1 |= (3 << 2*10); - /* Enable number of rows in keypad (KPCR[7:0]) - * Configure keypad columns as open-drain (KPCR[15:8]) - * - * Configure the rows/cols in KPP - * LSB nibble in KPP is for 8 rows - * MSB nibble in KPP is for 8 cols - */ - reg_val = KPP_KPCR; - reg_val |= (1 << 8) - 1; /* LSB */ - reg_val |= ((1 << 8) - 1) << 8; /* MSB */ - KPP_KPCR = reg_val; - - /* Write 0's to KPDR[15:8] */ - reg_val = KPP_KPDR; - reg_val &= 0x00ff; - KPP_KPDR = reg_val; - - /* Configure columns as output, rows as input (KDDR[15:0]) */ - KPP_KDDR = 0xff00; - - reg_val = 0xD; - reg_val |= (1 << 8); - KPP_KPSR = reg_val; + /* Enable number of rows in keypad (KPCR[7:0]) + * Configure keypad columns as open-drain (KPCR[15:8]) + * + * Configure the rows/cols in KPP + * LSB nibble in KPP is for 8 rows + * MSB nibble in KPP is for 8 cols + */ +#if 0 + KPP_KPCR = (0xff << 8) | 0xff; + /* Write 0's to KPDR[15:8] */ + reg_val = KPP_KPDR; + reg_val &= 0x00ff; + KPP_KPDR = reg_val; + + /* Configure columns as output, rows as input (KDDR[15:0]) */ + KPP_KDDR = 0xff00; +#endif + + KPP_KPSR = (1 << 3) | (1 << 2); } inline bool button_hold(void) -- cgit v1.2.3