嵌入式系統 - gpio 相關




LED 燈號控制 (假定 LED 的 GPIO 為十進制的 34)


echo 34 > /sys/class/gpio/export // 指定控制 gpio 34
echo out > /sys/class/gpio/gpio34/direction // 指定方向 (in, out)
echo 1 > /sys/class/gpio/gpio34/value // 亮
echo 0 > /sys/class/gpio/gpio34/value // 不亮



factory reset 按鍵 (假定 GPIO 為 9)


echo 9 > /sys/class/gpio/export // 指定控制 gpio 9 (預設方向為 in,所以不用再指定方向)
cat /sys/class/gpio/gpio9/value // 0: 未按壓, 1: 已按壓



列出所有 gpio 的內容


cat /sys/kernel/debug/gpio



使用 /dev/gpio 控制範例


static int doit = 0;
#define RALINK_GPIO_ENABLE_INTP 0x08
#define RALINK_GPIO_DISABLE_INTP 0x09
#define RALINK_GPIO_REG_IRQ 0x0A
typedef struct {
unsigned int irq; //request irq pin number
pid_t pid; //process id to notify
} ralink_gpio_reg_info;
static void nvramIrqHandler(int signum)
{
if (!doit && signum == SIGUSR2) {
doit = 1;
// todo ...
}
}
int main(int argc, char **argv)
{
int fd;
ralink_gpio_reg_info info;

signal(SIGUSR1, nvramIrqHandler);
signal(SIGUSR2, nvramIrqHandler);

fd = open("/dev/gpio", O_RDONLY);
if (fd < 0) {
perror("/dev/gpio");
return -1;
}

//enable gpio interrupt
if (ioctl(fd, RALINK_GPIO_ENABLE_INTP) < 0)
goto ioctl_err;

info.pid = getpid();
info.irq = 18;

//register gpio
if (ioctl(fd, RALINK_GPIO_REG_IRQ, &info) < 0)
goto ioctl_err;

close(fd);

while(1) {
sleep(60);
}
return 0;

ioctl_err:
perror("ioctl");
close(fd);
return -1;
}



FILE *fp;
if ((fptr = fopen("/proc/gpio","r"))) { // 0:not push, 1:push
char buf[20];
fgets(buf, sizeof(buf), fptr);
sscanf(buf,"%d", &push_button);
fclose(fptr);
}



使用 /dev/mem 控制範例


int _8a110_read_bt( void)
{
int fd;
void *smc_addr,*psmc_addr;
u32 u32tmp;
u8 u8tmp;

if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
printf("open /dev/mem Error\n");

psmc_addr = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,\
fd,SMC_MAP_ADDRESS & ~MAP_MASK);

if(psmc_addr == (void *) -1)
printf("Memory mapped at address %p. Error\n", psmc_addr);

smc_addr = psmc_addr + (SMC_MAP_ADDRESS & MAP_MASK);

u32tmp = (*(volatile u32 *)(smc_addr));

*(volatile u8 *)(smc_addr + GPIO_SW_ADDRESS) = 0x01; // set Multi PIN = GPIO
write( fd, smc_addr + GPIO_SW_ADDRESS, 1);

u8tmp = (*(volatile u8 *)(smc_addr + GPIO_SW_READ));

if( munmap( psmc_addr, MAP_SIZE) == -1) {
perror( " Error un-mmapping the file");
}
close(fd);

if( u8tmp == 0x28) return 1;
else return 0;

}



int _8a110_control_led(int hl)
{
int fd;
void *smc_addr,*psmc_addr;
u32 u32tmp;

if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
printf("open /dev/mem Error\n");

psmc_addr = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,\
fd,SMC_MAP_ADDRESS & ~MAP_MASK);

if(psmc_addr == (void *) -1)
printf("Memory mapped at address %p. Error\n", psmc_addr);

smc_addr = psmc_addr + (SMC_MAP_ADDRESS & MAP_MASK);

u32tmp = (*(volatile u32 *)(smc_addr));

*(volatile u8 *)(smc_addr + PROGRAM_ADDRESS) = 0x01; // set Multi PIN = GPIO
write( fd, smc_addr + PROGRAM_ADDRESS, 1);

if (hl)
*(volatile u8 *)(smc_addr + GPIO_LED_OFFSET) = 0x40; // LED OFF
else
*(volatile u8 *)(smc_addr + GPIO_LED_OFFSET) = 0x00; // LED ON
write( fd, smc_addr + GPIO_LED_OFFSET, 1);

if( munmap( psmc_addr, MAP_SIZE) == -1) {
perror( " Error un-mmapping the file");
}
close(fd);

return 0;
}


沒有留言:

張貼留言