📄 hw_cf.c
字号:
/* * Copyright (C) 2006-2007 Pawel Kolodziejski * Adaptation for native bootloader * **************************************************************************** * Copyright 2001 Compaq Computer Corporation. * * . * * Copying or modifying this code for any purpose is permitted, * * provided that this copyright notice is preserved in its entirety * * in all copies or modifications. COMPAQ COMPUTER CORPORATION * * MAKES NO WARRANTIES, EXPRESSED OR IMPLIED, AS TO THE USEFULNESS * * OR CORRECTNESS OF THIS CODE OR ITS FITNESS FOR ANY PARTICULAR * * PURPOSE. * **************************************************************************** */#include "types.h"#include "pxa-regs.h"#include "gpio.h"#include "pcmcia-pxa.h"int cf_check_inserted(void) { return GPLR0 & 0x200 ? -1 : 0;}int cf_turn_on(void) { int count = 40; gpo_clear(GPO_A716_CF_SLOT1_POWER1_N); // 3.3v mdelay(60); gpo_clear(GPO_A716_CF_SLOT1_POWER2_N); gpo_clear(GPO_A716_CF_SLOT1_POWER3_N); gpo_set(GPO_A716_CF_SLOT1_RESET); mdelay(20); gpo_clear(GPO_A716_CF_SLOT1_RESET); do { if ((GPLR0 & 0x80) != 0) break; mdelay(50); count--; } while (count != 0);}int cf_turn_off(void) { gpo_set(GPO_A716_CF_SLOT1_POWER2_N); gpo_set(GPO_A716_CF_SLOT1_POWER1_N); gpo_set(GPO_A716_CF_SLOT1_POWER3_N); gpo_clear(GPO_A716_CF_SLOTS_ENABLE); MECR &= ~MECR_CIT;}int cf_card_init(void) { pcmcia_init_module(); cf_turn_on(); return pcmcia_insert();}int cf_read_sector(u8 *buffer, unsigned long sector) { return ide_read(buffer, sector * 512, 512);}enum cis_tuple_type { CIS_TUPLE_NULL = 0x00, CIS_TUPLE_DEVICE = 0x01, CIS_TUPLE_LONGLINK_CB = 0x02, CIS_TUPLE_INDIRECT = 0x03, CIS_TUPLE_CONFIG_CB = 0x04, CIS_TUPLE_CFTABLE_ENTRY_CB = 0x05, CIS_TUPLE_LONGLINK_MFC = 0x06, CIS_TUPLE_BAR = 0x07, CIS_TUPLE_PWR_MGMNT = 0x08, CIS_TUPLE_EXTDEVICE = 0x09, CIS_TUPLE_CHECKSUM = 0x10, CIS_TUPLE_LONGLINK_A = 0x11, CIS_TUPLE_LONGLINK_C = 0x12, CIS_TUPLE_LINKTARGET = 0x13, CIS_TUPLE_NO_LINK = 0x14, CIS_TUPLE_VERS_1 = 0x15, CIS_TUPLE_ALTSTR = 0x16, CIS_TUPLE_DEVICE_A = 0x17, CIS_TUPLE_JEDEC_C = 0x18, CIS_TUPLE_JEDEC_A = 0x19, CIS_TUPLE_CONFIG = 0x1a, CIS_TUPLE_CFTABLE_ENTRY = 0x1b, CIS_TUPLE_DEVICE_OC = 0x1c, CIS_TUPLE_DEVICE_OA = 0x1d, CIS_TUPLE_DEVICE_GEO = 0x1e, CIS_TUPLE_DEVICE_GEO_A = 0x1f, CIS_TUPLE_MANFID = 0x20, CIS_TUPLE_FUNCID = 0x21, CIS_TUPLE_FUNCE = 0x22, CIS_TUPLE_SWIL = 0x23, CIS_TUPLE_END = 0xff};enum cis_funcid { CIS_FUNCID_MULTI = 0x00, CIS_FUNCID_MEMORY = 0x01, CIS_FUNCID_SERIAL = 0x02, CIS_FUNCID_PARALLEL = 0x03, CIS_FUNCID_FIXED = 0x04, CIS_FUNCID_VIDEO = 0x05, CIS_FUNCID_NETWORK = 0x06, CIS_FUNCID_AIMS = 0x07, CIS_FUNCID_SCSI = 0x08};struct card_info { short manfid[2]; short funcid; char *name;};void putLabeledWord(const char *msg, unsigned long value) { char buf[9]; drawText(1, 26, msg, 0, 0x003f); sprintf(buf, "%08x", value); drawText(1, 27, buf, 0, 0x003f); mdelay(1000);}void putstr(const char *s) { drawText(1, 28, s, 0x003f); mdelay(1000);}int putHexInt8(int value) { char buf[3]; sprintf(buf, "%02x", value); drawText(1, 27, buf, 0x003f); mdelay(500);}int pcmcia_init_module(void) { unsigned int clock = get_lclk_frequency_10khz(); MCMEM0 = ((pxa_mcxx_setup(PXA_PCMCIA_3V_MEM_ACCESS, clock) & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) | ((pxa_mcxx_asst(PXA_PCMCIA_3V_MEM_ACCESS, clock) & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) | ((pxa_mcxx_hold(PXA_PCMCIA_3V_MEM_ACCESS, clock) & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); MCATT0 = ((pxa_mcxx_setup(PXA_PCMCIA_3V_MEM_ACCESS, clock) & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) | ((pxa_mcxx_asst(PXA_PCMCIA_3V_MEM_ACCESS, clock) & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) | ((pxa_mcxx_hold(PXA_PCMCIA_3V_MEM_ACCESS, clock) & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); MCIO0 = ((pxa_mcxx_setup(PXA_PCMCIA_IO_ACCESS, clock) & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) | ((pxa_mcxx_asst(PXA_PCMCIA_IO_ACCESS, clock) & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) | ((pxa_mcxx_hold(PXA_PCMCIA_IO_ACCESS, clock) & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); MECR |= MECR_CIT; MECR &= ~MECR_NOS; return 0;} int pcmcia_insert(void) { struct card_info *card_info = (struct card_info *)0xA3120000; //mdelay(1000); pcmcia_read_cis(0); if (card_info->funcid == CIS_FUNCID_FIXED) { ide_attach(); mdelay(1000); return 0; } return -1;}#define read_mapping_byte(m_, o_) (m_[o_] & 0xFF)int pcmcia_read_cis(void) { char buffer[200]; volatile unsigned short *mapping = (unsigned short *)0x28000000; struct card_info *card_info = (struct card_info *)0xA3120000; int i = 0; memset(card_info, 0, sizeof(struct card_info)); //sprintf(buffer, "cis[0] = %02x", read_mapping_byte(mapping, 0)); //drawText(1, 28, buffer, 0, 0x003f); //mdelay(1000); while (i < 256) { unsigned short type = (read_mapping_byte(mapping, i++)); unsigned short len = (read_mapping_byte(mapping, i++)); int j; if (type == CIS_TUPLE_END || len == 0) { //drawText(1, 28, "CIS_TUPLE_END ", 0, 0x003f); //mdelay(1000); break; } //sprintf(buffer, "type: %02x, len: %02x ", type, len); //drawText(1, 28, buffer, 0, 0x003f); //mdelay(1000); //for (j = 0; j < len; j++) { //sprintf(buffer, "elem: %02x ", read_mapping_byte(mapping, i + j)); //drawText(1, 28, buffer, 0, 0x003f); //mdelay(1000); //} switch (type) { case CIS_TUPLE_MANFID: card_info->manfid[0] = read_mapping_byte(mapping, i); card_info->manfid[1] = read_mapping_byte(mapping, i + 1); //sprintf(buffer, "manfid[0]= %04x ", card_info->manfid[0]); //drawText(1, 28, buffer, 0, 0x003f); //mdelay(1000); //sprintf(buffer, "manfid[1]= %04x ", card_info->manfid[1]); //drawText(1, 28, buffer, 0, 0x003f); //mdelay(1000); break; case CIS_TUPLE_FUNCID: //sprintf(buffer, "funcid= %02x ", read_mapping_byte(mapping, i)); //drawText(1, 28, buffer, 0, 0x003f); //mdelay(1000); card_info->funcid = read_mapping_byte(mapping, i); //if (read_mapping_byte(mapping, i) == CIS_FUNCID_FIXED) { // drawText(1, 28, "fixed disk ", 0, 0x003f); // mdelay(1000); //} break; } i += len; } return 0;}enum ide_registers { IDE_DATA_REG = 0, IDE_WRITE_PRECOMPENSATION_REG = 0x1, IDE_ERROR_REG = 1, IDE_FEATURE_REG = 1, IDE_SECTOR_COUNT_REG = 2,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -