Beispiel #1
0
void ResourceManager::killAll(bool wantInfo) {
    int nuked = 0;

    // We need to clear the FX queue, because otherwise the sound system
    // will still believe that the sound resources are in memory. We also
    // need to kill the movie lead-in/out.

    _vm->_sound->clearFxQueue(true);

    for (uint i = 0; i < _totalResFiles; i++) {
        // Don't nuke the global variables or the player object!
        if (i == 1 || i == CUR_PLAYER_ID)
            continue;

        if (_resList[i].ptr) {
            if (wantInfo)
                Debug_Printf("Nuked %5d: %s\n", i, fetchName(_resList[i].ptr));

            remove(i);
            nuked++;
        }
    }

    if (wantInfo)
        Debug_Printf("Expelled %d resources\n", nuked);
}
Beispiel #2
0
/******** Transceiver_Receive **********************************************
// Hardware trigger on IRQ occurred, change the state for transceiver state
//   machine in order to read message into microcontroller
// Input: none 
// Output: none
// ------------------------------------------------------------------------*/
void Transceiver_Receive ( void )
{
	portBASE_TYPE xHigherPriorityTaskWoken;
	unsigned char rx[TRANSCEIVER_MAX_PAYLOAD];

	if ( !( nrf24l01_irq_pin_active() && nrf24l01_irq_rx_dr_active() ) )
	{
		// ERROR: we got interupt but the interupt is not packet received 
		Debug_Printf ( "Transceiver_Receive: Error 0x%x\n", nrf24l01_get_status()&nrf24l01_STATUS_INTERRUPT );
		goto exit; 
	}

	//get the payload into data
	nrf24l01_read_rx_payload ( rx, TRANSCEIVER_MAX_PAYLOAD );
	Debug_NetworkTransceiver_PrintPayload(rx);

	if ( pdTRUE != xQueueSendFromISR(Transceiver_RX_Queue, rx, &xHigherPriorityTaskWoken) )
	{
		// ERROR: Queue is full
		Debug_Printf ("Transceiver_Receive: Error 0x%x\n", ERROR_QUEUE_FULL);
		if ( FullQueueCallBack != NULL )
			xTaskCreate( Transceiver_FullQueueCallBack, ( signed portCHAR * ) "Transceiver_FullQueueCallBack", 
				 DEFAULT_STACK_SIZE, NULL, DEFAULT_PRIORITY, NULL );
		goto exit;
	}

exit:	
	nrf24l01_irq_clear_all();
	Delay_US(130); 
}
Beispiel #3
0
/******** Transceiver_SendMessage *******************************************
// unpack transceiver packet and send out
// Input:
//    pkt - transceiver packet to be sent 
// Output: status
// ------------------------------------------------------------------------*/
unsigned char Transceiver_SendMessage ( TransceiverPacket pkt )
{
	unsigned char tx[TRANSCEIVER_MAX_PAYLOAD];
	unsigned char index, length;
	unsigned char status = SUCCESS;

	// validate packet
	Debug_NetworkTransceiver_PrintPacket(&pkt);

	if ( MAX_DATA_SIZE < pkt.dataSize )
	{
		status = ERROR_INVALID_PAKCET;
		Debug_Printf ("Transceiver_SendMessage: Error 0x%x\n", status);
		goto exit;
	}

	// unpack transceiver packet
	tx[SOURCE_ID_INDEX] = pkt.srcID;
	tx[DEST_ID_INDEX] = pkt.destID;
	tx[MSG_ID_INDEX] = pkt.msgID;
	tx[DATA_SIZE_INDEX] = pkt.dataSize;
	length = DATA_INDEX;
	for ( index = 0; index < pkt.dataSize; index++,length++ )
	{
		tx[length] = pkt.data[index];
	}

	Debug_NetworkTransceiver_PrintPayload(tx);

	// lock transceiver
	while ( xSemaphoreTake(Transceiver_Mutex, portMAX_DELAY) != pdTRUE );
	GPIOPinIntDisable ( nrf24l01_IRQ_IOREGISTER, nrf24l01_IRQ_PIN );

	nrf24l01_set_as_tx();
	nrf24l01_write_tx_payload ( tx, TRANSCEIVER_MAX_PAYLOAD, true );

	//wait until the packet has been sent or the maximum number of retries has been active
	while( !( nrf24l01_irq_pin_active() && (nrf24l01_irq_tx_ds_active()||nrf24l01_irq_max_rt_active()) ) );
	if ( nrf24l01_irq_max_rt_active() )	
	{
		// hit maximum number of retries
		nrf24l01_flush_tx();
		status = ERROR_MAX_RETRIES;
		Debug_Printf ("Transceiver_SendMessage: Error 0x%x\n", status);
	}

	// reset transceiver
	nrf24l01_irq_clear_all();
	nrf24l01_set_as_rx(true);
	Delay_US(130);

	//unlock transceiver
	GPIOPinIntEnable ( nrf24l01_IRQ_IOREGISTER, nrf24l01_IRQ_PIN );
	while ( xSemaphoreGive(Transceiver_Mutex) != pdTRUE );

exit:
	return status;
}
Beispiel #4
0
static void initAndroidAudio(_THIS, Uint16 format, int freq, int channels, int bufSizeBytes)
{
	JNIEnv *j_env = g_jniAudioInterface.android_env;
	if (j_env)
	{
		int bits = 16;
		int bytes = 2;
		switch (format)
		{
			case AUDIO_U8:
			case AUDIO_S8:
			{
				bits = 8;
				bytes = 1;
				break;
			}
		}

		Debug_Printf("SDL_Audio Native->Java AudioInit_callback");

		jint minBufSize = (*j_env)->CallIntMethod(j_env,
				g_jniAudioInterface.android_mainActivity, g_jniAudioInterface.getMinBufSize,
				freq, bits, channels);

		float scale = (SdlDeviceBufferSizeScale<=0) ? 1 : ((SdlDeviceBufferSizeScale > 50) ? 50 : SdlDeviceBufferSizeScale);
		scale *= 1.0f/100.0f;
		const int roundSize = 1024; // pow2
		int reqBufSize = (int)((freq * bytes * channels) * (scale));
		reqBufSize = (reqBufSize + (roundSize-1)) & ~(roundSize-1);

		Debug_Printf("SDL_Audio Requested BufSize: %d", reqBufSize);

		int deviceBufSize = reqBufSize;
		if (deviceBufSize < bufSizeBytes)
		{
			deviceBufSize = bufSizeBytes;
		}
		if (deviceBufSize < minBufSize)
		{
			Debug_Printf("Device MinBufSize: %d", minBufSize);
			deviceBufSize = minBufSize;
		}

		Debug_Printf("SDL_Audio Native->Java AudioInit_callback");

		(*j_env)->CallVoidMethod(j_env,
				g_jniAudioInterface.android_mainActivity, g_jniAudioInterface.initAudio,
				freq, bits, channels,
				deviceBufSize);
				//(freq == 44100) ? (32 * 1024) : (16*1024));

		this->hidden->numjShorts = bufSizeBytes/2;
	}
}
int ata_sw_reset_dev(ATA_Device_t *ata_dev)
{
	int error;

#ifdef ATA_DEBUG
	Debug_Printf("ATA reset processing...\n");
#endif
	
	ata_write_reg(ATA_DEVICE_CONTROL_REG, ATA_DEV_CTL_nIEN | ATA_DEV_CTL_SRST);
	ata_delay_ms(2);
	ata_write_reg(ATA_DEVICE_CONTROL_REG, ATA_DEV_CTL_nIEN);
	ata_delay_ms(2);
		
	ata_write_reg(ATA_DEVICE_HEAD_REG, ata_dev->current_dev ? ATA_DRIVE1_MASK : ATA_DRIVE0_MASK);
	ata_delay_100ns(ATA_CMD_ISSUE_DELAY);
		
	error = ata_wait_status_bits(ATA_STATUS_BSY|ATA_STATUS_DRDY, ATA_STATUS_DRDY, ATA_CMD_INIT_TIMEOUT);
	if(error)
		return error;
	
	ata_write_reg(ATA_DEVICE_HEAD_REG, ata_dev->current_dev? ATA_DRIVE1_MASK : ATA_DRIVE0_MASK);
	ata_delay_100ns(ATA_CMD_ISSUE_DELAY);
		
	return ATA_NO_ERROR;
}
Beispiel #6
0
/******** Transceiver_receiveMessage *****************************************
// dequeue transceiver packet
// Input: 
//	  *pkt - pointer to received message 
// Output: status
// ------------------------------------------------------------------------*/
unsigned char Transceiver_ReceiveMessage ( TransceiverPacket *pkt )
{
	unsigned char rx[TRANSCEIVER_MAX_PAYLOAD];
	unsigned char index;
	unsigned char status = SUCCESS;

	GPIOPinIntDisable ( nrf24l01_IRQ_IOREGISTER, nrf24l01_IRQ_PIN );
	if ( pdPASS == xQueueReceive(Transceiver_RX_Queue, rx, (portTickType)0) )
	{
		pkt->srcID = rx[SOURCE_ID_INDEX];
		pkt->destID = rx[DEST_ID_INDEX];
		pkt->msgID = rx[MSG_ID_INDEX];
		pkt->dataSize = rx[DATA_SIZE_INDEX];
		for ( index = 0; index < pkt->dataSize; index++ )
		{
			pkt->data[index] = rx[index+PACKET_HEADER_SIZE];
		}
		Debug_NetworkTransceiver_PrintPacket(pkt);
	}
	else
	{
		// empty queue
		status = ERROR_QUEUE_EMPTY;
		Debug_Printf ("Transceiver_ReceiveMessage 0x%x\n", status);
		if ( EmptyQueueCallBack != NULL )
			xTaskCreate( Transceiver_EmptyQueueCallBack, ( signed portCHAR * ) "Transceiver_EmptyQueueCallBack", 
				 DEFAULT_STACK_SIZE, NULL, DEFAULT_PRIORITY, NULL );
	}

	GPIOPinIntEnable ( nrf24l01_IRQ_IOREGISTER, nrf24l01_IRQ_PIN );

	return status;
}
Beispiel #7
0
static void deinitAndroidAudio(_THIS)
{
	JNIEnv *j_env = g_jniAudioInterface.android_env;
	if (j_env)
	{
		Debug_Printf("SDL_Audio Native->Java AudioDeinit_callback");

		(*j_env)->CallVoidMethod(j_env,
				g_jniAudioInterface.android_mainActivity, g_jniAudioInterface.deinitAudio);
	}
}
Beispiel #8
0
void Sound::printFxQueue() {
	int freeSlots = 0;

	for (int i = 0; i < FXQ_LENGTH; i++) {
		if (_fxQueue[i].resource) {
			const char *type;

			switch (_fxQueue[i].type) {
			case FX_SPOT:
				type = "SPOT";
				break;
			case FX_LOOP:
				type = "LOOP";
				break;
			case FX_RANDOM:
				type = "RANDOM";
				break;
			case FX_SPOT2:
				type = "SPOT2";
				break;
			case FX_LOOPING:
				type = "LOOPING";
				break;
			default:
				type = "UNKNOWN";
				break;
			}

			Debug_Printf("%d: res: %d ('%s') %s (%d) delay: %d vol: %d pan: %d\n",
				i, _fxQueue[i].resource,
				_vm->_resman->fetchName(_fxQueue[i].resource),
				type, _fxQueue[i].type, _fxQueue[i].delay,
				_fxQueue[i].volume, _fxQueue[i].pan);
		} else {
			freeSlots++;
		}
	}
	Debug_Printf("Free slots: %d\n", freeSlots);
}
Beispiel #9
0
void ResourceManager::killAllObjects(bool wantInfo) {
    int nuked = 0;

    for (uint i = 0; i < _totalResFiles; i++) {
        // Don't nuke the global variables or the player object!
        if (i == 1 || i == CUR_PLAYER_ID)
            continue;

        if (_resList[i].ptr) {
            if (fetchType(_resList[i].ptr) == GAME_OBJECT) {
                if (wantInfo)
                    Debug_Printf("Nuked %5d: %s\n", i, fetchName(_resList[i].ptr));

                remove(i);
                nuked++;
            }
        }
    }

    if (wantInfo)
        Debug_Printf("Expelled %d resources\n", nuked);
}
Beispiel #10
0
static void ANDROIDAUDIOTRACK_ThreadDeinit(_THIS)
{
	Debug_Printf("SDL_Audio Native Audio Thread DeInit");

	JNIEnv *j_env = this->hidden->playThreadjenv;
	(*j_env)->DeleteGlobalRef(j_env, this->hidden->playThreadjavaSendBuf);
	this->hidden->playThreadjavaSendBuf = 0;

	if (this->hidden->playThreadEnvAttached)
	{
		(*g_jvm)->DetachCurrentThread(g_jvm);
	}
	this->hidden->playThreadEnvAttached = 0;
	this->hidden->playThreadjenv = 0;
}
Beispiel #11
0
int cf_write_data(unsigned long lba, unsigned long byte_cnt, unsigned char * data_buf)
{
	int error;

	cf_atapi_enable();

	ata_dev->current_dev = ata_cf_info->dev_no;
	ata_dev->current_addr_mode = ata_cf_info->addr_mode;

	error = ata_write_data_pio(lba, byte_cnt, data_buf);
	if(error)
	{
#ifdef ATA_DEBUG
		Debug_Printf("#%s occured in cf_write_data()!\n", ata_error_to_string(error));
#endif
		return error;
	}

	return ATA_NO_ERROR;
}
Beispiel #12
0
static void ANDROIDAUDIOTRACK_ThreadInit(_THIS)
{
	Debug_Printf("SDL_Audio Native->Java Audio Thread Init");

	JNIEnv *env = NULL;

	int status = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
	int attached = 0;

	if(status < 0)
	{
		status = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
		attached = 1;
	}

	this->hidden->playThreadEnvAttached = attached;
	this->hidden->playThreadjenv = env;

	jshortArray sendBuf = (*env)->NewShortArray(env, this->hidden->numjShorts);
	this->hidden->playThreadjavaSendBuf = (*env)->NewGlobalRef(env, sendBuf);
	(*env)->DeleteLocalRef(env, sendBuf);
}
Beispiel #13
0
int xd_sm_card_indentification(void)
{
	int err;
	XD_ID_9A_t id_9a;
	
	if(xd_sm_info->card_type == CARD_TYPE_SM)
		return XD_SM_NO_ERROR;
		
	err = xd_sm_id_read(XD_ID_READ9A, (unsigned char *)&id_9a);
	if(err)
		return err;
	
	if(id_9a.XD_CARD_ID != 0xB5)
	{
#ifdef  XD_SM_DEBUG
		Debug_Printf("#XD_CARD_ID error\n");
#endif		
		//return XD_SM_ERROR_CARD_ID;
	}
	xd_sm_info->raw_cid = id_9a;

	return XD_SM_NO_ERROR;
}
int ata_init_device(ATA_Device_t *ata_dev)
{
    /*_phymem_node_t *memmap = Am_GetSystemMem(MEMMAP_DEFAULT, MEMITEM_DMA_DRAM);
    if(memmap != NULL)
    {
        ata_dma_buf = (void *)(memmap->start);
        ata_dma_buf_size = memmap->end - memmap->start + 1;
    }*/

    //memset(ata_dev, 0, sizeof(ATA_Device_t));
	int error = ATA_NO_ERROR, dev, dev_existed = 0;
	unsigned char reg_data, device_head = 0;

	ata_dev->master_disabled = ATA_MASTER_DISABLED;
	ata_dev->slave_enabled = ATA_SLAVE_ENABLED;
	
#ifdef ATA_DEBUG
	Debug_Printf("Start to poll ATA status, wait BUSY cleared to zero...\n");
#endif
	
	ata_write_reg(ATA_DEVICE_CONTROL_REG, ATA_DEV_CTL_nIEN);
	ata_delay_100ns(ATA_CMD_ISSUE_DELAY);
	
	for(dev=0; dev<2; dev++)
	{
		if(!dev && ata_dev->master_disabled)
			continue;
		else if(dev && !ata_dev->slave_enabled)
			continue;

		if(ata_dev->device_info[dev].device_existed)
		{
			dev_existed = 1;
			continue;
		}
		
		reg_data = dev ? ATA_DRIVE1_MASK : ATA_DRIVE0_MASK;
		ata_write_reg(ATA_DEVICE_HEAD_REG, reg_data);
		ata_delay_ms(2);
		
		error = ata_wait_status_bits(ATA_STATUS_BSY|ATA_STATUS_DRDY, ATA_STATUS_DRDY, ATA_CMD_INIT_TIMEOUT);
		if(error)
		{
			ata_dev->device_info[dev].device_inited = 0;
			continue;
		}
    	
    	ata_write_reg(ATA_SECTOR_COUNT_REG, 0x55);
		ata_delay_100ns(ATA_CMD_ISSUE_DELAY);
		reg_data = ata_read_reg(ATA_SECTOR_COUNT_REG);
		if(reg_data != 0x55)
		{
			ata_dev->device_info[dev].device_inited = 0;
			error = ATA_ERROR_HARDWARE_FAILURE;
			continue;
		}
    	
    	ata_write_reg(ATA_SECTOR_NUMBER_REG, 0xAA);
		ata_delay_100ns(ATA_CMD_ISSUE_DELAY);
		reg_data = ata_read_reg(ATA_SECTOR_NUMBER_REG);
		if(reg_data != 0xAA)
		{
			ata_dev->device_info[dev].device_inited = 0;
			error = ATA_ERROR_HARDWARE_FAILURE;
			continue;
		}

		ata_dev->device_info[dev].device_existed = 1;
		dev_existed = 1;

		if(ATA_EIGHT_BIT_ENABLED)
		{
			device_head = dev ? ATA_DRIVE1_MASK : ATA_DRIVE0_MASK;

			ata_dev->ata_param.Device_Head = device_head;
			ata_dev->ata_param.Features = 0x01;
			ata_dev->ata_param.Command = ATA_SET_FEATURES;
			error = ata_set_features(ata_dev);
			if(error)
				return error;
		}
	}

	if(dev_existed)
	{
#if ((defined CF_USE_PIO_DMA) || (defined HD_USE_DMA))
        atapi_dma_init();
        if (!atapi_dma_done_event) 
            atapi_dma_done_event = AVSemCreate(0);
#endif
        return ATA_NO_ERROR;
    }
    else
		return error;
}
Beispiel #15
0
/******** Transceiver_Init *************************************************
// Initialize Transceiver using SPI1
// Input: none
// Output: status
// ------------------------------------------------------------------------*/
unsigned char Transceiver_Init ( void )
{
	unsigned char status = SUCCESS;

	// create RX queues
	Transceiver_RX_Queue = xQueueCreate ( 10, sizeof( unsigned char [TRANSCEIVER_MAX_PAYLOAD] ) );
	if ( NULL == Transceiver_RX_Queue )
	{
		status = ERROR_QUEUE_NOT_CREATED;
		Debug_Printf ("Transceiver_Init: Error 0x%x\n", status);
		goto exit;
	}

	// create lock
	vSemaphoreCreateBinary(Transceiver_Mutex);
	if ( NULL == Transceiver_Mutex )
	{
		status = ERROR_LOCK_NOT_CREATED;
		Debug_Printf ("Transceiver_Init: Error 0x%x\n", status);
		goto exit;
	}

	// initialize spi1
	SPI_Init ( SPI1 );

	// CE and CSN are output
	GPIO_Init ( nrf24l01_CE_PORT, nrf24l01_CE_PIN | nrf24l01_CSN_PIN, 
				GPIO_DIR_MODE_OUT, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU );

	// IRQ is input and interrupt-enabled
	GPIO_Init ( nrf24l01_IRQ_PORT, nrf24l01_IRQ_PIN, 
				GPIO_DIR_MODE_IN, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU );

    // initialize nRF24L01+, initialize device as receiver, auto-ack
	nrf24l01_initialize (
						nrf24l01_CONFIG_DEFAULT_VAL | nrf24l01_CONFIG_PWR_UP | nrf24l01_CONFIG_PRIM_RX, 
						true,
						nrf24l01_EN_AA_ENAA_P0, 
						nrf24l01_EN_RXADDR_DEFAULT_VAL, 
						nrf24l01_SETUP_AW_DEFAULT_VAL, 
						nrf24l01_SETUP_RETR_ARD | nrf24l01_SETUP_RETR_ARC_5, 
						nrf24l01_RF_CH_DEFAULT_VAL, 
						nrf24l01_RF_SETUP_DEFAULT_VAL,  
						NULL, 
						NULL, 
						nrf24l01_RX_ADDR_P2_DEFAULT_VAL, 
						nrf24l01_RX_ADDR_P3_DEFAULT_VAL, 
						nrf24l01_RX_ADDR_P4_DEFAULT_VAL, 
						nrf24l01_RX_ADDR_P5_DEFAULT_VAL, 
						NULL, 
						TRANSCEIVER_MAX_PAYLOAD, 
						nrf24l01_RX_PW_P1_DEFAULT_VAL, 
						nrf24l01_RX_PW_P2_DEFAULT_VAL, 
						nrf24l01_RX_PW_P3_DEFAULT_VAL, 
						nrf24l01_RX_PW_P4_DEFAULT_VAL, 
						nrf24l01_RX_PW_P5_DEFAULT_VAL );

	// enable IRQ interrupt, active low
	GPIO_SetInterruptTask ( nrf24l01_IRQ_PORT, nrf24l01_IRQ_PIN, 
							GPIO_FALLING_EDGE, 2, Transceiver_Receive );

exit:
	return status;
}
Beispiel #16
0
int cf_card_init(CF_Card_Info_t * card_info)
{
	int error, dev;

	//cf_atapi_enable();
	//set_atapi_enable(0,cf_m2_enabled);
	//set_atapi_enable(0,0);
	if(ata_cf_info->inited_flag && !ata_cf_info->removed_flag)
	{
		cf_atapi_enable();

		error = cf_cmd_test();
		if(!error)
			return error;
	}

	if(++ata_cf_info->init_retry > CF_INIT_RETRY)
		return ATA_ERROR_HARDWARE_FAILURE;

#ifdef ATA_DEBUG
	Debug_Printf("\nCF initialization started......\n");
#endif

    //save_atapi_io_status();
   //if(cf_retry_init)
	//set_atapi_io_low();

	cf_staff_init();

#ifdef ATA_DEBUG
	Debug_Printf("Start to power on and hardware reset...\n");
#endif
	cf_hw_reset();

	cf_atapi_enable();

	//restore_atapi_io_status();

	error = ata_init_device(ata_dev);

	if(error)
	{
#ifdef ATA_DEBUG
		Debug_Printf("#%s occured in ata_init_device()!\n", ata_error_to_string(error));
#endif
		return error;
	}

	card_in_event_status[CARD_COMPACT_FLASH] = CARD_EVENT_INSERTED;

	error = ata_identify_device(ata_dev);
	if(error)
	{
#ifdef ATA_DEBUG
		Debug_Printf("#%s occured in ata_identify_device()!\n", ata_error_to_string(error));
#endif
		return error;
	}

	for(dev=0; dev<2; dev++)
	{
		if(!ata_dev->device_info[dev].device_existed || !ata_dev->device_info[dev].device_inited)
			continue;

		//if((ata_dev->device_info[dev].identify_info.general_configuration != 0x848A)
		//	&& !(ata_dev->device_info[dev].identify_info.general_configuration & 0x0080))	// Bit7: removable media device
		//	continue;

		ata_cf_info->inited_flag = 1;
		ata_cf_info->dev_no = dev;

		break;
	}
	if(!ata_cf_info->inited_flag)
	{
		ata_remove_device(ata_dev, ata_cf_info->dev_no);
		error = ATA_ERROR_DEVICE_TYPE;
#ifdef ATA_DEBUG
		Debug_Printf("#%s occured in cf_card_init()!\n", ata_error_to_string(error));
#endif
		return error;
	}

	strcpy(ata_cf_info->serial_number, ata_dev->device_info[ata_cf_info->dev_no].serial_number);
	strcpy(ata_cf_info->model_number, ata_dev->device_info[ata_cf_info->dev_no].model_number);
#ifdef ATA_DEBUG
	Debug_Printf("ATA device%d detected!\n", ata_cf_info->dev_no);
	Debug_Printf("Serial Number: %s\n", ata_cf_info->serial_number);
	Debug_Printf("Model Number: %s\n", ata_cf_info->model_number);
#endif

	ata_cf_info->blk_len = ata_dev->device_info[ata_cf_info->dev_no].sector_size;
	ata_cf_info->blk_nums = ata_dev->device_info[ata_cf_info->dev_no].sector_nums;

	ata_dev->current_dev = ata_cf_info->dev_no;
	ata_dev->current_addr_mode = ata_cf_info->addr_mode;

	error = ata_check_data_consistency(ata_dev);
	if(error)
	{
		ata_remove_device(ata_dev, ata_cf_info->dev_no);
		ata_cf_info->inited_flag = 0;

#ifdef ATA_DEBUG
		Debug_Printf("#%s occured in ata_check_data_consistency()!\n", ata_error_to_string(error));
#endif
		return error;
	}

#ifdef ATA_DEBUG
	Debug_Printf("cf_card_init() is completed successfully!\n\n");
#endif

	ata_cf_info->inited_flag = 1;
	ata_cf_info->init_retry = 0;

	memcpy(card_info, ata_cf_info, sizeof(CF_Card_Info_t));

	return ATA_NO_ERROR;
}
Beispiel #17
0
//XD Initialization...
int xd_sm_init(XD_SM_Card_Info_t * card_info)
{
	int error;
	
	xd_sm_function_init();
	
#ifdef XD_CARD_SUPPORTED
	if(xd_sm_info->card_type == CARD_TYPE_XD)
	{
		if(xd_sm_info->xd_inited_flag && !xd_sm_info->xd_removed_flag)
		{
			error = xd_sm_cmd_test();
			if(!error)
				return error;
		}
		
		if(++xd_sm_info->xd_init_retry > XD_SM_INIT_RETRY)
			return XD_SM_ERROR_DRIVER_FAILURE;
	}
#endif
#ifdef SM_CARD_SUPPORTED
	if(xd_sm_info->card_type == CARD_TYPE_SM)
	{
		if(xd_sm_info->sm_inited_flag && !xd_sm_info->sm_removed_flag)
		{
			error = xd_sm_cmd_test();
			if(!error)
				return error;
		}
		
		if(++xd_sm_info->sm_init_retry > XD_SM_INIT_RETRY)
			return XD_SM_ERROR_DRIVER_FAILURE;
	}
#endif

#ifdef  XD_SM_DEBUG
	Debug_Printf("\nXD/SM initialization started......\n");
#endif

	xd_sm_staff_init();
	
	error = xd_sm_reset();
	if(error)
	{
#ifdef  XD_SM_DEBUG
		Debug_Printf("#%s error occured in xd_sm_reset()\n", xd_sm_error_to_string(error));
#endif
		return error;
	}
	
	error = xd_sm_card_capacity_determin();
	if(error)
	{
#ifdef  XD_SM_DEBUG
		Debug_Printf("#%s error occured in xd_sm_card_capacity_determin()\n", xd_sm_error_to_string(error));
#endif
		return error;
	}

#ifdef  XD_SM_DEBUG	
	#ifdef XD_CARD_SUPPORTED
	if(xd_sm_info->card_type == CARD_TYPE_XD)
		Debug_Printf("The capacitty of this XD card is %s!\n", xd_sm_buf->capacity_str);
	#endif
	
	#ifdef SM_CARD_SUPPORTED
	if(xd_sm_info->card_type == CARD_TYPE_SM)
		Debug_Printf("The capacitty of this SM card is %s!\n", xd_sm_buf->capacity_str);
#endif
#endif
	
	error = xd_sm_card_indentification();
	if(error)
	{
#ifdef  XD_SM_DEBUG
		Debug_Printf("#%s error occured in xd_sm_card_indentification()\n", xd_sm_error_to_string(error));
#endif
		return error;
	}
	
	error = xd_sm_physical_format_determin();
	if(error)
	{
#ifdef  XD_SM_DEBUG
		Debug_Printf("#%s error occured in xd_sm_physical_format_determin()\n", xd_sm_error_to_string(error));
#endif
		//return error;
	}
	
	error = xd_sm_create_logical_physical_table();
	if(error)
	{
#ifdef  XD_SM_DEBUG
		Debug_Printf("#%s error occured in xd_sm_create_logical_physical_table()\n", xd_sm_error_to_string(error));
#endif
		#if 0
#ifdef  XD_SM_DEBUG
		Debug_Printf("Try to reconstruct logical-physical convertsion table...\n");
#endif
		error = xd_sm_reconstruct_logical_physical_table();
		if(error)
		{
#ifdef  XD_SM_DEBUG
			Debug_Printf("Reconstruct logical-physical convertsion table faild!\n");
#endif
			return error;
		}
		#else
		return error;
		#endif
	}
	
	error = xd_sm_check_data_consistency();
	if(error)
	{
#ifdef  XD_SM_DEBUG
		Debug_Printf("#%s error occured in xd_sm_check_data_consistency()\n", xd_sm_error_to_string(error));
#endif
		return error;
	}
	
	error = xd_sm_logical_format_determin();
	if(error)
	{
#ifdef  XD_SM_DEBUG
		Debug_Printf("#%s error occured in xd_sm_logical_format_determin()\n", xd_sm_error_to_string(error));
#endif
		//return error;
	}
	
#ifdef XD_SM_DEBUG
	Debug_Printf("xd_sm_init() is completed successfully!\n\n");
#endif

#ifdef XD_CARD_SUPPORTED
	if(xd_sm_info->card_type == CARD_TYPE_XD)
	{
		xd_sm_info->xd_inited_flag = 1;
		xd_sm_info->xd_init_retry = 0;
	}
#endif
#ifdef SM_CARD_SUPPORTED
	if(xd_sm_info->card_type == CARD_TYPE_SM)
	{
		xd_sm_info->sm_inited_flag = 1;
		xd_sm_info->sm_init_retry = 0;
	}
#endif
	
	memcpy(card_info, xd_sm_info, sizeof(XD_SM_Card_Info_t));
	
	return XD_SM_NO_ERROR;
}
Beispiel #18
0
//Read data from XD card
int xd_sm_read_data(unsigned long lba, unsigned long byte_cnt, unsigned char * data_buf)
{
	int error;
	
	unsigned long data_offset,page_addr;
	unsigned short logical_no,physical_no,page_no,page_nums,zone_no,page_cnt;

	if(byte_cnt == 0)
	{
		error = XD_SM_ERROR_PARAMETER;
#ifdef  XD_SM_DEBUG
		Debug_Printf("#%s error occured in xd_sm_read_data()\n", xd_sm_error_to_string(error));
#endif
		return error;
	}
	
	if(xd_reset_flag_read)
	{
		xd_power_on();
	}

	xd_sm_io_config();

	if(xd_reset_flag_read)
	{
		error = xd_sm_reset();
		if (error)
			return error;
	}
	
	data_offset = 0;
	page_nums = (byte_cnt + xd_sm_page_size - 1) / xd_sm_page_size;
	
	while(page_nums)
	{
		logical_no = lba / xd_sm_pages_per_blk;
		zone_no = logical_no / xd_sm_logical_blks_perzone;
		logical_no %= xd_sm_logical_blks_perzone;
		
		if((logical_no >= xd_sm_logical_blks_perzone) || (zone_no >= xd_sm_actually_zones))
		{		
			error = XD_SM_ERROR_PARAMETER;
#ifdef  XD_SM_DEBUG
			Debug_Printf("#%s error occured in xd_sm_read_data()\n", xd_sm_error_to_string(error));
#endif
			return error;
		}
		
		physical_no = xd_sm_buf->logical_physical_table[zone_no][logical_no];
		
		page_no = lba % xd_sm_pages_per_blk;
		page_cnt = page_nums > (xd_sm_pages_per_blk - page_no) ? (xd_sm_pages_per_blk - page_no) : page_nums;
		page_addr = (zone_no * xd_sm_physical_blks_perzone + physical_no) * xd_sm_pages_per_blk + page_no;
		
		//In a flash memory device, there might be a logic block that is not allocate to a physcial 
		//block due to the block not being used. all data shoude be set to FFH when access this logical block
		if(physical_no == INVALID_BLOCK_ADDRESS && xd_sm_search_free_block())
		{
			memset(data_buf+data_offset, 0xFF, page_cnt*xd_sm_page_size);
			
			data_offset += page_cnt*xd_sm_page_size;
			lba += page_cnt;
			page_nums -= page_cnt;
			continue;
		}

		if(physical_no >= xd_sm_physical_blks_perzone)
		{
			error = XD_SM_ERROR_PARAMETER;
#ifdef  XD_SM_DEBUG
			Debug_Printf("#%s error occured in xd_sm_read_data()\n", xd_sm_error_to_string(error));
#endif
			return error;
		}
		
		error = xd_sm_read_cycle1(0, page_addr, data_buf+data_offset, page_cnt*xd_sm_page_size, xd_sm_buf->redundant_buf);
		if(error)
		{
#ifdef  XD_SM_DEBUG
			Debug_Printf("#%s error occured in xd_sm_read_data()\n", xd_sm_error_to_string(error));
#endif
			return error;
		}
		
#ifdef AMLOGIC_CHIP_SUPPORT
		data_offset += ((unsigned long)data_buf == 0x3400000) ? 0 : page_cnt*xd_sm_page_size;
#else
		data_offset += page_cnt*xd_sm_page_size;
#endif
		lba += page_cnt;
		page_nums -= page_cnt;
	}
	return XD_SM_NO_ERROR;
}
Beispiel #19
0
int xd_sm_read_cycle2(unsigned char column_addr, unsigned long page_addr, unsigned char *data_buf, unsigned long data_cnt, unsigned char *redundant_buf)
{
	int err;
	unsigned long data_nums = 0, data_offset = 0, read_cnt;
	
	if(xd_sm_page_size != XD_SM_SECTOR_SIZE)
		return XD_SM_ERROR_PARAMETER;
		
	xd_sm_cmd_input_cycle(XD_SM_READ2, XD_SM_WRITE_DISABLED);
	
	xd_sm_addr_input_cycle((page_addr << 8)|column_addr, xd_sm_buf->addr_cycles);
	
#ifdef XD_CARD_SUPPORTED
	if(xd_sm_info->card_type == CARD_TYPE_XD)
	{
		xd_set_dat0_7_input();
		xd_sm_delay_60ns();		// Tar2 = 50ns
	}
#endif
#ifdef SM_CARD_SUPPORTED
	if(xd_sm_info->card_type == CARD_TYPE_SM)
	{
		sm_set_dat0_7_input();
		xd_sm_delay_100ns(2);	// Tar2 = 150ns
	}
#endif
	
	read_cnt = xd_sm_page_size - (XD_SM_SECTOR_SIZE/2 + column_addr);
	while(data_nums < data_cnt)
	{
		err = xd_sm_wait_ready(XD_BUSY_TIME_R);
		if(err)
		{
#ifdef XD_CARD_SUPPORTED
			if(xd_sm_info->card_type == CARD_TYPE_XD)
				xd_set_ce_disable();
#endif
#ifdef SM_CARD_SUPPORTED
			if(xd_sm_info->card_type == CARD_TYPE_SM)
				sm_set_ce_disable();
#endif
				
			return err;
		}
		
		xd_sm_delay_20ns();		// Trr = 20ns

#ifdef XD_SM_ECC_CHECK
		xd_sm_serial_read_cycle(xd_sm_buf->page_buf, read_cnt, redundant_buf, xd_sm_redundant_size);
		
		err = xd_sm_check_page_ecc(xd_sm_buf->page_buf, redundant_buf);
		if(err)
		{
			if(err == ECC_ERROR_CORRECTED)
			{
			#ifdef  XD_SM_DEBUG
				Debug_Printf("Data ECC error occured, but corrected!\n");
			#endif
			}
			else
			{
			#ifdef  XD_SM_DEBUG
				err = XD_SM_ERROR_ECC;
				Debug_Printf("#%s error occured in xd_sm_read_data()\n", xd_sm_error_to_string(err));
			#endif
			}
		}
		
		#ifdef AMLOGIC_CHIP_SUPPORT
		if((unsigned long)data_buf == 0x3400000)
		{
			for(int i=0; i<read_cnt; i++)
			{
				WRITE_BYTE_TO_FIFO(xd_sm_buf->page_buf[i]);
				xd_sm_delay_100ns(1);
			}
		}
		else
		#endif
		{
			memcpy(data_buf+data_offset, xd_sm_buf->page_buf, read_cnt);
		}
#else		
		xd_sm_serial_read_cycle(data_buf+data_offset, read_cnt, redundant_buf, xd_sm_redundant_size);
#endif
		
#ifdef AMLOGIC_CHIP_SUPPORT
		data_offset += ((unsigned long)data_buf == 0x3400000 ? 0 : read_cnt);
#else
		data_offset += read_cnt;
#endif

		redundant_buf += xd_sm_redundant_size;
		
		data_nums += read_cnt;
		read_cnt = xd_sm_page_size;
	}
	
#ifdef XD_CARD_SUPPORTED
	if(xd_sm_info->card_type == CARD_TYPE_XD)
	{
		xd_set_ce_disable();
		xd_sm_delay_100ns(1);		// Tceh = 100ns
	}
#endif
#ifdef SM_CARD_SUPPORTED
	if(xd_sm_info->card_type == CARD_TYPE_SM)
	{
		sm_set_ce_disable();
		xd_sm_delay_100ns(3);		// Tceh = 250ns
	}
#endif
	
	err = xd_sm_wait_ready(BUSY_TIME_TCRY);
	
	return err;
}
Beispiel #20
0
//Write data to XD card
int xd_sm_write_data(unsigned long lba, unsigned long byte_cnt, unsigned char * data_buf)
{
	int error,i,j,k;
	
	unsigned long data_offset,page_addr,offset;
	unsigned short logical_no,physical_no,page_no,page_nums,zone_no,page_max,page_cnt;
	unsigned short free_blk_no,block_addr;
	unsigned char *page_buf;
	
	if(byte_cnt == 0)
	{
		error = XD_SM_ERROR_PARAMETER;
#ifdef  XD_SM_DEBUG
		Debug_Printf("#%s error occured in xd_sm_write_data()\n", xd_sm_error_to_string(error));
#endif
		return error;
	}
	
	if(xd_sm_info->read_only_flag)
	{
		error = XD_SM_ERROR_DRIVER_FAILURE;
#ifdef  XD_SM_DEBUG
		Debug_Printf("#%s error occured in xd_sm_write_data()\n", xd_sm_error_to_string(error));
#endif
		return error;
	}
	
	if(xd_reset_flag_write)
	{
		xd_power_on();
	}

	xd_sm_io_config();

	if(xd_reset_flag_write)
	{
		error = xd_sm_reset();
		if (error)
			return error;
	}
	
	data_offset = 0;
	page_nums = (byte_cnt + xd_sm_page_size - 1) / xd_sm_page_size;
	
	while(page_nums)
	{
		logical_no = lba / xd_sm_pages_per_blk;
		zone_no = logical_no / xd_sm_logical_blks_perzone;
		logical_no %= xd_sm_logical_blks_perzone;
		page_no = lba % xd_sm_pages_per_blk;
		block_addr = xd_sm_trans_logical_address(logical_no);
		
		if((logical_no >= xd_sm_logical_blks_perzone) || (zone_no >= xd_sm_actually_zones))
		{
			error = XD_SM_ERROR_PARAMETER;
#ifdef  XD_SM_DEBUG
			Debug_Printf("#%s error occured in xd_sm_write_data()\n", xd_sm_error_to_string(error));
#endif
			return error;
		}
		
		free_blk_no = xd_sm_find_free_block(zone_no);
		if(free_blk_no == INVALID_BLOCK_ADDRESS)
		{		
			error = XD_SM_ERROR_NO_FREE_BLOCK;
#ifdef  XD_SM_DEBUG
			Debug_Printf("#%s error occured in xd_sm_write_data()\n", xd_sm_error_to_string(error));
#endif
			return error;
		}
		
		page_addr = (zone_no * xd_sm_physical_blks_perzone + free_blk_no) * xd_sm_pages_per_blk;
		error = xd_sm_auto_block_erase(page_addr);
		if(error)
		{
			xd_sm_clear_block_free(zone_no, free_blk_no);
			//continue;
			return error;
		}
		
		physical_no = xd_sm_buf->logical_physical_table[zone_no][logical_no];
		if(physical_no == INVALID_BLOCK_ADDRESS)
		{
			memset(xd_sm_buf->page_buf, 0xFF, xd_sm_page_size);
			
			page_max = (page_no+page_nums) < xd_sm_pages_per_blk ? (page_no+page_nums) : xd_sm_pages_per_blk;
			page_cnt = 0;
			offset = data_offset;

			for(i=0; i<xd_sm_pages_per_blk; i++)
			{
				page_addr = (zone_no * xd_sm_physical_blks_perzone + free_blk_no) * xd_sm_pages_per_blk + i;
				if((i >= page_no) && (i < page_max))
				{
					page_buf = data_buf+offset;
					offset += xd_sm_page_size;
					page_cnt++;
				}
				else
				{
					page_buf = xd_sm_buf->page_buf;
				}
				
				xd_sm_format_redundant_area(page_buf, xd_sm_buf->redundant_buf, block_addr);
				error = xd_sm_auto_page_program(page_addr, page_buf, xd_sm_buf->redundant_buf);
				if(error)
				{
#ifdef  XD_SM_DEBUG
					Debug_Printf("#%s error occured in xd_sm_write_data()\n", xd_sm_error_to_string(error));
#endif
					//return error;
					break;
				}
			}
			if(error)
				continue;
			
			data_offset = offset;
			lba += page_cnt;
			page_nums -= page_cnt;
			
			xd_sm_clear_block_free(zone_no, free_blk_no);
			xd_sm_buf->logical_physical_table[zone_no][logical_no] = free_blk_no;
		}
		else
		{
			page_max = (page_no+page_nums) < xd_sm_pages_per_blk ? (page_no+page_nums) : xd_sm_pages_per_blk;
			page_cnt = 0;
			offset = data_offset;
			
			for(i=0; i<page_no; i++)
			{
				error = xd_sm_copy_page(zone_no, physical_no, i, free_blk_no, i);
				if(error)
				{
					error = XD_SM_ERROR_COPY_PAGE;
#ifdef  XD_SM_DEBUG
					Debug_Printf("#%s error occured in xd_sm_write_data()\n", xd_sm_error_to_string(error));
#endif
					//return error;
					break;
				}
			}
		
			for(j=page_no; j<page_max; j++)
			{
				xd_sm_format_redundant_area(data_buf+offset, xd_sm_buf->redundant_buf, block_addr);
					
				page_addr = (zone_no * xd_sm_physical_blks_perzone + free_blk_no) * xd_sm_pages_per_blk + j;
				error = xd_sm_auto_page_program(page_addr, data_buf+offset, xd_sm_buf->redundant_buf);
				if(error)
				{
#ifdef  XD_SM_DEBUG
					Debug_Printf("#%s error occured in xd_sm_write_data()\n", xd_sm_error_to_string(error));
#endif
					//return error;
					break;
				}
					
				offset += xd_sm_page_size;
				page_cnt++;
			}
			if(error)
				continue;

			for(k=page_max; k<xd_sm_pages_per_blk; k++)
			{
				error = xd_sm_copy_page(zone_no, physical_no, k, free_blk_no, k);
				if(error)
				{
					error = XD_SM_ERROR_COPY_PAGE;
#ifdef  XD_SM_DEBUG
					Debug_Printf("#%s error occured in xd_sm_write_data()\n", xd_sm_error_to_string(error));
#endif
					//return error;
					break;
				}
			}
			if(error)
				continue;
			
			data_offset = offset;
			lba += page_cnt;
			page_nums -= page_cnt;
			
			page_addr = (zone_no * xd_sm_physical_blks_perzone + physical_no) * xd_sm_pages_per_blk;
			error = xd_sm_auto_block_erase(page_addr);
			if(error)
			{
				error = XD_SM_ERROR_BLOCK_ERASE;
#ifdef  XD_SM_DEBUG
				Debug_Printf("#%s error occured in xd_sm_write_data()\n", xd_sm_error_to_string(error));
#endif
				//return error;
			}
			
			xd_sm_set_block_free(zone_no, physical_no);
			xd_sm_clear_block_free(zone_no, free_blk_no);
			xd_sm_buf->logical_physical_table[zone_no][logical_no] = free_blk_no;
		}
	}
	return XD_SM_NO_ERROR;
}