Beispiel #1
0
static int ocsdc_data_finish(struct ocsdc * dev) {
	int status;

    while ((status = ocsdc_read(dev, OCSDC_DAT_INT_STATUS)) == 0);
    ocsdc_write(dev, OCSDC_DAT_INT_STATUS, 0);

    if (status & SDCMSC_DAT_INT_STATUS_TRS) {
	uart_print_str("ocsdc_data_finish: ok\n");
    	return 0;
    }
    else {
	uart_print_str("ocsdc_data_finish: status: ");
	uart_print_long(status);
	uart_print_str("\n"); 
    	return -1;
    }
}
Beispiel #2
0
void uart_test()
{
	uart_init();
	uart_print_str("uart_test\n");
	
	while (1) {
		uart_print_ch(uart_recv_poll());
	}
}
Beispiel #3
0
struct mmc * ocsdc_mmc_init(int base_addr, int clk_freq)
{
	struct mmc *mmc;
	struct ocsdc *priv;

	mmc = malloc(sizeof(struct mmc));
	if (!mmc) goto MMC_ALLOC;
	priv = malloc(sizeof(struct ocsdc));
	if (!priv) goto OCSDC_ALLOC;

	memset(mmc, 0, sizeof(struct mmc));
	memset(priv, 0, sizeof(struct ocsdc));

	priv->iobase = base_addr;
	priv->clk_freq = clk_freq;

	sprintf(mmc->name, "ocsdc");
	mmc->priv = priv;
	mmc->send_cmd = ocsdc_send_cmd;
	mmc->set_ios = ocsdc_set_ios;
	mmc->init = ocsdc_init;
	mmc->getcd = NULL;

	mmc->f_min = priv->clk_freq/6; /*maximum clock division 64 */
	mmc->f_max = priv->clk_freq/2; /*minimum clock division 2 */
	mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
	mmc->host_caps = MMC_MODE_4BIT;//MMC_MODE_HS | MMC_MODE_HS_52MHz | MMC_MODE_4BIT;

	mmc->b_max = 1<<12;//256;

