Hi folk,
I'm trying to have some interrupt from the GPIO from my net4801. After
looking at the PC87366's datasheet, I seen that some of the pins of
the GPIO are not interrupt enabled, a few are. So I tried to get an
interrupt from the GPIO8 (soekris name) witch is GPIO04 on the
PC87366. I configured some register in order to have the interrupt on
that pin. But when I am toggling the input level on that pin, nothing
append. I think I maybe forgot something.
Some one has already do such thing ? If yes, does he have some code
that I can take as template ?
Here is my PC87366 initialization code, if you want to have a look at
it. (Note that is not a linux code, but code for eCos RTOS, but I
thing you can understand it. HAL_WRITE_UINT8 is equivalent as outb()
and so one)
Tank's
Antoine
#define INDEX_REG 0x2E
#define DATA_REG 0x2F
#define LDR_INDEX 0x07
#define SIO_ID_INDEX 0x20
#define BASE_ADDR_MSB_INDEX 0x60
#define BASE_ADDR_LSB_INDEX 0x61
#define INT_NUM_INDEX 0x70
#define INT_TYPE_INDEX 0x71
#define LDC_INDEX 0x30
#define GPIO_PSR_INDEX 0xF0
#define GPIO_PCR_INDEX 0xF1
#define GPIO_PERR_INDEX 0xF2
#define GPIO_LDR_VALUE 0x07
#define PC87366_ID 0xE9
/* GPIO base address */
int gpioBaseAddr = 0;
unsigned char sioId;
int temp = 0;
//Read SIO ID
HAL_WRITE_UINT8(INDEX_REG, SIO_ID_INDEX);//Set index for SIO ID
HAL_READ_UINT8(DATA_REG, sioId);
printf("Super IO id is %X\n", sioId);
if( sioId != PC87366_ID ) {
printf("Bad device found !");
return;
}
//switch to GPIO function bloc LDN
HAL_WRITE_UINT8(INDEX_REG, LDR_INDEX);
HAL_WRITE_UINT8(DATA_REG, GPIO_LDR_VALUE);
//Write Interrupt number
if(irq > 0 && irq <= 15) {
HAL_WRITE_UINT8(INDEX_REG, INT_NUM_INDEX);
HAL_WRITE_UINT8(DATA_REG, 0x10 | irq);
printf("GPIO is interrupt %d.\n", irq);
HAL_WRITE_UINT8(INDEX_REG, INT_TYPE_INDEX);
HAL_WRITE_UINT8(DATA_REG, 0x00);
}
//Read GPIO port base address
HAL_WRITE_UINT8(INDEX_REG, BASE_ADDR_MSB_INDEX);
HAL_READ_UINT8(DATA_REG, temp);
gpioBaseAddr = temp << 8;
HAL_WRITE_UINT8(INDEX_REG, BASE_ADDR_LSB_INDEX);
HAL_READ_UINT8(DATA_REG, temp);
gpioBaseAddr |= temp;
printf("GPIO ports base adress is 0x%04X\n", gpioBaseAddr);
// Set GPIO04 as an input (without pull-up)
//Select pin 04
HAL_WRITE_UINT8(INDEX_REG, GPIO_PSR_INDEX);
HAL_WRITE_UINT8(DATA_REG, 0x04 );
//Set as a input with no pull-up, rising edge event, no debounce
HAL_WRITE_UINT8(INDEX_REG, GPIO_PCR_INDEX);
HAL_WRITE_UINT8(DATA_REG, 0x20 );
//Enalbe interrupt on GPIO04
HAL_WRITE_UINT8(INDEX_REG, GPIO_PERR_INDEX);
HAL_WRITE_UINT8(DATA_REG, 0x01 );
HAL_WRITE_UINT8((gpioBaseAddr + OFFSET_GPEVEN0), 0x10);
_______________________________________________
Soekris-tech mailing list
[email protected]
http://lists.soekris.com/mailman/listinfo/soekris-tech