📄 bf537_io.c
字号:
} else if (addr >= UART_IO_START_ADDR && addr < UART_IO_END_ADDR) { return uart_read_long (addr); } else if (addr >= DEU_IO_START_ADDR && addr < DEU_IO_END_ADDR) { return deu_read_long (addr); } else if (addr >= EBIU_IO_START_ADDR && addr < EBIU_IO_END_ADDR) { return ebiu_read_long (addr); } else if (addr >= SIC_IO_START_ADDR && addr < SIC_IO_END_ADDR) { return sic_read_long (addr); } else if (addr >= L1MEM_IO_START_ADDR && addr < L1MEM_IO_END_ADDR) { return l1mem_read_long (addr); } else if (addr >= L1DMEM_IO_START_ADDR && addr < L1DMEM_IO_END_ADDR) { return l1dmem_read_long (addr); } else if (addr >= CORE_INT_IO_START_ADDR && addr < CORE_INT_IO_END_ADDR) { return core_int_read_long (addr); } else if (addr >= RTC_IO_START_ADDR && addr < RTC_IO_END_ADDR) { return rtc_read_long (addr); } else if (addr >= CORE_TIMER_IO_START_ADDR && addr < CORE_TIMER_IO_END_ADDR) { return core_timer_read_long (addr); } else if (addr >= TBUF_IO_START_ADDR && addr < TBUF_IO_END_ADDR) { return tbuf_read_long (addr); } else if (addr >= PORT_IO_START_ADDR && addr <= PORT_IO_END_ADDR){ return port_read_long (addr); } else if(addr >= ETH_IO_START_ADDR && addr <= ETH_IO_END_ADDR){ return eth_read_long (addr); } else { IO_ERR; } }}static voidbf537_io_write_byte (void * state, bu32 addr, bu8 v){ switch (addr) { default: if (addr >= DMA_IO_START_ADDR && addr < DMA_IO_END_ADDR) { dma_write_byte (addr, v); } else if (addr >= UART_IO_START_ADDR && addr < UART_IO_END_ADDR) { uart_write_byte (addr, v); } else { IO_ERR; } } return;}static voidbf537_io_write_word (void * state, bu32 addr, bu16 v){ if (addr >= DMA_IO_START_ADDR && addr < DMA_IO_END_ADDR) { dma_write_word (addr, v); } else if (addr >= UART_IO_START_ADDR && addr < UART_IO_END_ADDR) { uart_write_word (addr, v); } else if (addr >= EBIU_IO_START_ADDR && addr < EBIU_IO_END_ADDR) { ebiu_write_word (addr, v); } else if (addr >= WD_IO_START_ADDR && addr < WD_IO_END_ADDR) { wd_write_word (addr, v); } else if (addr >= DPMC_IO_START_ADDR && addr < DPMC_IO_END_ADDR) { dpmc_write_word (addr, v); } else if (addr >= RTC_IO_START_ADDR && addr < RTC_IO_END_ADDR) { rtc_write_word (addr, v); } else if (addr >= PF_IO_START_ADDR && addr < PF_IO_END_ADDR) { pf_write_word (addr, v); } else if (addr >= PORT_IO_START_ADDR && addr <= PORT_IO_END_ADDR){ port_write_word (addr, v); } else { IO_ERR; } return;}static voidbf537_io_write_long (void * state, bu32 addr, bu32 v){ switch (addr) { default: if (addr >= DMA_IO_START_ADDR && addr < DMA_IO_END_ADDR) { dma_write_long (addr, v); } else if (addr >= UART_IO_START_ADDR && addr < UART_IO_END_ADDR) { uart_write_long (addr, v); } else if (addr >= EBIU_IO_START_ADDR && addr < EBIU_IO_END_ADDR) { ebiu_write_long (addr, v); } else if (addr >= CORE_INT_IO_START_ADDR && addr < CORE_INT_IO_END_ADDR) { core_int_write_long (addr, v); } else if (addr >= SIC_IO_START_ADDR && addr < SIC_IO_END_ADDR) { sic_write_long (addr, v); } else if (addr >= L1MEM_IO_START_ADDR && addr < L1MEM_IO_END_ADDR) { l1mem_write_long (addr, v); } else if (addr >= L1DMEM_IO_START_ADDR && addr < L1DMEM_IO_END_ADDR) { l1dmem_write_long (addr, v); } else if (addr >= RTC_IO_START_ADDR && addr < RTC_IO_END_ADDR) { rtc_write_long (addr, v); } else if (addr >= CORE_TIMER_IO_START_ADDR && addr < CORE_TIMER_IO_END_ADDR) { core_timer_write_long (addr, v); } else if (addr >= TBUF_IO_START_ADDR && addr < TBUF_IO_END_ADDR) { tbuf_write_long (addr, v); } else if(addr >= ETH_IO_START_ADDR && addr <= ETH_IO_END_ADDR){ eth_write_long (addr, v); } else { IO_ERR; } } return;}static bu16uart_read_word (bu32 addr){ bu16 data; //printf("bf537_uart_read,addr=%x\n",addr); bu32 offset = addr - UART_IO_START_ADDR; /* if(offset != 0 && offset != 0x14 && offset != 0xc && offset!=0x4) printf("###############offset=0x%x\n",offset); */ static int read_num = 0; switch (offset) { case 0x0: // RbR if (bf537_io.uart.lcr & 0x80) { data = bf537_io.uart.dlh; } if (read_num == 0) { read_num = 1; return 'k'; } if (read_num == 1) { bf537_io.uart.lsr &= ~0x1; bf537_io.sic.sic_isr &= ~0x800; data = bf537_io.uart.rbr & 0xff; //bf537_io.uart.iir = 0x1; read_num = 0; //fprintf (PF, "*****read rbr=%x,pc=%x,isr=%x\n", data, // PCREG, bf537_io.sic.sic_isr); } break; case 0x4: // ier if (bf537_io.uart.lcr & 0x80) data = bf537_io.uart.dlh; else data = bf537_io.uart.ier; break; case 0x8: // iir data = bf537_io.uart.iir; //printf("read iir=%x,pc=%x\n",data,PCREG); bf537_io.uart.iir = 0x1; break; case 0xc: // lcr data = bf537_io.uart.lcr; break; case 0x10: // MCR data = 0x0; break; case 0x14: // LSR data = bf537_io.uart.lsr; //printf("read lsr=%x,pc=%x\n",data,PCREG); break; case 0x1c: // SCR data = bf537_io.uart.lcr; break; case 0x24: // SCR data = bf537_io.uart.gctl; break; default: IO_ERR; DBG_PRINT ("uart_read(%s=0x%08x)\n", "uart_reg", addr); break; } return (data);}static voiduart_write_word (bu32 addr, bu16 data){ bu32 offset = addr - UART_IO_START_ADDR; /* if(offset != 0 && offset != 0xc) printf("in %s,offset=%x,value = %x\n", __FUNCTION__, offset,data); */ switch (offset) { case 0x0: // THR { unsigned char c = data & 0xff; /*There is no TSR ,so we set TEMT and THRE together */ bf537_io.uart.lsr |= 0x60; bf537_io.sic.sic_isr &= ~0x1000; bf537_io.uart.iir = 0x1; /* 2007-01-18 modified by Anthony Lee : for new uart device frame */ skyeye_uart_write(-1, &c, 1, NULL); } break; case 0x4: //FCR /*just walkaround code to open uart */ if (bf537_io.uart.lcr & 0x80) { bf537_io.uart.dlh = data; } else { bf537_io.uart.ier = data; /*generate RX interrupt */ if (data & 0x1) { } /*generate TX interrupt */ if (data & 0x2) { } } break; case 0xc: // SCR bf537_io.uart.lcr = data; break; case 0x24: bf537_io.uart.gctl = data; break; default: IO_ERR; //printf("%c", data); fflush(stdout); DBG_PRINT ("uart_write(%s=0x%08x)\n", "uart_reg", addr); break; }}static bu32uart_read_long (bu32 addr){ bu16 ret; IO_ERR; return ret;}static voiduart_write_long (bu32 addr, bu32 value){ uart_write_word(addr, (value & 0xffff)); //IO_ERR; return;}static bu8uart_read_byte (bu32 addr){ bu8 ret; IO_ERR; return ret;}static voiduart_write_byte (bu32 addr, bu8 value){ IO_ERR; return;}static bu16ebiu_read_word (bu32 addr){ int offset = addr - EBIU_IO_START_ADDR; switch (offset) { case 0: return bf537_io.ebiu.amgctl; case 4: return bf537_io.ebiu.ambctl0; case 8: return bf537_io.ebiu.ambctl1; case 0x10: return bf537_io.ebiu.sdgctl; case 0x1c: return bf537_io.ebiu.sdstat; default: IO_ERR; } return;}static bu32ebiu_read_long (bu32 addr){ int offset = addr - EBIU_IO_START_ADDR; switch (offset) { case 0: return bf537_io.ebiu.amgctl; case 4: return bf537_io.ebiu.ambctl0; case 8: return bf537_io.ebiu.ambctl1; case 0x10: return bf537_io.ebiu.sdgctl; default: IO_ERR; } return;}static voidebiu_write_long (bu32 addr, bu32 v){ int offset = addr - EBIU_IO_START_ADDR; switch (offset) { case 0: bf537_io.ebiu.amgctl = v; break; case 4: bf537_io.ebiu.ambctl0 = v; break; case 8: bf537_io.ebiu.ambctl1 = v; break; case 0x10: bf537_io.ebiu.sdgctl = v; break; default: IO_ERR; } return;}static voidebiu_write_word (bu32 addr, bu16 v){ int offset = addr - EBIU_IO_START_ADDR; switch (offset) { case 0: bf537_io.ebiu.amgctl = v; break; case 4: bf537_io.ebiu.ambctl0 = v; break; case 8: bf537_io.ebiu.ambctl1 = v; break; case 0x18: bf537_io.ebiu.sdrrc = v; break; default: IO_ERR; } return;}static bu8dma_read_byte (bu32 addr){ bu8 ret = 0; IO_ERR; return ret;}static voiddma_write_byte (bu32 addr, bu8 value){ IO_ERR; /* int channel = addr&0x3c0; int offset = (addr&0x3f)>>2; bf537_io.dma.bf537_dma_channel[channel][offset] = value; */ return;}static bu16dma_read_word (bu32 addr){ bu16 ret; int channel = (addr & 0x3c0) >> 6; int offset = (addr & 0x3f) >> 2; ret = bf537_io.dma.bf537_dma_channel[channel][offset]; return ret;}static voiddma_write_word (bu32 addr, bu16 value){ int i; int channel = (addr & 0x3c0) >> 6; int offset = (addr & 0x3f) >> 2; DBG_PRINT("\nIn %s,channel=0x%x,offset = %x,value=%x\n",__FUNCTION__, channel,offset,value); switch (offset) { case 0x2: /* CONFIG */ bf537_io.dma.bf537_dma_channel[channel][offset] = value; if (!(value & 0x1)) break; if (channel == BF537_MDMA_D0) { unsigned int src = bf537_io.dma.bf537_dma_channel[BF537_MDMA_S0][START_ADDR]; unsigned int dst = bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][START_ADDR]; short x_modify = (short)bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][X_MODIFY]; unsigned int size = bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][X_COUNT] * \ abs(x_modify); /* if two-demisbf537_io. is used */ if(bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][DMA_CONFIG] & 0x10){ size = size * bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][Y_COUNT] * \ bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][Y_MODIFY]; } /* if 16 width is used */ if((((bf537_io.dma.bf537_dma_channel[BF537_MDMA_D0][DMA_CONFIG] & 0xc) >> 2)) == 0x1){ size = size / 2; } i = size; //mem_cpy(start_addr,end_addr,size); /*work around code for dma copy to isram */ /* if (dst >= 0xffa00000) { return; }*/ /***************************************/ DBG_PRINT ( "DMA copy begin from 0x%x to 0x%x,size=0x%x\n", src, dst, size); for (; i >= 0; i--) { if(x_modify > 0) put_byte (saved_state.memory, dst++, get_byte (saved_state.memory, src++)); else put_byte (saved_state.memory, dst--, get_byte (saved_state.memory, src--)); } } break; default: bf537_io.dma.bf537_dma_channel[channel][offset] = value; break; } return;}static bu32dma_read_long (bu32 addr){ bu32 ret; int channel = (addr & 0x3c0) >> 6; int offset = (addr & 0x3f) >> 2; ret = bf537_io.dma.bf537_dma_channel[channel][offset]; return ret;}static voiddma_write_long (bu32 addr, bu32 value){ int channel = (addr & 0x3c0) >> 6; int offset = (addr & 0x3f) >> 2; DBG_PRINT("\nIn %s channel=0x%x,offset = %x,value=%x\n",__FUNCTION__,channel,offset,value); bf537_io.dma.bf537_dma_channel[channel][offset] = value; return;}static voidcore_int_write_long (bu32 addr, bu32 v){ int offset = addr - CORE_INT_IO_START_ADDR; //printf("%x,%x\n",addr,v); switch (offset) { case 0x104: bf537_io.core_int.imask = (v | 0x1f) & 0xffff; break; case 0x108: bf537_io.core_int.ipend = v; break; case 0x10c: bf537_io.core_int.ilat = v; //printf("write ilat %x\n",v); break; case 0x110: bf537_io.core_int.iprio= v; break; default: if (offset >= 0 && offset < 0x100) { bf537_io.core_int.evt[offset >> 2] = v; return; } IO_ERR; }}static bu32
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -