Esempio n. 1
0
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;
}
Esempio n. 2
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
/*
 * 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);
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
/**
 * 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;
}
Esempio n. 7
0
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);
			
			
		}
			
	}
Esempio n. 8
0
/*
 * 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);
}