static inline void fl_wr32_cmd(struct bankdesc *b, uint32_t a, uint32_t off, uint32_t cmd) { if ( 1 == b->width ) { if ( off == UNLK2_ADDR_16 ) off = UNLK2_ADDR_8; else /* all others are simply left shifted */ off <<= 1; } cmd = fl_splat32(b, cmd); a = ADDR32(b, a, off); fl_wr32(b, a, cmd); }
STATIC int flash_get_id_s160(struct bankdesc *b, uint32_t addr, uint32_t *pVendorId, uint32_t *pDeviceId) { uint32_t dev_id[3], x, i; if ( 4 != FLASH_STRIDE(b) ) fprintf(stderr,"Warning: strides other than 4 untested\n(%s at %d)\n", __FILE__,__LINE__); if ( 2 != b->width ) fprintf(stderr,"Warning: device width other than 2 untested\n(%s at %d)\n", __FILE__,__LINE__); addr &= ~ (ADDR32(b, 0, 0x1000) - 1); unlk(b, addr); fl_wr32_cmd(b, addr, UNLK1_ADDR_16, ASEL_DATA); *pVendorId = fl_rd32(b, addr, VEND_ID_ADDR_16) & 0xff; dev_id [0] = fl_rd32(b, addr, DEV1_ID_ADDR_16); dev_id [1] = fl_rd32(b, addr, DEV2_ID_ADDR_16); dev_id [2] = fl_rd32(b, addr, DEV3_ID_ADDR_16); #ifdef DEBUG printf("Vendor Id 0x%08"PRIx32", Dev Ids: 0x%08"PRIx32", 0x%08"PRIx32", 0x%08"PRIx32"\n", *pVendorId, dev_id[0], dev_id[1], dev_id[2]); #endif flash_array_mode_s160(b, addr); for ( x=0, i=0; i<3; i++ ) { x = (x<<8) | (dev_id[i] & 0xff); } *pDeviceId = x; return 0; }
static inline uint32_t fl_rd32(struct bankdesc *b, uint32_t a, uint32_t off) { volatile union bconv *p; uint32_t rval; if ( 1 == b->width ) off <<= 1;; a = ADDR32(b, a, off); p = (volatile union bconv *)a; if ( 4 == FLASH_STRIDE(b) ) { rval = p->u; IOSYNC(p->u); } else if ( 2 == FLASH_STRIDE(b) ) { rval = p->s[0]; IOSYNC(p->s[0]); } else { rval = p->c[0]; IOSYNC(p->c[0]); } return rval; }
void InitXHyper255A(void) { ADDR32(GPIO_BASE+GPDR2) |= GPDR2_VALUE; //~0x0;//((ADDR32(GPIO_BASE+GPDR2) & 0x0001FFFF) | GPDR2_VALUE); ADDR32(GPIO_BASE+GAFR2_L) |= GAFR2L_VALUE; ADDR32(MEM_CTL_BASE+MSC1) = 0x00008259;//0x000095F8; }
/* Send unlock sequence */ static inline void unlk(struct bankdesc *b, uint32_t a) { a &= ~ ( ADDR32(b, 0,0x1000) - 1 ); fl_wr32_cmd(b, a, UNLK1_ADDR_16, UNLK1_DATA); fl_wr32_cmd(b, a, UNLK2_ADDR_16, UNLK2_DATA); }