ºìÁªLinuxÃÅ»§
Linux°ïÖú

µÚÒ»´Î³É¹¦µÄÇý¶¯³ÌÐò

·¢²¼Ê±¼ä:2008-08-01 12:59:49À´Ô´:ºìÁª×÷Õß:Yohcc
¡¡¡¡×÷Õߣºzhangzhiyin88

¡¡¡¡½üÀ´¶þÖÜÓÉÓÚ¹¤×÷Ô­Òò£¬ÐèÒªÐÞ¸ÄÇý¶¯³ÌÐòµÄ¹¤×÷£¬¾¡¹ÜÒ»Ö±Ïë×öÕâ·½ÃæµÄ¹¤×÷£¬×ܾõµÃÕâ·½ÃæµÄ¹¤×÷ͦÓÐÌôÕ½ÐԵģ¬¿ÉÊǵØÖ±¶¼´¦ÓÚÒ»¸öÀíÂÛ״̬£¬Ö±µ½×î½ü¶þÖÜ¡£

¡¡¡¡ÏÖÔÚÎҾͽéÉÜÒ»ÏÂÎҵijɹ¦¾­ÑéºÍÔÚ¿ª·¢¹ý³ÌÖÐÓöµ½µÄÎÊÌâ¡£

¡¡¡¡Ò»¡¢¶Ô¶ÁijһGPIOÒý½ÅµÄLinuxϵͳÇý¶¯µÄ¿ª·¢±³¾°£º

¡¡¡¡1¡¢MCUоƬ£ºFIC8120 £¨»ùÓÚARM9µÄÄںˣ©£»

¡¡¡¡2¡¢²Ù×÷ϵͳ£ºLinux £¨2.4Äں˰汾£©£»

¡¡¡¡¶þ¡¢³ÌÐòÔ´Â룺

¡¡¡¡1¡¢Çý¶¯Ô´Â룺

ÒýÓÃ:
#define GPIO_read 0x1110
static int gpio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
switch (cmd)
{
// add codes by zhiyin 2008-7-25 11:34:42
case GPIO_read:
put_user( *(volatile unsigned int *) (CPE_GPIO_VA_BASE + 0x4), (unsigned long *)arg);
// 1¡¢put_user£º°ÑÄں˿ռäµÄÊý¾Ý¿½±´µ½Óû§¿Õ¼ä£»
// 2¡¢CPE_GPIO_VA_BASE + 0x4£º GpioDataIn¼Ä´æÆ÷µØÖ·£»
// 3¡¢arg£ºÓû§Ó¦ÓóÌÐò´«¹ýÀ´µÄµØÖ·²ÎÊý£»
// 4¡¢´ÓÉÏÃæµÄ½âÎöÖв»ÄÑÀí½â£¬Çý¶¯µÄ¹¦ÄÜÊÇ°Ñ GpioDataIn¼Ä´æÆ÷µÄÄÚÈÝ¿½±´µ½argµØÖ·
// Ëù¶ÔÓ¦µÄÓû§¿Õ¼ä
break;
}
}


¡¡¡¡2¡¢Ó¦ÓóÌÐò£º

ÒýÓÃ:
#include
#include
#include
#include
#include

#define DEVICE_GPIOTEST "/dev/gpio"
#define GPIO_read 0x1110

void read_gpio()
{
int fd;
unsigned long pin = 0;

// open device for gpio
if((fd=open(DEVICE_GPIOTEST,O_NONBLOCK))<0)
{
perror("can not open device");
exit(1);
}

ioctl(fd, GPIO_read, &pin);
// Èç¹ûijһÒý½ÅÊäÈëµÄÊǸߵçƽÄÄôÏàÓ¦µÄλµÄÖµÓ¦¸ÃΪ"1",·ñÔòΪ"0"£»
// Èç·µ»Ø½á¹ûµÄÖµµÄ¶þ½øÖÆÐÎʽΪ£º100000 ˵Ã÷GPIO5Ϊ¸ßµçƽ£»
printf("zhiyin: pin= %d\n", pin);

// close device for gpio
if(close(fd) < 0)
{
perror("close");
exit(1);
}
}


¡¡¡¡Èý¡¢ºó¼Ç

¡¡¡¡¿´ÁËÖ®ºóÄãÊÇ·ñ¾õµÃ¼òµ¥Ñ½£¡µ«ÊÇÕâ¿ÉÊÇ»¨ÁËÎÒ½ü¶þÖܵÄʱ¼äŶ£¡ºÇºÇ£¬ÍòÊ¿ªÍ·ÄÑѽ£¬¾¡¹Ü½á¹ûºÜ¼òµ¥µ«ÊÇÔÚ×öµÄʱºòÄãÐèÒªÕæÕýÀí½â´úÂëµÄÿһ¸öϸ½Ú£¬²¢ÇÒÒªÓÐÒ»¸ö½Ï´óµÄ֪ʶȦ±ÈÈ磺

¡¡¡¡1¡¢¾«Í¨Linuxϵͳ¸÷¸ö²ãÃæµÄ²Ù×÷ºÍ¶ÔÇý¶¯³ÌÐòµÄÀí½â£»

¡¡¡¡2¡¢ÍòÓÃ±í¡¢²¨Æ÷µÄÊìÁ·Ê¹Óã»

¡¡¡¡3¡¢ÄÜ¿´¶®ÏàÓ¦µÄµç·ͼ£»

¡¡¡¡4¡¢×îºóÒ»µãÒ²ÊÇ×îÖØÒªµÄÒ»µã¾ÍÊÇÒ»¶¨Òª¼á³ÖÏÂÈ¥£¬¿ÉÄÜÄã×öÁ˺ܶàµÄ¡°ÎÞÓù¦¡±£¬µ«ÊÇ»òÐí³É¹¦¾ÍÊÇÕâÑùÒ»µãÒ»µÎµÄ¡°ÎÞÓù¦¡±»ýÀÛÆðÀ´µÄ£¡
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