	return mmc;

OCSDC_ALLOC:
	uart_print_str("OCSDC_ALLOC\n");
	free(mmc);
MMC_ALLOC:
	uart_print_str("MMC_ALLOC\n");
	return NULL;
}
Beispiel #4
0
static void ocsdc_setup_data_xfer(struct ocsdc * dev, struct mmc_cmd *cmd, struct mmc_data *data) {

	//invalidate cache
	if (data->flags & MMC_DATA_READ) {
		flush_dcache_range(data->dest, data->dest+data->blocksize*data->blocks);
		ocsdc_write(dev, OCSDC_DST_SRC_ADDR, (uint32_t)data->dest);
	}
	else {
		flush_dcache_range((void *)data->src, (void *)data->src+data->blocksize*data->blocks);
		ocsdc_write(dev, OCSDC_DST_SRC_ADDR, (uint32_t)data->src);
	}
	uart_print_str("Blksz: ");
	uart_print_long(data->blocksize);
	uart_print_str("\n");
	uart_print_str("BlkCnt: ");
	uart_print_long(data->blocks-1);
	uart_print_str("\n");
	ocsdc_write(dev, OCSDC_BLOCK_SIZE, data->blocksize);
	ocsdc_write(dev, OCSDC_BLOCK_COUNT, data->blocks-1);


}
Beispiel #5
0
int main()
{
	uart_init(JSP_BASE);

	int_init();
	int_add(JSP_IRQ, &uart_interrupt, NULL);
	
	/* We can't use printf because in this simple example
	   we don't link C library. */
	uart_print_str("Hello World.\n");
	
	report(0xdeaddead);
	or32_exit(0);
}
Beispiel #6
0
static int ocsdc_finish(struct ocsdc * dev, struct mmc_cmd *cmd) {

	int retval = 0;
	while (1) {
	
		int r2 = ocsdc_read(dev, OCSDC_CMD_INT_STATUS);
		uart_print_str("finish cmd : status:");
		uart_print_long(cmd->cmdidx);
		uart_print_long(r2);
		uart_print_str("\n");
		//printf("ocsdc_finish: cmd %d, status %x\n", cmd->cmdidx, r2);
		if (r2 & OCSDC_CMD_INT_STATUS_EI) {
			//clear interrupts
			ocsdc_write(dev, OCSDC_CMD_INT_STATUS, 0);
			uart_print_str("OCSDC_CMD_INT_STATUS_EI\n");
			//printf("ocsdc_finish: cmd %d, status %x\n\r", cmd->cmdidx, r2);
			retval = -1;
			break;
		}
		else if (r2 & OCSDC_CMD_INT_STATUS_CC) {
			//clear interrupts
			ocsdc_write(dev, OCSDC_CMD_INT_STATUS, 0);
			//get response
			cmd->response[0] = ocsdc_read(dev, OCSDC_RESPONSE_1);
			if (cmd->resp_type & MMC_RSP_136) {
				cmd->response[1] = ocsdc_read(dev, OCSDC_RESPONSE_2);
				cmd->response[2] = ocsdc_read(dev, OCSDC_RESPONSE_3);
				cmd->response[3] = ocsdc_read(dev, OCSDC_RESPONSE_4);
			}
			uart_print_str("ocsdc_finish: ok\n");
			retval = 0;

			break;
		}
	}
	return retval;
}
int sd_get_rca(sd_card *d)
{
  uint32 rtn_reg=0;
  SD_REG(SD_COMMAND) = CMD3 | CICE | CRCE | RSP_48;  
  SD_REG(SD_ARG)=0;

  if (sd_wait_rsp() == 0)         
    return 0;
  else{ 
    rtn_reg = SD_REG(SD_NORMAL_INT_STATUS);
    if ( (rtn_reg  & EI) == EI)    //Error in response, init failed return.
      return 0;
    rtn_reg = SD_REG(SD_RESP1);
    d->rca=((rtn_reg&RCA_RCA_MASK)>>16);
    uart_print_str("rca fine");
		
  }
  return 1;

}
Beispiel #8
0
static int ocsdc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
{
	struct ocsdc * dev = mmc->priv;

	int command = (cmd->cmdidx << 8);
	if (cmd->resp_type & MMC_RSP_PRESENT) {
		if (cmd->resp_type & MMC_RSP_136)
			command |= 2;
		else {
			command |= 1;
		}
	}
	if (cmd->resp_type & MMC_RSP_BUSY)
		command |= (1 << 2);
	if (cmd->resp_type & MMC_RSP_CRC)
		command |= (1 << 3);
	if (cmd->resp_type & MMC_RSP_OPCODE)
		command |= (1 << 4);

	if (data && ((data->flags & MMC_DATA_READ) || ((data->flags & MMC_DATA_WRITE))) && data->blocks) {
		if (data->flags & MMC_DATA_READ)
			command |= (1 << 5);
		if (data->flags & MMC_DATA_WRITE)
			command |= (1 << 6);
		ocsdc_setup_data_xfer(dev, cmd, data);
	}
	uart_print_str("ocsdc_send_smd\n");
	uart_print_long(command);
	uart_print_str("\n");
	ocsdc_write(dev, OCSDC_COMMAND, command);
	uart_print_str(" argument\n");
	uart_print_long(cmd->cmdarg);
	uart_print_str("\n");
	ocsdc_write(dev, OCSDC_ARGUMENT, cmd->cmdarg);
	if (ocsdc_finish(dev, cmd) < 0)
	{uart_print_str("ret -1\n"); return -1;}
	if (data && data->blocks)
	{uart_print_str("ret dat\n"); return ocsdc_data_finish(dev);}
	else  uart_print_str("ret 0\n"); return 0;
}
Beispiel #9
0
int main()
{
  char c;
  char block[512];
  int i;

  uart_init();
  /* version = get_master_version(); */
  /* uart_print_str("0x"); */
  /* uart_print_hex8(version); */
  /* uart_print_str("\n"); */
  
  if (!sd_init())
    uart_print_str("sd card initialized!");
  else uart_print_str("sd card initialisation fails!");
  uart_print_str("\n");

  uart_print_str("Before: RX FIFO entries:");
  while(1)
  c = REG8(SPI_MASTER_BASE+RX_FIFO_DATA_COUNT_MSB);
  uart_print_hex8(c);
  c = REG8(SPI_MASTER_BASE+RX_FIFO_DATA_COUNT_LSB);
  uart_print_hex8(c);
  uart_print_str("\n");

  /* if (!sd_block_write()) */
  /*   uart_print_str("sd card write succeeds!"); */
  /* else uart_print_str("sd card write fails!"); */
  /* uart_print_str("\n"); */

  /* if (!sd_block_read()) */
  /*   uart_print_str("sd card read succeeds!"); */
  /* else uart_print_str("sd card read fails!"); */
  /* uart_print_str("\n"); */
  
  /* for (i=0;i<512;i++) */
  /*   { */
  /*     uart_print_hex8(block[i]); */
  /*     uart_print_str("."); */
  /*   } */
  uart_print_str("\n");
  return 0;
}
sd_card sd_controller_init ()
{
  sd_card dev;
  unsigned int reg;
  unsigned int i;

  volatile unsigned long rtn_reg=0;
  volatile  unsigned long rtn_reg1=0;

  REG32(SD_CONTROLLER_BASE+SD_COMMAND) =0x0000;
  REG32(SD_CONTROLLER_BASE+SD_ARG)   =0x0000;
  sd_wait_rsp();

//while(1) {SD_REG(SD_COMMAND)=0x0000;}
//while(1) {reg = SD_REG(SD_COMMAND);}

  REG32(SD_CONTROLLER_BASE+SD_TIMEOUT)=0x000FFFE;
  REG32(SD_CONTROLLER_BASE+SD_CTRL) =0x00000010;
 	 
  REG32(SD_CONTROLLER_BASE+SD_SOFTWARE_RST)=0x0000001; 
  REG32(SD_CONTROLLER_BASE+SD_CLOCK_D)=0x0000000;
  REG32(SD_CONTROLLER_BASE+SD_SOFTWARE_RST)=0x0000000; 
   
  REG32(SD_CONTROLLER_BASE+SD_COMMAND) =0x0000;
  REG32(SD_CONTROLLER_BASE+SD_ARG)   =0x0000;
  sd_wait_rsp();

  uart_print_str("SD_CTRL: \n");
  uart_print_long(REG32(SD_CONTROLLER_BASE+SD_CTRL));
  uart_print_str("\n");


	SD_REG(SD_COMMAND) =  CMD8 | CICE | CRCE | RSP_48;
	SD_REG(SD_ARG) = VHS|CHECK_PATTERN;

	dev.phys_spec_2_0 = sd_wait_rsp();
  

/*
  SD_REG(SD_COMMAND) =  CMD8 | CICE | CRCE | RSP_48;
  //SD_REG(SD_COMMAND) =  CMD8 | RSP_48;
  SD_REG(SD_ARG) = VHS|CHECK_PATTERN;    
  //SD_REG(SD_ARG) = 0;    
  dev.phys_spec_2_0 = sd_wait_rsp();
  */
  if (dev.phys_spec_2_0)   
    uart_print_str("2_0 CARD \n");
  else uart_print_str("NOT 2_0 CARD \n");

  uart_print_long(REG32(SD_CONTROLLER_BASE+SD_RESP1));


  while (REG32(SD_CONTROLLER_BASE+SD_STATUS)& 1) {}

  //uart_print_str("card staus: \n");
  //uart_print_long(rtn_reg);
  //uart_print_str("\n");
  	
  rtn_reg=0;


  while ((rtn_reg & BUSY)!=BUSY)
    {

      REG32(SD_CONTROLLER_BASE+SD_COMMAND) = CMD55| CICE | CRCE | RSP_48;
      REG32(SD_CONTROLLER_BASE+SD_ARG) =0;
      sd_wait_rsp();
      REG32(SD_CONTROLLER_BASE+SD_COMMAND) =ACMD41 | RSP_48;
      REG32(SD_CONTROLLER_BASE+SD_ARG)   =0x40FF8000;
      sd_wait_rsp();
      rtn_reg= REG32(SD_CONTROLLER_BASE+SD_RESP1);
//rtn_reg= REG32(SD_CONTROLLER_BASE+SD_STATUS);
      //uart_print_str("response: \n");
      //uart_print_long(rtn_reg);
      //uart_print_str("\n");
    }

  dev.Voltage_window=rtn_reg&VOLTAGE_MASK;
  dev.HCS_s = rtn_reg&HCS;

  //GET CID
  uart_print_str("send command 2 ...\n");
  REG32(SD_CONTROLLER_BASE+SD_COMMAND) =CMD2 | RSP_136;
  REG32(SD_CONTROLLER_BASE+SD_ARG)=0;
  sd_wait_rsp();

  //Get RCA
  uart_print_str("send command 3 ...\n");
  SD_REG(SD_COMMAND) = CMD3 | CICE | CRCE | RSP_48;  
  SD_REG(SD_ARG)=0;
  sd_wait_rsp();
  rtn_reg = SD_REG(SD_RESP1);
  dev.rca = ((rtn_reg&RCA_RCA_MASK));
   
  dev.Active=1;
  return dev;

}
Beispiel #11
0
void putsln(unsigned char * str){
    uart_print_str(str);
    uart_begin();
    uart_print_char(STR_NEWLINE);
    uart_end();
}
Beispiel #12
0
void puts(unsigned char * str){
    uart_print_str(str);
}