#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/hardware.h>
#include <asm-arm/arch-s3c2410/gpio.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#define msleep(x) usleep(x*1000)
#define DELAY 100
int gpf_fd;
sem_t sem1, sem2; //信号量 P、V
unsigned int KEY;
unsigned int bit = 0;
unsigned int key_temp = 0;
int key_scan()
{
unsigned int a, b, key = 0;
if(ioctl(gpf_fd, GPIO_SET_MULTI_PIN_IN, 0x0F) != 0) //
{
perror("set out error!");
exit(1);
}
read(gpf_fd, &key, sizeof(key)); //
a = key;
msleep(10); //防抖
b = key;
if(a == b)
{
if(key == 1)
{
key_temp++;
if(key_temp == 5)
{
key_temp = 0;
}
return key_temp;
}
if(key == 8)
{
return key;
}
}
else
{
return 0;
}
}
void right_wing(void) //
{
if(bit >= 0 && bit < 8)
{
ioctl(gpf_fd, GPIO_SET_PIN, bit);
msleep(DELAY);
ioctl(gpf_fd, GPIO_CLR_PIN, bit);
msleep(DELAY);
bit++;
}
else
{
bit = 0;
}
}
void left_wing(void) //
{
if(bit >= 0 && bit < 8)
{
ioctl(gpf_fd, GPIO_SET_PIN, bit);
msleep(DELAY);
ioctl(gpf_fd, GPIO_CLR_PIN, bit);
msleep(DELAY);
bit--;
}
else
{
bit = 7;
}
}
void ray(void) //
{
ioctl( gpf_fd, GPIO_SET_ALL_PIN );
msleep( DELAY );
ioctl( gpf_fd, GPIO_CLR_ALL_PIN );
msleep( DELAY );
}
void come_and_go(void) //
{
for(; bit < 7; bit++)
{
ioctl(gpf_fd, GPIO_SET_PIN, bit);
msleep(DELAY);
ioctl(gpf_fd, GPIO_CLR_PIN, bit);
msleep(DELAY);
}
for(; bit > 0; bit--)
{
ioctl(gpf_fd, GPIO_SET_PIN, bit);
msleep(DELAY);
ioctl(gpf_fd, GPIO_CLR_PIN, bit);
msleep(DELAY);
}
}
void *thread1(void *arg) //thread 1 --do key
{
while(1)
{
sem_wait(&sem2); //wait sem2
KEY = key_scan();
sem_post(&sem1); //
}
exit(1);
}
void *thread2(void *arg) //thread 2 --do tasks
{
unsigned int i = 0;
while(1)
{
sem_wait(&sem1); //wait sem1
if(ioctl(gpf_fd, GPIO_SET_MULTI_PIN_OUT, 0xFF) != 0)
{
perror("set out error!");
exit(1);
}
if(KEY != 0)
i = KEY;
//printf("%d\n", i); //
switch(i)
{
case 1:
right_wing(); //右移
break;
case 2:
left_wing(); //左移
break;
case 3:
ray(); //闪烁
break;
case 4:
come_and_go(); //回环点亮
break;
default:
break;
}
sem_post(&sem2); //
}
exit(1);
}
int main(void) //
{
pthread_t tid1, tid2;
void *tret;
if((gpf_fd = open("/dev/gpf/0", O_RDWR)) < 0)
{
perror("open error!");
exit(1);
}
sem_init(&sem1, 0, 0);
sem_init(&sem2, 0, 1);
pthread_create(&tid1, NULL, thread1, NULL);
pthread_create(&tid2, NULL, thread2, NULL);
pthread_join(tid1, &tret);
pthread_join(tid2, &tret);
return 0;
}
编译
# arm-linux-gcc key_f.c -o key_f -I /home/skyily/tools/kernel/include/ -lpthread
导进arm板中,运行前 要装gpio驱动 insmod s3c2410-gpf.o
:s3c2410 gpio驱动,上面的附件里有。
|