void ddrrd(char *startaddr) { char *c; unsigned int addr; int i; if(*startaddr == 0) { printf("ddrrd <address>\n"); return; } addr = strtoul(startaddr, &c, 0); if(*c != 0) { printf("incorrect address\n"); return; } dfii_pi0_address_write(addr); dfii_pi0_baddress_write(0); command_p0(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA); cdelay(15); for(i=0;i<8;i++) printf("%02x", MMPTR(0xe0000834+4*i)); for(i=0;i<8;i++) printf("%02x", MMPTR(0xe0000884+4*i)); printf("\n"); }
void sdrwloff(void) { dfii_pi0_address_write(DDR3_MR1); dfii_pi0_baddress_write(1); command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS); ddrphy_wlevel_en_write(0); }
void ddrrow(char *_row) { char *c; unsigned int row; if(*_row == 0) { dfii_pi0_address_write(0x0000); dfii_pi0_baddress_write(0); command_p0(DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS); cdelay(15); printf("Precharged\n"); } else { row = strtoul(_row, &c, 0); if(*c != 0) { printf("incorrect row\n"); return; } dfii_pi0_address_write(row); dfii_pi0_baddress_write(0); command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CS); cdelay(15); printf("Activated row %d\n", row); } }
static void init_sequence(void) { int i; /* Bring CKE high */ dfii_pi0_address_write(0x0000); dfii_pi0_baddress_write(0); dfii_control_write(DFII_CONTROL_CKE); /* Precharge All */ dfii_pi0_address_write(0x0400); command_p0(DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS); /* Load Extended Mode Register */ dfii_pi0_baddress_write(1); dfii_pi0_address_write(0x0000); command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS); dfii_pi0_baddress_write(0); /* Load Mode Register */ dfii_pi0_address_write(0x0132); /* Reset DLL, CL=3, BL=4 */ command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS); cdelay(200); /* Precharge All */ dfii_pi0_address_write(0x0400); command_p0(DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS); /* 2x Auto Refresh */ for(i=0;i<2;i++) { dfii_pi0_address_write(0); command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_CS); cdelay(4); } /* Load Mode Register */ dfii_pi0_address_write(0x0032); /* CL=3, BL=4 */ command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS); cdelay(200); }
static void read_delays(void) { unsigned int prv; unsigned char prs[DFII_NPHASES*DFII_PIX_DATA_SIZE]; int p, i, j; int working; int delay, delay_min, delay_max; printf("Read delays: "); /* Generate pseudo-random sequence */ prv = 42; for(i=0;i<DFII_NPHASES*DFII_PIX_DATA_SIZE;i++) { prv = 1664525*prv + 1013904223; prs[i] = prv; } /* Activate */ dfii_pi0_address_write(0); dfii_pi0_baddress_write(0); command_p0(DFII_COMMAND_RAS|DFII_COMMAND_CS); cdelay(15); /* Write test pattern */ for(p=0;p<DFII_NPHASES;p++) for(i=0;i<DFII_PIX_DATA_SIZE;i++) MMPTR(dfii_pix_wrdata_addr[p]+4*i) = prs[DFII_PIX_DATA_SIZE*p+i]; dfii_piwr_address_write(0); dfii_piwr_baddress_write(0); command_pwr(DFII_COMMAND_CAS|DFII_COMMAND_WE|DFII_COMMAND_CS|DFII_COMMAND_WRDATA); /* Calibrate each DQ in turn */ dfii_pird_address_write(0); dfii_pird_baddress_write(0); for(i=0;i<DFII_PIX_DATA_SIZE/2;i++) { ddrphy_dly_sel_write(1 << (DFII_PIX_DATA_SIZE/2-i-1)); delay = 0; /* Find smallest working delay */ ddrphy_rdly_dq_rst_write(1); while(1) { command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA); cdelay(15); working = 1; for(p=0;p<DFII_NPHASES;p++) { if(MMPTR(dfii_pix_rddata_addr[p]+4*i) != prs[DFII_PIX_DATA_SIZE*p+i]) working = 0; if(MMPTR(dfii_pix_rddata_addr[p]+4*(i+DFII_PIX_DATA_SIZE/2)) != prs[DFII_PIX_DATA_SIZE*p+i+DFII_PIX_DATA_SIZE/2]) working = 0; } if(working) break; delay++; if(delay >= ERR_DDRPHY_DELAY) break; ddrphy_rdly_dq_inc_write(1); } delay_min = delay; /* Get a bit further into the working zone */ delay++; ddrphy_rdly_dq_inc_write(1); /* Find largest working delay */ while(1) { command_prd(DFII_COMMAND_CAS|DFII_COMMAND_CS|DFII_COMMAND_RDDATA); cdelay(15); working = 1; for(p=0;p<DFII_NPHASES;p++) { if(MMPTR(dfii_pix_rddata_addr[p]+4*i) != prs[DFII_PIX_DATA_SIZE*p+i]) working = 0; if(MMPTR(dfii_pix_rddata_addr[p]+4*(i+DFII_PIX_DATA_SIZE/2)) != prs[DFII_PIX_DATA_SIZE*p+i+DFII_PIX_DATA_SIZE/2]) working = 0; } if(!working) break; delay++; if(delay >= ERR_DDRPHY_DELAY) break; ddrphy_rdly_dq_inc_write(1); } delay_max = delay; printf("%d:%02d-%02d ", DFII_PIX_DATA_SIZE/2-i-1, delay_min, delay_max); /* Set delay to the middle */ ddrphy_rdly_dq_rst_write(1); for(j=0;j<(delay_min+delay_max)/2;j++) ddrphy_rdly_dq_inc_write(1); } /* Precharge */ dfii_pi0_address_write(0); dfii_pi0_baddress_write(0); command_p0(DFII_COMMAND_RAS|DFII_COMMAND_WE|DFII_COMMAND_CS); cdelay(15); printf("completed\n"); }