int k5600bg1_get_carrier (k5600bg1_t *u) { unsigned phy_stat; mutex_lock (&u->netif.lock); chip_select (1); phy_stat = ETH_REG->PHY_STAT; chip_select (0); mutex_unlock (&u->netif.lock); return (phy_stat & PHY_STAT_LINK) != 0; }
void k5600bg1_set_promisc (k5600bg1_t *u, int station, int group) { mutex_lock (&u->netif.lock); chip_select (1); unsigned mac_ctrl = ETH_REG->MAC_CTRL & ~MAC_CTRL_PRO_EN; if (station) { /* Accept any unicast. */ mac_ctrl |= MAC_CTRL_PRO_EN; } /* TODO: multicasts. */ ETH_REG->MAC_CTRL = mac_ctrl; chip_select (0); mutex_unlock (&u->netif.lock); }
void k5600bg1_debug (k5600bg1_t *u, struct _stream_t *stream) { unsigned short mac_ctrl, phy_ctrl, phy_stat, gctrl; unsigned short rxbf_head, rxbf_tail; unsigned short tx_ctrl, rx_ctrl, rx_len, rx_ptr; unsigned short stat_rx_all, stat_rx_ok, stat_rx_ovf; unsigned short stat_rx_lost, stat_tx_all, stat_tx_ok; mutex_lock (&u->netif.lock); chip_select (1); gctrl = ETH_REG->GCTRL; mac_ctrl = ETH_REG->MAC_CTRL; phy_ctrl = ETH_REG->PHY_CTRL; phy_stat = ETH_REG->PHY_STAT; rxbf_head = ETH_REG->RXBF_HEAD; rxbf_tail = ETH_REG->RXBF_TAIL; rx_ctrl = ETH_RXDESC[u->rn].CTRL; rx_len = ETH_RXDESC[u->rn].LEN; rx_ptr = ETH_RXDESC[u->rn].PTRL; tx_ctrl = ETH_TXDESC[0].CTRL; stat_rx_all = ETH_REG->STAT_RX_ALL; stat_rx_ok = ETH_REG->STAT_RX_OK; stat_rx_ovf = ETH_REG->STAT_RX_OVF; stat_rx_lost = ETH_REG->STAT_RX_LOST; stat_tx_all = ETH_REG->STAT_TX_ALL; stat_tx_ok = ETH_REG->STAT_TX_OK; chip_select (0); mutex_unlock (&u->netif.lock); printf (stream, "GCTRL = %b\n", gctrl, GCTRL_BITS); printf (stream, "MAC_CTRL = %b\n", mac_ctrl, MAC_CTRL_BITS); printf (stream, "PHY_CTRL = %b\n", phy_ctrl, PHY_CTRL_BITS); printf (stream, "PHY_STAT = %b\n", phy_stat, PHY_STAT_BITS); printf (stream, "INT_SRC = %b\n", u->intr_flags, INT_BITS); printf (stream, "RXBF HEAD:TAIL = %04x:%04x\n", rxbf_head, rxbf_tail); printf (stream, "RXDESC[%u].CTRL = %b\n", u->rn, rx_ctrl, DESC_RX_BITS); if (! (rx_ctrl & DESC_RX_RDY)) printf (stream, " .LEN = %u, .PTRL = %04x\n", rx_len, rx_ptr); printf (stream, " TXDESC.CTRL = %b\n", tx_ctrl, DESC_TX_BITS); printf (stream, "STAT_RX_ALL = %u\n", stat_rx_all); printf (stream, "STAT_RX_OK = %u\n", stat_rx_ok); printf (stream, "STAT_RX_OVF = %u\n", stat_rx_ovf); printf (stream, "STAT_RX_LOST = %u\n", stat_rx_lost); printf (stream, "STAT_TX_ALL = %u\n", stat_tx_all); printf (stream, "STAT_TX_OK = %u\n", stat_tx_ok); }
/* * Set PHY loop-back mode. */ void k5600bg1_set_loop (k5600bg1_t *u, int on) { unsigned phy_ctrl; mutex_lock (&u->netif.lock); chip_select (1); phy_ctrl = ETH_REG->PHY_CTRL; if (on) { phy_ctrl |= PHY_CTRL_LB; } else { phy_ctrl &= ~PHY_CTRL_LB; } ETH_REG->PHY_CTRL = phy_ctrl; chip_select (0); mutex_unlock (&u->netif.lock); }
long k5600bg1_get_speed (k5600bg1_t *u, int *duplex) { unsigned phy_ctrl, phy_stat; mutex_lock (&u->netif.lock); chip_select (1); phy_ctrl = ETH_REG->PHY_CTRL; phy_stat = ETH_REG->PHY_STAT; chip_select (0); mutex_unlock (&u->netif.lock); if (! (phy_stat & PHY_STAT_LINK)) return 0; if (duplex) *duplex = ! (phy_ctrl & PHY_CTRL_HALFD); return u->netif.bps; }
/** * Performs an SPI transfer */ static int do_spi_transfer(const struct spi_slave_params* cfg, void* txbuf, unsigned int wcount, void* rxbuf, unsigned int rcount) { int ret; int status; set_speed(cfg); chip_select(cfg, SPI_CS_ASSERT); /* Begin the transfer */ ret = spi_xfer(spi_bus, txbuf, wcount, rxbuf, rcount, spi_complete_callback, &status); if(ret >= 0){ bus_sem_wait(); ret = status; } chip_select(cfg, SPI_CS_RELEASE); return ret; }
int main() { char arry[255]={0}; mJTAGPortEnable(0); lcd_config(); lcd_ini(); chip_select(); //select the slavehhjhjkhk unsigned short address=0x0000; unsigned char da_ta=0x20; unsigned char loc=0x80; for(i=0x0000,n=0;n<255;i++,n++) { lcd_ini(); arry[n]=read_ext_eeprom(i); } }
/* * Set default values to Ethernet controller registers. */ static void chip_init (k5600bg1_t *u) { /* Включение тактовой частоты портов A-C, E, F. */ ARM_RSTCLK->PER_CLOCK |= ARM_PER_CLOCK_GPIOA | ARM_PER_CLOCK_GPIOB | ARM_PER_CLOCK_GPIOC | ARM_PER_CLOCK_GPIOE | ARM_PER_CLOCK_GPIOF | ARM_PER_CLOCK_EXT_BUS; /* Цифровые сигналы. */ ARM_GPIOA->ANALOG = 0xFFFF; // Data 0-15 ARM_GPIOB->ANALOG |= PORTB_NIRQ | PORTB_NRST; // nIRQ on PB10, nRST on PB11 ARM_GPIOC->ANALOG |= PORTC_NOE | PORTC_NWE; // nOE on PC1, nWE on PC2 ARM_GPIOE->ANALOG |= PORTE_NCS; // nCS on PE12 ARM_GPIOF->ANALOG |= 0x7FFC; // Addr 2-14 /* Быстрый фронт. */ ARM_GPIOA->PWR = 0xFFFFFFFF; ARM_GPIOB->PWR |= ARM_PWR_FASTEST(10) | ARM_PWR_FASTEST(11); ARM_GPIOC->PWR |= ARM_PWR_FASTEST(1) | ARM_PWR_SLOW(2); ARM_GPIOE->PWR |= ARM_PWR_FASTEST(12); ARM_GPIOF->PWR |= ARM_PWR_FASTEST(2) | ARM_PWR_FASTEST(3) | ARM_PWR_FASTEST(4) | ARM_PWR_FAST(5) | ARM_PWR_FASTEST(6) | ARM_PWR_FASTEST(7) | ARM_PWR_FAST(8) | ARM_PWR_FASTEST(9) | ARM_PWR_FASTEST(10) | ARM_PWR_FAST(11) | ARM_PWR_FASTEST(12) | ARM_PWR_FASTEST(13) | ARM_PWR_FAST(14); /* Основная функция для PA0-15(DATA), PC1(OE), PC2(WE), PF2-14(ADDR). * Альтернативная функция для PB10 (EXT_INT2). * Функция по умолчанию для PB11 и PE12. */ ARM_GPIOA->FUNC = 0x55555555; // Data 0-15 ARM_GPIOB->FUNC = (ARM_GPIOB->FUNC & // nIRQ on PB10, nRST on PB11 ~(ARM_FUNC_MASK(10) | ARM_FUNC_MASK(11))) | ARM_FUNC_ALT(10); ARM_GPIOC->FUNC = (ARM_GPIOC->FUNC & // nOE on PC1, nWE on PC2 ~(ARM_FUNC_MASK(1) | ARM_FUNC_MASK(2))) | ARM_FUNC_MAIN(1) | ARM_FUNC_MAIN(2); ARM_GPIOE->FUNC &= ~ARM_FUNC_MASK(12); // nCS on PE12 ARM_GPIOF->FUNC = (ARM_GPIOF->FUNC & // Addr 2-14 ~(ARM_FUNC_MASK(2) | ARM_FUNC_MASK(3) | ARM_FUNC_MASK(4) | ARM_FUNC_MASK(5) | ARM_FUNC_MASK(6) | ARM_FUNC_MASK(7) | ARM_FUNC_MASK(8) | ARM_FUNC_MASK(9) | ARM_FUNC_MASK(10) | ARM_FUNC_MASK(11) | ARM_FUNC_MASK(12) | ARM_FUNC_MASK(13) | ARM_FUNC_MASK(14))) | ARM_FUNC_MAIN(2) | ARM_FUNC_MAIN(3) | ARM_FUNC_MAIN(4) | ARM_FUNC_MAIN(5) | ARM_FUNC_MAIN(6) | ARM_FUNC_MAIN(7) | ARM_FUNC_MAIN(8) | ARM_FUNC_MAIN(9) | ARM_FUNC_MAIN(10) | ARM_FUNC_MAIN(11) | ARM_FUNC_MAIN(12) | ARM_FUNC_MAIN(13) | ARM_FUNC_MAIN(14); /* Для nOE и nWE отключаем режим открытого коллектора. */ ARM_GPIOC->PD &= ~(PORTC_NOE | PORTC_NWE); /* Для nRST включаем режим открытого коллектора. * Чтобы сделать переход от +3.3V к +5V. */ ARM_GPIOB->PD |= PORTB_NRST; ARM_GPIOB->PULL |= PORTB_NRST; /* Включаем выходные сигналы в неактивном состоянии. */ ARM_GPIOB->DATA &= ~PORTB_NRST; // nRST on PB11 ARM_GPIOB->OE &= ~PORTB_NRST; // открытый сток ARM_GPIOE->DATA |= PORTE_NCS; // nCS on PE12 ARM_GPIOE->OE |= PORTE_NCS; chip_reset (); /* Включение внешней шины адрес/данные в режиме RAM. * Длительность цикла должна быть не меньше 112.5 нс. * При частоте процессора 40 МГц (один такт 25 нс) * установка ws=11 или 12 даёт цикл в 150 нс. * Проверено: 125 нс (ws=9) недостаточно. */ ARM_EXTBUS->CONTROL = ARM_EXTBUS_RAM | ARM_EXTBUS_WS (15); chip_select (1); /* Режимы параллельного интерфейса к процессору. */ ETH_REG->GCTRL = GCTRL_GLBL_RST; udelay (1); ETH_REG->GCTRL = GCTRL_READ_CLR_STAT | GCTRL_SPI_RST | GCTRL_ASYNC_MODE | GCTRL_SPI_TX_EDGE | GCTRL_SPI_DIR | GCTRL_SPI_FRAME_POL | GCTRL_SPI_DIV(2); /* Общие режимы. */ ETH_REG->MAC_CTRL = MAC_CTRL_PRO_EN | // Прием всех пакетов MAC_CTRL_BCA_EN | // Прием всех широковещательных пакетов MAC_CTRL_HALFD_EN | // Полудуплексный режим MAC_CTRL_SHORT_FRAME_EN; // Прием коротких пакетов /* Режимы PHY. */ ETH_REG->PHY_CTRL = PHY_CTRL_DIR | // Прямой порядок битов в полубайте PHY_CTRL_RXEN | PHY_CTRL_TXEN | // Включение приёмника и передатчика PHY_CTRL_HALFD | // Полудуплесный режим PHY_CTRL_LINK_PERIOD (11); // Период LINK-импульсов /* Свой адрес. */ ETH_REG->MAC_ADDR[0] = u->netif.ethaddr[0] | (u->netif.ethaddr[1] << 8); ETH_REG->MAC_ADDR[1] = u->netif.ethaddr[2] | (u->netif.ethaddr[3] << 8); ETH_REG->MAC_ADDR[2] = u->netif.ethaddr[4] | (u->netif.ethaddr[5] << 8); ETH_REG->MIN_FRAME = 64; // Минимальная длина пакета ETH_REG->MAX_FRAME = K5600BG1_MTU + 4; // Максимальная длина пакета ETH_REG->COLLCONF = COLLCONF_COLLISION_WINDOW (64) | COLLCONF_RETRIES_LIMIT (15); // Лимит повторов передачи ETH_REG->IPGT = 96; // Межпакетный интервал ETH_REG->RXBF_TAIL = 0; ETH_REG->RXBF_HEAD = RXBUF_BYTES/2 - 1; /* Начальное состояние дескрипторов. */ unsigned i; for (i=0; i<NRD; i++) { ETH_RXDESC[i].CTRL = DESC_RX_RDY | DESC_RX_IRQ_EN; } ETH_RXDESC[NRD-1].CTRL |= DESC_RX_WRAP; ETH_TXDESC[0].CTRL = DESC_TX_WRAP; /* Ждём прерывания по приёму и передаче. */ ETH_REG->INT_MASK = INT_TXF | INT_RXF | INT_RXS | INT_RXE; chip_select (0); }