MX6412J GPIO Programming Guide
=
1. GPIO Header of [MX6412J](https://www.bcmcom.com/bcm_product_MX6412J.html)
|Function |Pin |Pin|Function |
| :---: | :---: | :---: |:---: |
|VCC |1 | 2 | GND|
|GPIO01 |3 | 4 | GPIO05 |
|GPIO02 |5 | 6 | GPIO06 |
|GPIO03 |7 | 8 | GPIO07 |
|GPIO04 |9 | 10 | GPIO08 |
2. Nuvoton NCT6126D
-- Dwonload Datasheet and Programming Guide.
-- I/O port: 2E/2Fh
-- section 7.1 (p.52) Confgiuration Sequence
-- Unlock code: 0x87
-- Exit code: 0xAA
2.1 Mapping to NCT6126D GP4X
-- Reg F0h: 0 = output, 1 = input (default)
-- Reg F1h: data register
|GPIO Header |NCT6126D Pin# |Reg F0/F1h|
| :---: | :---: | :---: |
|GPIO01 |GP47 | bit7 |
|GPIO02 |GP42 | bit2 |
|GPIO03 |GP41 | bit1 |
|GPIO04 |GP40 | bit0 |
2.2 Mapping to NCT6126D GP3X
-- Reg ECh: 0 = output, 1 = input (default)
-- Reg EDh: data register
|GPIO Header |NCT6126D Pin# |Reg EC/EDh|
| :---: | :---: | :---: |
|GPIO05 |GP37 | bit7 |
|GPIO06 |GP36 | bit6 |
|GPIO07 |GP35 | bit5 |
|GPIO08 |GP34 | bit4 |
3. Sample code
```code=
#include <stdio.h>
#include <sys/io.h>
#define SIO_INDEX 0x2E
#define SIO_DATA 0x2F
void sio_unlock()
{
outb(0x87, SIO_INDEX);
outb(0x87, SIO_INDEX);
}
void sio_lock()
{
outb(0xAA, SIO_INDEX);
}
void sio_ldn(unsigned char ldn)
{
outb(0x7, SIO_INDEX);
outb(ldn, SIO_DATA);
}
void sio_write_reg(unsigned char reg, unsigned char val)
{
outb(reg, SIO_INDEX);
outb(val, SIO_DATA);
}
unsigned char sio_read_reg(unsigned char reg)
{
outb(reg, SIO_INDEX);
return inb(SIO_DATA);
}
void config_gpio01()
{
// change to LDN7
sio_ldn(0x7);
// Set GP47 as output (clear bit7)
sio_write_reg(0xF0, sio_read_reg(0xF0) & ~(1 << 7));
}
void config_gpio(int pin)
{
// change to LDN7
sio_ldn(0x7);
switch(pin){
case 1:
// Set GP47 as output (clear bit7)
sio_write_reg(0xF0, sio_read_reg(0xF0) & ~(1 << 7));
break;
case 2:
// Set GP42 as output (clear bit2)
sio_write_reg(0xF0, sio_read_reg(0xF0) & ~(1 << 2));
break;
case 3:
// Set GP41 as output (clear bit1)
sio_write_reg(0xF0, sio_read_reg(0xF0) & ~(1 << 1));
break;
case 4:
// Set GP40 as output (clear bit0)
sio_write_reg(0xF0, sio_read_reg(0xF0) & ~(1 << 0));
break;
case 5:
// Set GP37 as output (clear bit7)
sio_write_reg(0xEC, sio_read_reg(0xEC) & ~(1 << 7));
break;
case 6:
// Set GP36 as output (clear bit6)
sio_write_reg(0xEC, sio_read_reg(0xEC) & ~(1 << 6));
break;
case 7:
// Set GP35 as output (clear bit5)
sio_write_reg(0xEC, sio_read_reg(0xEC) & ~(1 << 5));
break;
case 8:
// Set GP34 as output (clear bit4)
sio_write_reg(0xEC, sio_read_reg(0xEC) & ~(1 << 4));
break;
}
}
void write_gpio01(int val)
{
if (val)
{
// set to high
sio_write_reg(0xF1, sio_read_reg(0xF1) | (1 << 7));
}
else
{
// set to low
sio_write_reg(0xF1, sio_read_reg(0xF1) & ~(1 << 7));
}
}
void write_gpio(int pin, int val)
{
if (val)
{
// set to high
switch(pin){
case 1:
sio_write_reg(0xF1, sio_read_reg(0xF1) | (1 << 7));
break;
case 2:
sio_write_reg(0xF1, sio_read_reg(0xF1) | (1 << 2));
break;
case 3:
sio_write_reg(0xF1, sio_read_reg(0xF1) | (1 << 1));
break;
case 4:
sio_write_reg(0xF1, sio_read_reg(0xF1) | (1 << 0));
break;
case 5:
sio_write_reg(0xED, sio_read_reg(0xED) | (1 << 7));
break;
case 6:
sio_write_reg(0xED, sio_read_reg(0xED) | (1 << 6));
break;
case 7:
sio_write_reg(0xED, sio_read_reg(0xED) | (1 << 5));
break;
case 8:
sio_write_reg(0xED, sio_read_reg(0xED) | (1 << 4));
break;
}
}
else
{
// set to low
switch(pin){
case 1:
sio_write_reg(0xF1, sio_read_reg(0xF1) & ~(1 << 7));
break;
case 2:
sio_write_reg(0xF1, sio_read_reg(0xF1) & ~(1 << 2));
break;
case 3:
sio_write_reg(0xF1, sio_read_reg(0xF1) & ~(1 << 1));
break;
case 4:
sio_write_reg(0xF1, sio_read_reg(0xF1) & ~(1 << 0));
break;
case 5:
sio_write_reg(0xED, sio_read_reg(0xED) & ~(1 << 7));
break;
case 6:
sio_write_reg(0xED, sio_read_reg(0xED) & ~(1 << 6));
break;
case 7:
sio_write_reg(0xED, sio_read_reg(0xED) & ~(1 << 5));
break;
case 8:
sio_write_reg(0xED, sio_read_reg(0xED) & ~(1 << 4));
break;
}
}
}
int main()
{
iopl(3);
// Unlock NCT6126D
sio_unlock();
for (int i = 1; i <= 8; i++){
// Enable GPIO
config_gpio(i);
printf("Set GPIO0%d to high\n", i);
write_gpio(i, 1);
printf("Press Enter to continue\n");
while (getchar() != '\n');
printf("Set GPIO0%d to low\n", i);
write_gpio(i, 0);
printf("Press Enter to continue\n");
while (getchar() != '\n');
}
// lock NCT6126
sio_lock();
return 0;
}
```
###### tags: `gpio` `MX6412J`