Example #1
0
void write_phy(uint8_t reg, uint16_t data)
{
	switch_bank(2);
	spi_transaction(WRITE_CONTROL_REGISTER, MIREGADR, reg);
	spi_transaction(WRITE_CONTROL_REGISTER, MIWRL, data & 0xFF);
	spi_transaction(WRITE_CONTROL_REGISTER, MIWRH, (data>>8) & 0xFF);

	switch_bank(3);	

	uint8_t read;
	do {
		read = spi_transaction(READ_CONTROL_REGISTER, MISTAT, 0);
	} while(read & (1<<BUSY));
}
Example #2
0
static void cmd_bfc(enc28j60_t *dev, uint8_t reg, int8_t bank, uint8_t mask)
{
    switch_bank(dev, bank);
    gpio_clear(dev->cs_pin);
    spi_transfer_reg(dev->spi, CMD_BFC | reg, mask, 0);
    gpio_set(dev->cs_pin);
}
Example #3
0
static void cmd_wcr(enc28j60_t *dev, uint8_t reg, int8_t bank, uint8_t value)
{
    switch_bank(dev, bank);
    gpio_clear(dev->cs_pin);
    spi_transfer_reg(dev->spi, CMD_WCR | reg, (char)value, 0);
    gpio_set(dev->cs_pin);
}
Example #4
0
void ethernet_initialize(uint8_t mac[6])
{
	//Conf the LEDs
	write_phy(PHLCON, 0b0011110000010011);

	//Configure some buffers and MAC stuff for half duplex
	//Recieve buffer spans 0x0000 to 0x0FFF
	switch_bank(0);
	spi_transaction(WRITE_CONTROL_REGISTER, ERXSTL, 0x00);
	spi_transaction(WRITE_CONTROL_REGISTER, ERXSTH, 0x00);
	spi_transaction(WRITE_CONTROL_REGISTER, ERXNDL, 0xFF);
	spi_transaction(WRITE_CONTROL_REGISTER, ERXNDH, 0x0F);

	spi_transaction(WRITE_CONTROL_REGISTER, ERXRDPTL, 0x00);
	spi_transaction(WRITE_CONTROL_REGISTER, ERXRDPTH, 0x00);

	//Transmit buffers covers 0x1000 to 0x1FFF
	//...

	uint8_t reg;
	do {
		reg = spi_transaction(READ_CONTROL_REGISTER, ESTAT, 0);
	} while(!(reg & (1<<CLKRDY)));

	//MAC settings
	switch_bank(2);
	spi_transaction(WRITE_CONTROL_REGISTER, MACON1, (1<<MARXEN));
	spi_transaction(WRITE_CONTROL_REGISTER, MACON3, 0b11110000);
	spi_transaction(WRITE_CONTROL_REGISTER, MACON4, 0b01000000); //DEFER

	//1518 bytes	
	spi_transaction(WRITE_CONTROL_REGISTER, MAMXFLL, 0xEE);
	spi_transaction(WRITE_CONTROL_REGISTER, MAMXFLH, 0x05);

	spi_transaction(WRITE_CONTROL_REGISTER, MABBIPG, 0x12);
	spi_transaction(WRITE_CONTROL_REGISTER, MAIPGL, 0x12);
	spi_transaction(WRITE_CONTROL_REGISTER, MAIPGH, 0x0C);

	set_mac(mac);

	write_phy(PHCON2, (1<<HDLDIS));
	write_phy(PHCON1, 0);

	//Enable reception
	spi_transaction(BIT_FIELD_SET, ECON1, (1<<RXEN));
	puts("Enabled reception");
}
Example #5
0
static uint8_t cmd_rcr(enc28j60_t *dev, uint8_t reg, int8_t bank)
{
    char res;

    switch_bank(dev, bank);
    gpio_clear(dev->cs_pin);
    spi_transfer_reg(dev->spi, CMD_RCR | reg, 0, &res);
    gpio_set(dev->cs_pin);
    return (uint8_t)res;
}
Example #6
0
static uint8_t cmd_rcr_miimac(enc28j60_t *dev, uint8_t reg, int8_t bank)
{
    char res[2];

    switch_bank(dev, bank);
    gpio_clear(dev->cs_pin);
    spi_transfer_regs(dev->spi, CMD_RCR | reg, NULL, res, 2);
    gpio_set(dev->cs_pin);
    return (uint8_t)res[1];
}
Example #7
0
void set_mac(uint8_t mac[6])
{
	switch_bank(3);
	spi_transaction(WRITE_CONTROL_REGISTER, MAADR1, mac[0]);
	spi_transaction(WRITE_CONTROL_REGISTER, MAADR2, mac[1]);
	spi_transaction(WRITE_CONTROL_REGISTER, MAADR3, mac[2]);
	spi_transaction(WRITE_CONTROL_REGISTER, MAADR4, mac[3]);
	spi_transaction(WRITE_CONTROL_REGISTER, MAADR5, mac[4]);
	spi_transaction(WRITE_CONTROL_REGISTER, MAADR6, mac[5]);
}
Example #8
0
void transmit_data(uint8_t * data, size_t len)
{
	switch_bank(0);
	spi_transaction(WRITE_CONTROL_REGISTER, ETXSTL, 0x00);
	spi_transaction(WRITE_CONTROL_REGISTER, ETXSTH, 0x10);

	spi_transaction(WRITE_CONTROL_REGISTER, EWRPTL, 0x00);
	spi_transaction(WRITE_CONTROL_REGISTER, EWRPTH, 0x10);

	spi_transaction(WRITE_BUFFER_MEMORY, 0x1A, 0b00000000); //control byte

	for(size_t i = 0; i < len; i++) {
		spi_transaction(WRITE_BUFFER_MEMORY, 0x1A, data[i]);
	}

	uint16_t end = 0x1000 + len;
	spi_transaction(WRITE_CONTROL_REGISTER, ETXNDL, end & 0xFF);
	spi_transaction(WRITE_CONTROL_REGISTER, ETXNDH, (end>>8) & 0xFF);

	spi_transaction(BIT_FIELD_SET, ECON1, (1<<TXRTS));

	uint8_t reg;
	do {
		reg = spi_transaction(READ_CONTROL_REGISTER, ECON1, 0);
	} while(reg & (1<<TXRTS));

	reg = spi_transaction(READ_CONTROL_REGISTER, ESTAT, 0);
	if(reg & (1<<TXABRT)) {
		puts("Error occured during transmission");
		}
		if(reg & (1<<LATECOL)) {
			puts("Late collision occured");
		}
		spi_transaction(WRITE_CONTROL_REGISTER, ERDPTL, (end+1) & 0xFF);
		spi_transaction(WRITE_CONTROL_REGISTER, ERDPTH, ((end+1)>>8) & 0xFF);

		for(int i = 0; i < 7; i++) {
			printf("0x%02X ", spi_transaction(READ_BUFFER_MEMORY, 0x1A, 0));
		}
		puts("");
	//}
}
static int w83977af_probe(int iobase, int irq, int dma)
{
  	int version;
	int i;
  	
 	for (i=0; i < 2; i++) {
		IRDA_DEBUG( 0, "%s()\n", __func__ );
#ifdef CONFIG_USE_W977_PNP
 		/* Enter PnP configuration mode */
		w977_efm_enter(efbase[i]);
  
 		w977_select_device(W977_DEVICE_IR, efbase[i]);
  
 		/* Configure PnP port, IRQ, and DMA channel */
 		w977_write_reg(0x60, (iobase >> 8) & 0xff, efbase[i]);
 		w977_write_reg(0x61, (iobase) & 0xff, efbase[i]);
  
 		w977_write_reg(0x70, irq, efbase[i]);
#ifdef CONFIG_ARCH_NETWINDER
		/* Netwinder uses 1 higher than Linux */
 		w977_write_reg(0x74, dma+1, efbase[i]);
#else
 		w977_write_reg(0x74, dma, efbase[i]);   
#endif /*CONFIG_ARCH_NETWINDER */
 		w977_write_reg(0x75, 0x04, efbase[i]);  /* Disable Tx DMA */
  	
 		/* Set append hardware CRC, enable IR bank selection */	
 		w977_write_reg(0xf0, APEDCRC|ENBNKSEL, efbase[i]);
  
 		/* Activate device */
 		w977_write_reg(0x30, 0x01, efbase[i]);
  
 		w977_efm_exit(efbase[i]);
#endif /* CONFIG_USE_W977_PNP */
  		/* Disable Advanced mode */
  		switch_bank(iobase, SET2);
  		outb(iobase+2, 0x00);  
 
 		/* Turn on UART (global) interrupts */
 		switch_bank(iobase, SET0);
  		outb(HCR_EN_IRQ, iobase+HCR);
  	
  		/* Switch to advanced mode */
  		switch_bank(iobase, SET2);
  		outb(inb(iobase+ADCR1) | ADCR1_ADV_SL, iobase+ADCR1);
  
  		/* Set default IR-mode */
  		switch_bank(iobase, SET0);
  		outb(HCR_SIR, iobase+HCR);
  
  		/* Read the Advanced IR ID */
  		switch_bank(iobase, SET3);
  		version = inb(iobase+AUID);
  	
  		/* Should be 0x1? */
  		if (0x10 == (version & 0xf0)) {
 			efio = efbase[i];
 
 			/* Set FIFO size to 32 */
 			switch_bank(iobase, SET2);
 			outb(ADCR2_RXFS32|ADCR2_TXFS32, iobase+ADCR2);	
 	
 			/* Set FIFO threshold to TX17, RX16 */
 			switch_bank(iobase, SET0);	
 			outb(UFR_RXTL|UFR_TXTL|UFR_TXF_RST|UFR_RXF_RST|
			     UFR_EN_FIFO,iobase+UFR);
 
 			/* Receiver frame length */
 			switch_bank(iobase, SET4);
			outb(2048 & 0xff, iobase+6);
			outb((2048 >> 8) & 0x1f, iobase+7);

			/* 
			 * Init HP HSDL-1100 transceiver. 
			 * 
			 * Set IRX_MSL since we have 2 * receive paths IRRX, 
			 * and IRRXH. Clear IRSL0D since we want IRSL0 * to 
			 * be a input pin used for IRRXH 
			 *
			 *   IRRX  pin 37 connected to receiver 
			 *   IRTX  pin 38 connected to transmitter
			 *   FIRRX pin 39 connected to receiver      (IRSL0) 
			 *   CIRRX pin 40 connected to pin 37
			 */
			switch_bank(iobase, SET7);
			outb(0x40, iobase+7);
			
			IRDA_MESSAGE("W83977AF (IR) driver loaded. "
				     "Version: 0x%02x\n", version);
			
			return 0;
		} else {
static int w83977af_probe(int iobase, int irq, int dma)
{
  	int version;
	int i;
  	
 	for (i=0; i < 2; i++) {
		IRDA_DEBUG( 0, "%s()\n", __func__ );
#ifdef CONFIG_USE_W977_PNP
 		
		w977_efm_enter(efbase[i]);
  
 		w977_select_device(W977_DEVICE_IR, efbase[i]);
  
 		
 		w977_write_reg(0x60, (iobase >> 8) & 0xff, efbase[i]);
 		w977_write_reg(0x61, (iobase) & 0xff, efbase[i]);
  
 		w977_write_reg(0x70, irq, efbase[i]);
#ifdef CONFIG_ARCH_NETWINDER
		
 		w977_write_reg(0x74, dma+1, efbase[i]);
#else
 		w977_write_reg(0x74, dma, efbase[i]);   
#endif 
 		w977_write_reg(0x75, 0x04, efbase[i]);  
  	
 			
 		w977_write_reg(0xf0, APEDCRC|ENBNKSEL, efbase[i]);
  
 		
 		w977_write_reg(0x30, 0x01, efbase[i]);
  
 		w977_efm_exit(efbase[i]);
#endif 
  		
  		switch_bank(iobase, SET2);
  		outb(iobase+2, 0x00);  
 
 		
 		switch_bank(iobase, SET0);
  		outb(HCR_EN_IRQ, iobase+HCR);
  	
  		
  		switch_bank(iobase, SET2);
  		outb(inb(iobase+ADCR1) | ADCR1_ADV_SL, iobase+ADCR1);
  
  		
  		switch_bank(iobase, SET0);
  		outb(HCR_SIR, iobase+HCR);
  
  		
  		switch_bank(iobase, SET3);
  		version = inb(iobase+AUID);
  	
  		
  		if (0x10 == (version & 0xf0)) {
 			efio = efbase[i];
 
 			
 			switch_bank(iobase, SET2);
 			outb(ADCR2_RXFS32|ADCR2_TXFS32, iobase+ADCR2);	
 	
 			
 			switch_bank(iobase, SET0);	
 			outb(UFR_RXTL|UFR_TXTL|UFR_TXF_RST|UFR_RXF_RST|
			     UFR_EN_FIFO,iobase+UFR);
 
 			
 			switch_bank(iobase, SET4);
			outb(2048 & 0xff, iobase+6);
			outb((2048 >> 8) & 0x1f, iobase+7);

			switch_bank(iobase, SET7);
			outb(0x40, iobase+7);
			
			IRDA_MESSAGE("W83977AF (IR) driver loaded. "
				     "Version: 0x%02x\n", version);
			
			return 0;
		} else {
Example #11
0
int packets_available()
{
	//Read EPKTCNT
	switch_bank(1);
	return(spi_transaction(READ_CONTROL_REGISTER, EPKTCNT, 0));
}