⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw_cf.c

📁 pocket pc hx4700 bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -