LED驱动程序相关头文件简单介绍

LED驱动程序相关头文件简单介绍

标签: cstructoutputmoduletypesfile
4511人阅读 评论(1) 收藏 举报
本文章已收录于:
分类:
  1. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
  2.                                 《常识》  
  3. ¥应用程序----->系统内核----->设备驱动----->硬件设备  
  4. ¥设备驱动既是系统内核的下属,又是硬件设备的老大。    
  5. ¥在inux系统中用一个文件来代表一个设备。这个文件就叫设备文件。设备驱动的责任是将应用程序对设备文件  
  6. 的打开、读、写、定位等操作转化为对硬件设备的打开、读、写、定位等操作。而对于任何硬件设备,应用程序  
  7. 只需利用这些基本操作就可以完全控制它!  
  8. ¥编写linux设备驱动需要的知识结构:  
  9. 1、40%的设计模式相关知识。设计模式是系统内核限定的,做别人的下属就得按照别人的规矩办事。  
  10. 2、30%的内核工作原理相关知识。内核是你领导,领会领导意图才能把事情办好。  
  11. 3、30%的硬件相关知识。控制好硬件是你的的本质工作,你得把你的小弟管理好.  
  12. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                《常识》
¥应用程序----->系统内核----->设备驱动----->硬件设备
¥设备驱动既是系统内核的下属,又是硬件设备的老大。  
¥在inux系统中用一个文件来代表一个设备。这个文件就叫设备文件。设备驱动的责任是将应用程序对设备文件
的打开、读、写、定位等操作转化为对硬件设备的打开、读、写、定位等操作。而对于任何硬件设备,应用程序
只需利用这些基本操作就可以完全控制它!
¥编写linux设备驱动需要的知识结构:
1、40%的设计模式相关知识。设计模式是系统内核限定的,做别人的下属就得按照别人的规矩办事。
2、30%的内核工作原理相关知识。内核是你领导,领会领导意图才能把事情办好。
3、30%的硬件相关知识。控制好硬件是你的的本质工作,你得把你的小弟管理好.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在解读OK6410官方提供的LED驱动程序源码的过程中,发现很多没见过的宏和函数。例如S3C64XX_GPM(0)、S3C64XX_GPM_OUTPUT(0)、__raw_writel(tmp,S3C64XX_GPMPUD)、__raw_writel(tmp,S3C64XX_GPMCON)等。而这些都包含在一些头文件里面。另一方面,我们自己动手编写LED的驱动程序也必须知道相关的头文件有哪些,对我们有哪些用。因此,我觉得在自己动手编写LED驱动程序之前对相关头文件进行简单的分析是非常有必要的。以下是我自己结合源码分析得出的一些结论,如有不正确的地方,希望能够得到指正。

OK6410官方提供的LED驱动程序源码:

  1. #include <linux/module.h>  
  2. #include <linux/kernel.h>  
  3. #include <linux/fs.h>  
  4. #include <linux/init.h>  
  5. #include <linux/miscdevice.h>  
  6. #include <linux/delay.h>  
  7. #include <linux/device.h>  
  8. #include <linux/cdev.h>  
  9. #include <asm/irq.h>  
  10. #include <mach/gpio.h>  
  11. #include <plat/regs-gpio.h>  
  12. #include <plat/gpio-cfg.h>  
  13. #include <mach/hardware.h>  
  14. #include <linux/io.h>  
  15.   
  16. #define DEVICE_NAME "leds"  
  17. #define LED_MAJOR 231  
  18.   
  19.   
  20. static unsigned long led_table [] = {  
  21.        S3C64XX_GPM(0),  
  22.        S3C64XX_GPM(1),  
  23.        S3C64XX_GPM(2),  
  24.        S3C64XX_GPM(3),  
  25. };  
  26.   
  27. static unsigned int led_cfg_table [] = {  
  28.     S3C64XX_GPM_OUTPUT(0),  
  29.     S3C64XX_GPM_OUTPUT(1),  
  30.     S3C64XX_GPM_OUTPUT(2),  
  31.     S3C64XX_GPM_OUTPUT(3),  
  32. };  
  33.   
  34. static int s3c6410_leds_ioctl(  
  35.     struct inode *inode,   
  36.     struct file *file,   
  37.     unsigned int cmd,   
  38.     unsigned long arg)  
  39. {  
  40.     unsigned long tmp;  
  41.     switch(cmd) {  
  42.     case 0:  
  43.     case 1:  
  44.         if (arg > 4) {  
  45.             return -EINVAL;  
  46.         }  
  47.         tmp = __raw_readl(S3C64XX_GPMDAT);  
  48.         if(cmd)  
  49.             tmp &= (~(1<<arg));  
  50.         else  
  51.             tmp |= (1<<arg);  
  52.         __raw_writel(tmp,S3C64XX_GPMDAT);  
  53. //      gpio_set_value(led_table[arg], !cmd);  
  54.         return 0;  
  55.     default:  
  56.         return -EINVAL;  
  57.     }  
  58. }  
  59.   
  60.   
  61. static struct file_operations s3c6410_leds_fops = {  
  62.     .owner  =   THIS_MODULE,  
  63.     .ioctl  =   s3c6410_leds_ioctl,  
  64. };  
  65.   
  66. static struct cdev cdev_leds;  
  67. struct class * my_class;  
  68.   
  69. static int __init s3c6410_leds_init(void)  
  70. {  
  71.     int ret;  
  72.     unsigned long tmp;  
  73.     int i;  
  74.     dev_t devno;  
  75.     printk(KERN_NOTICE "enter s3c6410_leds_init\n");  
  76.   
  77.   
  78.     devno = MKDEV(LED_MAJOR,0);  
  79.   
  80.     ret = register_chrdev_region(devno,1,DEVICE_NAME);  
  81.     ret = 0;  
  82.     if(ret<0)  
  83.     {  
  84.         printk(KERN_NOTICE "can not register led device");  
  85.         return ret;  
  86.     }  
  87.       
  88.     cdev_init(&cdev_leds,&s3c6410_leds_fops);  
  89.     cdev_leds.owner = THIS_MODULE;  
  90.   
  91.     ret =cdev_add(&cdev_leds,devno,1);  
  92.     if(ret)  
  93.     {  
  94.         printk(KERN_NOTICE "can not add leds device");  
  95.         return ret;  
  96.     }  
  97.   
  98.     my_class = class_create(THIS_MODULE,"my_class");  
  99.     if(IS_ERR(my_class))  
  100.     {  
  101.         printk("Err: Failed in creating class\n");  
  102.         return -1;    
  103.     }  
  104.   
  105.     device_create(my_class,NULL,MKDEV(LED_MAJOR,0),NULL,DEVICE_NAME);  
  106.   
  107.     //gpm0-3 pull up  
  108.     tmp = __raw_readl(S3C64XX_GPMPUD);  
  109.     tmp &= (~0xFF);  
  110.     tmp |= 0xaa;  
  111.     __raw_writel(tmp,S3C64XX_GPMPUD);  
  112.   
  113.     //gpm0-3 output mode  
  114.     tmp = __raw_readl(S3C64XX_GPMCON);  
  115.     tmp &= (~0xFFFF);  
  116.     tmp |= 0x1111;  
  117.     __raw_writel(tmp,S3C64XX_GPMCON);  
  118.       
  119.     //gpm0-3 output 0  
  120.     tmp = __raw_readl(S3C64XX_GPMDAT);  
  121.     tmp |= 0x10;  
  122.     __raw_writel(tmp,S3C64XX_GPMDAT);  
  123.   
  124.     //printk("S3C64XX_GPMCON is %x\n",__raw_readl(S3C64XX_GPMCON));  
  125.     //printk("S3C64XX_GPMDAT is %x\n",__raw_readl(S3C64XX_GPMDAT));  
  126.     //printk("S3C64XX_GPMPUD is %x\n",__raw_readl(S3C64XX_GPMPUD));  
  127.   
  128.     printk(DEVICE_NAME " initialized\n");  
  129.   
  130.     return 0;  
  131. }  
  132.   
  133. static void __exit s3c6410_leds_exit(void)  
  134. {  
  135.     cdev_del(&cdev_leds);  
  136.   
  137.     unregister_chrdev_region(MKDEV(LED_MAJOR,0),1);  
  138.   
  139.     printk(KERN_NOTICE "s3c2440_leds_exit\n");  
  140. }  
  141.   
  142.   
  143. module_init(s3c6410_leds_init);  
  144. module_exit(s3c6410_leds_exit);  
  145.   
  146. MODULE_LICENSE("GPL");  
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <asm/irq.h>
#include <mach/gpio.h>
#include <plat/regs-gpio.h>
#include <plat/gpio-cfg.h>
#include <mach/hardware.h>
#include <linux/io.h>

#define DEVICE_NAME	"leds"
#define LED_MAJOR 231


static unsigned long led_table [] = {
       S3C64XX_GPM(0),
       S3C64XX_GPM(1),
       S3C64XX_GPM(2),
       S3C64XX_GPM(3),
};

static unsigned int led_cfg_table [] = {
	S3C64XX_GPM_OUTPUT(0),
	S3C64XX_GPM_OUTPUT(1),
	S3C64XX_GPM_OUTPUT(2),
	S3C64XX_GPM_OUTPUT(3),
};

static int s3c6410_leds_ioctl(
	struct inode *inode, 
	struct file *file, 
	unsigned int cmd, 
	unsigned long arg)
{
	unsigned long tmp;
	switch(cmd) {
	case 0:
	case 1:
		if (arg > 4) {
			return -EINVAL;
		}
		tmp = __raw_readl(S3C64XX_GPMDAT);
		if(cmd)
			tmp &= (~(1<<arg));
		else
			tmp |= (1<<arg);
		__raw_writel(tmp,S3C64XX_GPMDAT);
//		gpio_set_value(led_table[arg], !cmd);
		return 0;
	default:
		return -EINVAL;
	}
}


static struct file_operations s3c6410_leds_fops = {
	.owner	=	THIS_MODULE,
	.ioctl	=	s3c6410_leds_ioctl,
};

static struct cdev cdev_leds;
struct class * my_class;

static int __init s3c6410_leds_init(void)
{
	int ret;
	unsigned long tmp;
	int i;
	dev_t devno;
	printk(KERN_NOTICE "enter s3c6410_leds_init\n");


	devno = MKDEV(LED_MAJOR,0);

	ret = register_chrdev_region(devno,1,DEVICE_NAME);
	ret = 0;
	if(ret<0)
	{
		printk(KERN_NOTICE "can not register led device");
		return ret;
	}
	
	cdev_init(&cdev_leds,&s3c6410_leds_fops);
	cdev_leds.owner = THIS_MODULE;

	ret =cdev_add(&cdev_leds,devno,1);
	if(ret)
	{
		printk(KERN_NOTICE "can not add leds device");
		return ret;
	}

	my_class = class_create(THIS_MODULE,"my_class");
	if(IS_ERR(my_class))
	{
		printk("Err: Failed in creating class\n");
		return -1;	
	}

	device_create(my_class,NULL,MKDEV(LED_MAJOR,0),NULL,DEVICE_NAME);

	//gpm0-3 pull up
	tmp = __raw_readl(S3C64XX_GPMPUD);
	tmp &= (~0xFF);
	tmp |= 0xaa;
	__raw_writel(tmp,S3C64XX_GPMPUD);

	//gpm0-3 output mode
	tmp = __raw_readl(S3C64XX_GPMCON);
	tmp &= (~0xFFFF);
	tmp |= 0x1111;
	__raw_writel(tmp,S3C64XX_GPMCON);
	
	//gpm0-3 output 0
	tmp = __raw_readl(S3C64XX_GPMDAT);
	tmp |= 0x10;
	__raw_writel(tmp,S3C64XX_GPMDAT);

	//printk("S3C64XX_GPMCON is %x\n",__raw_readl(S3C64XX_GPMCON));
	//printk("S3C64XX_GPMDAT is %x\n",__raw_readl(S3C64XX_GPMDAT));
	//printk("S3C64XX_GPMPUD is %x\n",__raw_readl(S3C64XX_GPMPUD));

	printk(DEVICE_NAME " initialized\n");

	return 0;
}

static void __exit s3c6410_leds_exit(void)
{
	cdev_del(&cdev_leds);

	unregister_chrdev_region(MKDEV(LED_MAJOR,0),1);

	printk(KERN_NOTICE "s3c2440_leds_exit\n");
}


module_init(s3c6410_leds_init);
module_exit(s3c6410_leds_exit);

MODULE_LICENSE("GPL");



 一、模块相关头文件:

1、#include <Linux/module.h>:在编写任何模块都需要包含此头文件。该头文件自动包含了 <linux/version.h>头文件,该头文件包含了宏MODULE_LICENSE("GPL")的定义。
2、#include <linux/init.h>:此头文件也是必须的,module_init()与module_exit()宏就是定义在它里面的。而且正是这个头文件定义了初始化函数加__init和推出函数加__exit的作用(static int __init s3c6410_leds_init(void)和static void __exit s3c6410_leds_exit(void))
3、#include <linux/kernel.h>:此头文件也是常用头文件,如果需要使用printk函数,则必须包含此头文件。另外该头文件还包含了<types.h>头文件,而这个头文件定义许多常用的数据类型,其中就包括设备号类型dev_t。如下:

  1. #ifndef _LINUX_TYPES_H  
  2. #define _LINUX_TYPES_H  
  3.   
  4. #ifdef  __KERNEL__  
  5.   
  6. #define DECLARE_BITMAP(name,bits) \  
  7.     unsigned long name[BITS_TO_LONGS(bits)]  
  8.   
  9. #endif  
  10.   
  11. #include <linux/posix_types.h>  
  12. #include <asm/types.h>  
  13.   
  14. #ifndef __KERNEL_STRICT_NAMES  
  15.   
  16. typedef __u32 __kernel_dev_t;  
  17.   
  18. typedef __kernel_fd_set     fd_set;  
  19. typedef __kernel_dev_t      dev_t;  
  20. typedef __kernel_ino_t      ino_t;  
  21. typedef __kernel_mode_t     mode_t;  
  22. typedef __kernel_nlink_t    nlink_t;  
  23. typedef __kernel_off_t      off_t;  
  24. typedef __kernel_pid_t      pid_t;  
  25. typedef __kernel_daddr_t    daddr_t;  
  26. typedef __kernel_key_t      key_t;  
  27. typedef __kernel_suseconds_t    suseconds_t;  
  28. typedef __kernel_timer_t    timer_t;  
  29. typedef __kernel_clockid_t  clockid_t;  
  30. typedef __kernel_mqd_t      mqd_t;  
  31.   
  32. #ifdef __KERNEL__  
  33. typedef _Bool           bool;  
  34.   
  35. typedef __kernel_uid32_t    uid_t;  
  36. typedef __kernel_gid32_t    gid_t;  
  37. typedef __kernel_uid16_t        uid16_t;  
  38. typedef __kernel_gid16_t        gid16_t;  
  39.   
  40. typedef unsigned long       uintptr_t;  
  41.   
  42. #ifdef CONFIG_UID16  
  43. /* This is defined by include/asm-{arch}/posix_types.h */  
  44. typedef __kernel_old_uid_t  old_uid_t;  
  45. typedef __kernel_old_gid_t  old_gid_t;  
  46. #endif /* CONFIG_UID16 */  
  47.   
  48. /* libc5 includes this file to define uid_t, thus uid_t can never change 
  49.  * when it is included by non-kernel code 
  50.  */  
  51. #else  
  52. typedef __kernel_uid_t      uid_t;  
  53. typedef __kernel_gid_t      gid_t;  
  54. #endif /* __KERNEL__ */  
  55.   
  56. #if defined(__GNUC__)  
  57. typedef __kernel_loff_t     loff_t;  
  58. #endif  
  59.   
  60. /* 
  61.  * The following typedefs are also protected by individual ifdefs for 
  62.  * historical reasons: 
  63.  */  
  64. #ifndef _SIZE_T  
  65. #define _SIZE_T  
  66. typedef __kernel_size_t     size_t;  
  67. #endif  
  68.   
  69. #ifndef _SSIZE_T  
  70. #define _SSIZE_T  
  71. typedef __kernel_ssize_t    ssize_t;  
  72. #endif  
  73.   
  74. #ifndef _PTRDIFF_T  
  75. #define _PTRDIFF_T  
  76. typedef __kernel_ptrdiff_t  ptrdiff_t;  
  77. #endif  
  78.   
  79. #ifndef _TIME_T  
  80. #define _TIME_T  
  81. typedef __kernel_time_t     time_t;  
  82. #endif  
  83.   
  84. #ifndef _CLOCK_T  
  85. #define _CLOCK_T  
  86. typedef __kernel_clock_t    clock_t;  
  87. #endif  
  88.   
  89. #ifndef _CADDR_T  
  90. #define _CADDR_T  
  91. typedef __kernel_caddr_t    caddr_t;  
  92. #endif  
  93.   
  94. /* bsd */  
  95. typedef unsigned char       u_char;  
  96. typedef unsigned short      u_short;  
  97. typedef unsigned int        u_int;  
  98. typedef unsigned long       u_long;  
  99.   
  100. /* sysv */  
  101. typedef unsigned char       unchar;  
  102. typedef unsigned short      ushort;  
  103. typedef unsigned int        uint;  
  104. typedef unsigned long       ulong;  
  105.   
  106. #ifndef __BIT_TYPES_DEFINED__  
  107. #define __BIT_TYPES_DEFINED__  
  108.   
  109. typedef     __u8        u_int8_t;  
  110. typedef     __s8        int8_t;  
  111. typedef     __u16       u_int16_t;  
  112. typedef     __s16       int16_t;  
  113. typedef     __u32       u_int32_t;  
  114. typedef     __s32       int32_t;  
  115.   
  116. #endif /* !(__BIT_TYPES_DEFINED__) */  
  117.   
  118. typedef     __u8        uint8_t;  
  119. typedef     __u16       uint16_t;  
  120. typedef     __u32       uint32_t;  
  121.   
  122. #if defined(__GNUC__)  
  123. typedef     __u64       uint64_t;  
  124. typedef     __u64       u_int64_t;  
  125. typedef     __s64       int64_t;  
  126. #endif  
  127.   
  128. /* this is a special 64bit data type that is 8-byte aligned */  
  129. #define aligned_u64 __u64 __attribute__((aligned(8)))  
  130. #define aligned_be64 __be64 __attribute__((aligned(8)))  
  131. #define aligned_le64 __le64 __attribute__((aligned(8)))  
  132.   
  133. /** 
  134.  * The type used for indexing onto a disc or disc partition. 
  135.  * 
  136.  * Linux always considers sectors to be 512 bytes long independently 
  137.  * of the devices real block size. 
  138.  */  
  139. #ifdef CONFIG_LBD  
  140. typedef u64 sector_t;  
  141. #else  
  142. typedef unsigned long sector_t;  
  143. #endif  
  144.   
  145. /* 
  146.  * The type of the inode's block count. 
  147.  */  
  148. #ifdef CONFIG_LSF  
  149. typedef u64 blkcnt_t;  
  150. #else  
  151. typedef unsigned long blkcnt_t;  
  152. #endif  
  153.   
  154. /* 
  155.  * The type of an index into the pagecache.  Use a #define so asm/types.h 
  156.  * can override it. 
  157.  */  
  158. #ifndef pgoff_t  
  159. #define pgoff_t unsigned long  
  160. #endif  
  161.   
  162. #endif /* __KERNEL_STRICT_NAMES */  
  163.   
  164. /* 
  165.  * Below are truly Linux-specific types that should never collide with 
  166.  * any application/library that wants linux/types.h. 
  167.  */  
  168.   
  169. #ifdef __CHECKER__  
  170. #define __bitwise__ __attribute__((bitwise))  
  171. #else  
  172. #define __bitwise__  
  173. #endif  
  174. #ifdef __CHECK_ENDIAN__  
  175. #define __bitwise __bitwise__  
  176. #else  
  177. #define __bitwise  
  178. #endif  
  179.   
  180. typedef __u16 __bitwise __le16;  
  181. typedef __u16 __bitwise __be16;  
  182. typedef __u32 __bitwise __le32;  
  183. typedef __u32 __bitwise __be32;  
  184. #if defined(__GNUC__)  
  185. typedef __u64 __bitwise __le64;  
  186. typedef __u64 __bitwise __be64;  
  187. #endif  
  188. typedef __u16 __bitwise __sum16;  
  189. typedef __u32 __bitwise __wsum;  
  190.   
  191. #ifdef __KERNEL__  
  192. typedef unsigned __bitwise__ gfp_t;  
  193. typedef unsigned __bitwise__ fmode_t;  
  194.   
  195. #ifdef CONFIG_PHYS_ADDR_T_64BIT  
  196. typedef u64 phys_addr_t;  
  197. #else  
  198. typedef u32 phys_addr_t;  
  199. #endif  
  200.   
  201. typedef phys_addr_t resource_size_t;  
  202.   
  203. struct ustat {  
  204.     __kernel_daddr_t    f_tfree;  
  205.     __kernel_ino_t      f_tinode;  
  206.     char            f_fname[6];  
  207.     char            f_fpack[6];  
  208. };  
  209.   
  210. #endif  /* __KERNEL__ */  
  211.   
  212. #endif /* _LINUX_TYPES_H */  
#ifndef _LINUX_TYPES_H
#define _LINUX_TYPES_H

#ifdef	__KERNEL__

#define DECLARE_BITMAP(name,bits) \
	unsigned long name[BITS_TO_LONGS(bits)]

#endif

#include <linux/posix_types.h>
#include <asm/types.h>

#ifndef __KERNEL_STRICT_NAMES

typedef __u32 __kernel_dev_t;

typedef __kernel_fd_set		fd_set;
typedef __kernel_dev_t		dev_t;
typedef __kernel_ino_t		ino_t;
typedef __kernel_mode_t		mode_t;
typedef __kernel_nlink_t	nlink_t;
typedef __kernel_off_t		off_t;
typedef __kernel_pid_t		pid_t;
typedef __kernel_daddr_t	daddr_t;
typedef __kernel_key_t		key_t;
typedef __kernel_suseconds_t	suseconds_t;
typedef __kernel_timer_t	timer_t;
typedef __kernel_clockid_t	clockid_t;
typedef __kernel_mqd_t		mqd_t;

#ifdef __KERNEL__
typedef _Bool			bool;

typedef __kernel_uid32_t	uid_t;
typedef __kernel_gid32_t	gid_t;
typedef __kernel_uid16_t        uid16_t;
typedef __kernel_gid16_t        gid16_t;

typedef unsigned long		uintptr_t;

#ifdef CONFIG_UID16
/* This is defined by include/asm-{arch}/posix_types.h */
typedef __kernel_old_uid_t	old_uid_t;
typedef __kernel_old_gid_t	old_gid_t;
#endif /* CONFIG_UID16 */

/* libc5 includes this file to define uid_t, thus uid_t can never change
 * when it is included by non-kernel code
 */
#else
typedef __kernel_uid_t		uid_t;
typedef __kernel_gid_t		gid_t;
#endif /* __KERNEL__ */

#if defined(__GNUC__)
typedef __kernel_loff_t		loff_t;
#endif

/*
 * The following typedefs are also protected by individual ifdefs for
 * historical reasons:
 */
#ifndef _SIZE_T
#define _SIZE_T
typedef __kernel_size_t		size_t;
#endif

#ifndef _SSIZE_T
#define _SSIZE_T
typedef __kernel_ssize_t	ssize_t;
#endif

#ifndef _PTRDIFF_T
#define _PTRDIFF_T
typedef __kernel_ptrdiff_t	ptrdiff_t;
#endif

#ifndef _TIME_T
#define _TIME_T
typedef __kernel_time_t		time_t;
#endif

#ifndef _CLOCK_T
#define _CLOCK_T
typedef __kernel_clock_t	clock_t;
#endif

#ifndef _CADDR_T
#define _CADDR_T
typedef __kernel_caddr_t	caddr_t;
#endif

/* bsd */
typedef unsigned char		u_char;
typedef unsigned short		u_short;
typedef unsigned int		u_int;
typedef unsigned long		u_long;

/* sysv */
typedef unsigned char		unchar;
typedef unsigned short		ushort;
typedef unsigned int		uint;
typedef unsigned long		ulong;

#ifndef __BIT_TYPES_DEFINED__
#define __BIT_TYPES_DEFINED__

typedef		__u8		u_int8_t;
typedef		__s8		int8_t;
typedef		__u16		u_int16_t;
typedef		__s16		int16_t;
typedef		__u32		u_int32_t;
typedef		__s32		int32_t;

#endif /* !(__BIT_TYPES_DEFINED__) */

typedef		__u8		uint8_t;
typedef		__u16		uint16_t;
typedef		__u32		uint32_t;

#if defined(__GNUC__)
typedef		__u64		uint64_t;
typedef		__u64		u_int64_t;
typedef		__s64		int64_t;
#endif

/* this is a special 64bit data type that is 8-byte aligned */
#define aligned_u64 __u64 __attribute__((aligned(8)))
#define aligned_be64 __be64 __attribute__((aligned(8)))
#define aligned_le64 __le64 __attribute__((aligned(8)))

/**
 * The type used for indexing onto a disc or disc partition.
 *
 * Linux always considers sectors to be 512 bytes long independently
 * of the devices real block size.
 */
#ifdef CONFIG_LBD
typedef u64 sector_t;
#else
typedef unsigned long sector_t;
#endif

/*
 * The type of the inode's block count.
 */
#ifdef CONFIG_LSF
typedef u64 blkcnt_t;
#else
typedef unsigned long blkcnt_t;
#endif

/*
 * The type of an index into the pagecache.  Use a #define so asm/types.h
 * can override it.
 */
#ifndef pgoff_t
#define pgoff_t unsigned long
#endif

#endif /* __KERNEL_STRICT_NAMES */

/*
 * Below are truly Linux-specific types that should never collide with
 * any application/library that wants linux/types.h.
 */

#ifdef __CHECKER__
#define __bitwise__ __attribute__((bitwise))
#else
#define __bitwise__
#endif
#ifdef __CHECK_ENDIAN__
#define __bitwise __bitwise__
#else
#define __bitwise
#endif

typedef __u16 __bitwise __le16;
typedef __u16 __bitwise __be16;
typedef __u32 __bitwise __le32;
typedef __u32 __bitwise __be32;
#if defined(__GNUC__)
typedef __u64 __bitwise __le64;
typedef __u64 __bitwise __be64;
#endif
typedef __u16 __bitwise __sum16;
typedef __u32 __bitwise __wsum;

#ifdef __KERNEL__
typedef unsigned __bitwise__ gfp_t;
typedef unsigned __bitwise__ fmode_t;

#ifdef CONFIG_PHYS_ADDR_T_64BIT
typedef u64 phys_addr_t;
#else
typedef u32 phys_addr_t;
#endif

typedef phys_addr_t resource_size_t;

struct ustat {
	__kernel_daddr_t	f_tfree;
	__kernel_ino_t		f_tinode;
	char			f_fname[6];
	char			f_fpack[6];
};

#endif	/* __KERNEL__ */

#endif /* _LINUX_TYPES_H */




二、字符设备驱动相关头文件:
1、#include <linux/fs.h>:该头文件包含了常用的数据结构,当然也包括三种最重要的:struct file、struct file_operation、struct inode。另外该头文件还包含了<linux/ioctl.h>头文件。
2、#include <linux/cdev.h>:该头文件定义了struct cdev数据结构,也包含了字符设备操作的相关函数:

  1. #ifndef _LINUX_CDEV_H  
  2. #define _LINUX_CDEV_H  
  3.   
  4. #include <linux/kobject.h>  
  5. #include <linux/kdev_t.h>  
  6. #include <linux/list.h>  
  7.   
  8. struct file_operations;  
  9. struct inode;  
  10. struct module;  
  11.   
  12. struct cdev {  
  13.     struct kobject kobj;  
  14.     struct module *owner;  
  15.     const struct file_operations *ops;  
  16.     struct list_head list;  
  17.     dev_t dev;  
  18.     unsigned int count;  
  19. };  
  20.   
  21. void cdev_init(struct cdev *, const struct file_operations *);  
  22.   
  23. struct cdev *cdev_alloc(void);  
  24.   
  25. void cdev_put(struct cdev *p);  
  26.   
  27. int cdev_add(struct cdev *, dev_t, unsigned);  
  28.   
  29. void cdev_del(struct cdev *);  
  30.   
  31. void cd_forget(struct inode *);  
  32.   
  33. extern struct backing_dev_info directly_mappable_cdev_bdi;  
  34.   
  35. #endif  
#ifndef _LINUX_CDEV_H
#define _LINUX_CDEV_H

#include <linux/kobject.h>
#include <linux/kdev_t.h>
#include <linux/list.h>

struct file_operations;
struct inode;
struct module;

struct cdev {
	struct kobject kobj;
	struct module *owner;
	const struct file_operations *ops;
	struct list_head list;
	dev_t dev;
	unsigned int count;
};

void cdev_init(struct cdev *, const struct file_operations *);

struct cdev *cdev_alloc(void);

void cdev_put(struct cdev *p);

int cdev_add(struct cdev *, dev_t, unsigned);

void cdev_del(struct cdev *);

void cd_forget(struct inode *);

extern struct backing_dev_info directly_mappable_cdev_bdi;

#endif


3、<linux/device.h>:包含自动创建设备文件的相关函数的申明:原函数中-class_create(THIS_MODULE,"my_class")、device_create(my_class,NULL,MKDEV(LED_MAJOR,0),NULL,DEVICE_NAME)。


三、s3c64xx  GPIO操作相关头文件:
1、#include <mach/gpio.h>:此头文件包含了对S3C64xx 各个GPIO的宏定义,并包含了各个端口的读写函数,如下:

  1. /* linux/arch/arm/mach-s3c6400/include/mach/gpio.h 
  2.  * 
  3.  * Copyright 2008 Openmoko, Inc. 
  4.  * Copyright 2008 Simtec Electronics 
  5.  *  http://armlinux.simtec.co.uk/ 
  6.  *  Ben Dooks <ben@simtec.co.uk> 
  7.  * 
  8.  * S3C6400 - GPIO lib support 
  9.  * 
  10.  * This program is free software; you can redistribute it and/or modify 
  11.  * it under the terms of the GNU General Public License version 2 as 
  12.  * published by the Free Software Foundation. 
  13. */  
  14.   
  15. #define gpio_get_value  __gpio_get_value  
  16. #define gpio_set_value  __gpio_set_value  
  17. #define gpio_cansleep   __gpio_cansleep  
  18. #define gpio_to_irq __gpio_to_irq  
  19.   
  20. /* GPIO bank sizes */  
  21. #define S3C64XX_GPIO_A_NR   (8)  
  22. #define S3C64XX_GPIO_B_NR   (7)  
  23. #define S3C64XX_GPIO_C_NR   (8)  
  24. #define S3C64XX_GPIO_D_NR   (5)  
  25. #define S3C64XX_GPIO_E_NR   (5)  
  26. #define S3C64XX_GPIO_F_NR   (16)  
  27. #define S3C64XX_GPIO_G_NR   (7)  
  28. #define S3C64XX_GPIO_H_NR   (10)  
  29. #define S3C64XX_GPIO_I_NR   (16)  
  30. #define S3C64XX_GPIO_J_NR   (12)  
  31. #define S3C64XX_GPIO_K_NR   (16)  
  32. #define S3C64XX_GPIO_L_NR   (15)  
  33. #define S3C64XX_GPIO_M_NR   (6)  
  34. #define S3C64XX_GPIO_N_NR   (16)  
  35. #define S3C64XX_GPIO_O_NR   (16)  
  36. #define S3C64XX_GPIO_P_NR   (15)  
  37. #define S3C64XX_GPIO_Q_NR   (9)  
  38.   
  39. /* GPIO bank numbes */  
  40.   
  41. /* CONFIG_S3C_GPIO_SPACE allows the user to select extra 
  42.  * space for debugging purposes so that any accidental 
  43.  * change from one gpio bank to another can be caught. 
  44. */  
  45.   
  46. #define S3C64XX_GPIO_NEXT(__gpio) \  
  47.     ((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1)  
  48.   
  49. enum s3c_gpio_number {  
  50.     S3C64XX_GPIO_A_START = 0,  
  51.     S3C64XX_GPIO_B_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_A),  
  52.     S3C64XX_GPIO_C_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_B),  
  53.     S3C64XX_GPIO_D_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_C),  
  54.     S3C64XX_GPIO_E_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_D),  
  55.     S3C64XX_GPIO_F_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_E),  
  56.     S3C64XX_GPIO_G_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_F),  
  57.     S3C64XX_GPIO_H_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_G),  
  58.     S3C64XX_GPIO_I_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_H),  
  59.     S3C64XX_GPIO_J_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_I),  
  60.     S3C64XX_GPIO_K_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_J),  
  61.     S3C64XX_GPIO_L_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_K),  
  62.     S3C64XX_GPIO_M_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_L),  
  63.     S3C64XX_GPIO_N_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_M),  
  64.     S3C64XX_GPIO_O_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_N),  
  65.     S3C64XX_GPIO_P_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_O),  
  66.     S3C64XX_GPIO_Q_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_P),  
  67. };  
  68.   
  69. /* S3C64XX GPIO number definitions. */  
  70.   
  71. #define S3C64XX_GPA(_nr)    (S3C64XX_GPIO_A_START + (_nr))  
  72. #define S3C64XX_GPB(_nr)    (S3C64XX_GPIO_B_START + (_nr))  
  73. #define S3C64XX_GPC(_nr)    (S3C64XX_GPIO_C_START + (_nr))  
  74. #define S3C64XX_GPD(_nr)    (S3C64XX_GPIO_D_START + (_nr))  
  75. #define S3C64XX_GPE(_nr)    (S3C64XX_GPIO_E_START + (_nr))  
  76. #define S3C64XX_GPF(_nr)    (S3C64XX_GPIO_F_START + (_nr))  
  77. #define S3C64XX_GPG(_nr)    (S3C64XX_GPIO_G_START + (_nr))  
  78. #define S3C64XX_GPH(_nr)    (S3C64XX_GPIO_H_START + (_nr))  
  79. #define S3C64XX_GPI(_nr)    (S3C64XX_GPIO_I_START + (_nr))  
  80. #define S3C64XX_GPJ(_nr)    (S3C64XX_GPIO_J_START + (_nr))  
  81. #define S3C64XX_GPK(_nr)    (S3C64XX_GPIO_K_START + (_nr))  
  82. #define S3C64XX_GPL(_nr)    (S3C64XX_GPIO_L_START + (_nr))  
  83. #define S3C64XX_GPM(_nr)    (S3C64XX_GPIO_M_START + (_nr))  
  84. #define S3C64XX_GPN(_nr)    (S3C64XX_GPIO_N_START + (_nr))  
  85. #define S3C64XX_GPO(_nr)    (S3C64XX_GPIO_O_START + (_nr))  
  86. #define S3C64XX_GPP(_nr)    (S3C64XX_GPIO_P_START + (_nr))  
  87. #define S3C64XX_GPQ(_nr)    (S3C64XX_GPIO_Q_START + (_nr))  
  88.   
  89. /* the end of the S3C64XX specific gpios */  
  90. #define S3C64XX_GPIO_END    (S3C64XX_GPQ(S3C64XX_GPIO_Q_NR) + 1)  
  91. #define S3C_GPIO_END        S3C64XX_GPIO_END  
  92.   
  93. /* define the number of gpios we need to the one after the GPQ() range */  
  94. #define ARCH_NR_GPIOS   (S3C64XX_GPQ(S3C64XX_GPIO_Q_NR) + 1)  
  95.   
  96. #include <asm-generic/gpio.h>  
/* linux/arch/arm/mach-s3c6400/include/mach/gpio.h
 *
 * Copyright 2008 Openmoko, Inc.
 * Copyright 2008 Simtec Electronics
 *	http://armlinux.simtec.co.uk/
 *	Ben Dooks <ben@simtec.co.uk>
 *
 * S3C6400 - GPIO lib support
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/

#define gpio_get_value	__gpio_get_value
#define gpio_set_value	__gpio_set_value
#define gpio_cansleep	__gpio_cansleep
#define gpio_to_irq	__gpio_to_irq

/* GPIO bank sizes */
#define S3C64XX_GPIO_A_NR	(8)
#define S3C64XX_GPIO_B_NR	(7)
#define S3C64XX_GPIO_C_NR	(8)
#define S3C64XX_GPIO_D_NR	(5)
#define S3C64XX_GPIO_E_NR	(5)
#define S3C64XX_GPIO_F_NR	(16)
#define S3C64XX_GPIO_G_NR	(7)
#define S3C64XX_GPIO_H_NR	(10)
#define S3C64XX_GPIO_I_NR	(16)
#define S3C64XX_GPIO_J_NR	(12)
#define S3C64XX_GPIO_K_NR	(16)
#define S3C64XX_GPIO_L_NR	(15)
#define S3C64XX_GPIO_M_NR	(6)
#define S3C64XX_GPIO_N_NR	(16)
#define S3C64XX_GPIO_O_NR	(16)
#define S3C64XX_GPIO_P_NR	(15)
#define S3C64XX_GPIO_Q_NR	(9)

/* GPIO bank numbes */

/* CONFIG_S3C_GPIO_SPACE allows the user to select extra
 * space for debugging purposes so that any accidental
 * change from one gpio bank to another can be caught.
*/

#define S3C64XX_GPIO_NEXT(__gpio) \
	((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1)

enum s3c_gpio_number {
	S3C64XX_GPIO_A_START = 0,
	S3C64XX_GPIO_B_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_A),
	S3C64XX_GPIO_C_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_B),
	S3C64XX_GPIO_D_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_C),
	S3C64XX_GPIO_E_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_D),
	S3C64XX_GPIO_F_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_E),
	S3C64XX_GPIO_G_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_F),
	S3C64XX_GPIO_H_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_G),
	S3C64XX_GPIO_I_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_H),
	S3C64XX_GPIO_J_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_I),
	S3C64XX_GPIO_K_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_J),
	S3C64XX_GPIO_L_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_K),
	S3C64XX_GPIO_M_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_L),
	S3C64XX_GPIO_N_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_M),
	S3C64XX_GPIO_O_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_N),
	S3C64XX_GPIO_P_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_O),
	S3C64XX_GPIO_Q_START = S3C64XX_GPIO_NEXT(S3C64XX_GPIO_P),
};

/* S3C64XX GPIO number definitions. */

#define S3C64XX_GPA(_nr)	(S3C64XX_GPIO_A_START + (_nr))
#define S3C64XX_GPB(_nr)	(S3C64XX_GPIO_B_START + (_nr))
#define S3C64XX_GPC(_nr)	(S3C64XX_GPIO_C_START + (_nr))
#define S3C64XX_GPD(_nr)	(S3C64XX_GPIO_D_START + (_nr))
#define S3C64XX_GPE(_nr)	(S3C64XX_GPIO_E_START + (_nr))
#define S3C64XX_GPF(_nr)	(S3C64XX_GPIO_F_START + (_nr))
#define S3C64XX_GPG(_nr)	(S3C64XX_GPIO_G_START + (_nr))
#define S3C64XX_GPH(_nr)	(S3C64XX_GPIO_H_START + (_nr))
#define S3C64XX_GPI(_nr)	(S3C64XX_GPIO_I_START + (_nr))
#define S3C64XX_GPJ(_nr)	(S3C64XX_GPIO_J_START + (_nr))
#define S3C64XX_GPK(_nr)	(S3C64XX_GPIO_K_START + (_nr))
#define S3C64XX_GPL(_nr)	(S3C64XX_GPIO_L_START + (_nr))
#define S3C64XX_GPM(_nr)	(S3C64XX_GPIO_M_START + (_nr))
#define S3C64XX_GPN(_nr)	(S3C64XX_GPIO_N_START + (_nr))
#define S3C64XX_GPO(_nr)	(S3C64XX_GPIO_O_START + (_nr))
#define S3C64XX_GPP(_nr)	(S3C64XX_GPIO_P_START + (_nr))
#define S3C64XX_GPQ(_nr)	(S3C64XX_GPIO_Q_START + (_nr))

/* the end of the S3C64XX specific gpios */
#define S3C64XX_GPIO_END	(S3C64XX_GPQ(S3C64XX_GPIO_Q_NR) + 1)
#define S3C_GPIO_END		S3C64XX_GPIO_END

/* define the number of gpios we need to the one after the GPQ() range */
#define ARCH_NR_GPIOS	(S3C64XX_GPQ(S3C64XX_GPIO_Q_NR) + 1)

#include <asm-generic/gpio.h>

上面的头文件包含了<asm-generic/gpio.h>头文件,该头文件包含了GPIO的数据读写函数,如下:

  1. #ifndef _ASM_GENERIC_GPIO_H  
  2. #define _ASM_GENERIC_GPIO_H  
  3.   
  4. #include <linux/types.h>  
  5. #include <linux/errno.h>  
  6.   
  7. #ifdef CONFIG_GPIOLIB  
  8.   
  9. #include <linux/compiler.h>  
  10.   
  11. /* Platforms may implement their GPIO interface with library code, 
  12.  * at a small performance cost for non-inlined operations and some 
  13.  * extra memory (for code and for per-GPIO table entries). 
  14.  * 
  15.  * While the GPIO programming interface defines valid GPIO numbers 
  16.  * to be in the range 0..MAX_INT, this library restricts them to the 
  17.  * smaller range 0..ARCH_NR_GPIOS-1. 
  18.  */  
  19.   
  20. #ifndef ARCH_NR_GPIOS  
  21. #define ARCH_NR_GPIOS       256  
  22. #endif  
  23.   
  24. static inline int gpio_is_valid(int number)  
  25. {  
  26.     /* only some non-negative numbers are valid */  
  27.     return ((unsigned)number) < ARCH_NR_GPIOS;  
  28. }  
  29.   
  30. struct seq_file;  
  31. struct module;  
  32.   
  33. /** 
  34.  * struct gpio_chip - abstract a GPIO controller 
  35.  * @label: for diagnostics 
  36.  * @dev: optional device providing the GPIOs 
  37.  * @owner: helps prevent removal of modules exporting active GPIOs 
  38.  * @request: optional hook for chip-specific activation, such as 
  39.  *  enabling module power and clock; may sleep 
  40.  * @free: optional hook for chip-specific deactivation, such as 
  41.  *  disabling module power and clock; may sleep 
  42.  * @direction_input: configures signal "offset" as input, or returns error 
  43.  * @get: returns value for signal "offset"; for output signals this 
  44.  *  returns either the value actually sensed, or zero 
  45.  * @direction_output: configures signal "offset" as output, or returns error 
  46.  * @set: assigns output value for signal "offset" 
  47.  * @to_irq: optional hook supporting non-static gpio_to_irq() mappings; 
  48.  *  implementation may not sleep 
  49.  * @dbg_show: optional routine to show contents in debugfs; default code 
  50.  *  will be used when this is omitted, but custom code can show extra 
  51.  *  state (such as pullup/pulldown configuration). 
  52.  * @base: identifies the first GPIO number handled by this chip; or, if 
  53.  *  negative during registration, requests dynamic ID allocation. 
  54.  * @ngpio: the number of GPIOs handled by this controller; the last GPIO 
  55.  *  handled is (base + ngpio - 1). 
  56.  * @can_sleep: flag must be set iff get()/set() methods sleep, as they 
  57.  *  must while accessing GPIO expander chips over I2C or SPI 
  58.  * 
  59.  * A gpio_chip can help platforms abstract various sources of GPIOs so 
  60.  * they can all be accessed through a common programing interface. 
  61.  * Example sources would be SOC controllers, FPGAs, multifunction 
  62.  * chips, dedicated GPIO expanders, and so on. 
  63.  * 
  64.  * Each chip controls a number of signals, identified in method calls 
  65.  * by "offset" values in the range 0..(@ngpio - 1).  When those signals 
  66.  * are referenced through calls like gpio_get_value(gpio), the offset 
  67.  * is calculated by subtracting @base from the gpio number. 
  68.  */  
  69. struct gpio_chip {  
  70.     const char      *label;  
  71.     struct device       *dev;  
  72.     struct module       *owner;  
  73.   
  74.     int         (*request)(struct gpio_chip *chip,  
  75.                         unsigned offset);  
  76.     void            (*free)(struct gpio_chip *chip,  
  77.                         unsigned offset);  
  78.   
  79.     int         (*direction_input)(struct gpio_chip *chip,  
  80.                         unsigned offset);  
  81.     int         (*get)(struct gpio_chip *chip,  
  82.                         unsigned offset);  
  83.     int         (*direction_output)(struct gpio_chip *chip,  
  84.                         unsigned offset, int value);  
  85.     void            (*set)(struct gpio_chip *chip,  
  86.                         unsigned offset, int value);  
  87.   
  88.     int         (*to_irq)(struct gpio_chip *chip,  
  89.                         unsigned offset);  
  90.   
  91.     void            (*dbg_show)(struct seq_file *s,  
  92.                         struct gpio_chip *chip);  
  93.     int         base;  
  94.     u16         ngpio;  
  95.     unsigned        can_sleep:1;  
  96.     unsigned        exported:1;  
  97. };  
  98.   
  99. extern const char *gpiochip_is_requested(struct gpio_chip *chip,  
  100.             unsigned offset);  
  101. extern int __must_check gpiochip_reserve(int start, int ngpio);  
  102.   
  103. /* add/remove chips */  
  104. extern int gpiochip_add(struct gpio_chip *chip);  
  105. extern int __must_check gpiochip_remove(struct gpio_chip *chip);  
  106.   
  107.   
  108. /* Always use the library code for GPIO management calls, 
  109.  * or when sleeping may be involved. 
  110.  */  
  111. extern int gpio_request(unsigned gpio, const char *label);  
  112. extern void gpio_free(unsigned gpio);  
  113.   
  114. extern int gpio_direction_input(unsigned gpio);  
  115. extern int gpio_direction_output(unsigned gpio, int value);  
  116.   
  117. extern int gpio_get_value_cansleep(unsigned gpio);  
  118. extern void gpio_set_value_cansleep(unsigned gpio, int value);  
  119.   
  120.   
  121. /* A platform's <asm/gpio.h> code may want to inline the I/O calls when 
  122.  * the GPIO is constant and refers to some always-present controller, 
  123.  * giving direct access to chip registers and tight bitbanging loops. 
  124.  */  
  125. extern int __gpio_get_value(unsigned gpio);  
  126. extern void __gpio_set_value(unsigned gpio, int value);  
  127.   
  128. extern int __gpio_cansleep(unsigned gpio);  
  129.   
  130. extern int __gpio_to_irq(unsigned gpio);  
  131.   
  132. #ifdef CONFIG_GPIO_SYSFS  
  133.   
  134. /* 
  135.  * A sysfs interface can be exported by individual drivers if they want, 
  136.  * but more typically is configured entirely from userspace. 
  137.  */  
  138. extern int gpio_export(unsigned gpio, bool direction_may_change);  
  139. extern void gpio_unexport(unsigned gpio);  
  140.   
  141. #endif  /* CONFIG_GPIO_SYSFS */  
  142.   
  143. #else   /* !CONFIG_HAVE_GPIO_LIB */  
  144.   
  145. static inline int gpio_is_valid(int number)  
  146. {  
  147.     /* only non-negative numbers are valid */  
  148.     return number >= 0;  
  149. }  
  150.   
  151. /* platforms that don't directly support access to GPIOs through I2C, SPI, 
  152.  * or other blocking infrastructure can use these wrappers. 
  153.  */  
  154.   
  155. static inline int gpio_cansleep(unsigned gpio)  
  156. {  
  157.     return 0;  
  158. }  
  159.   
  160. static inline int gpio_get_value_cansleep(unsigned gpio)  
  161. {  
  162.     might_sleep();  
  163.     return gpio_get_value(gpio);  
  164. }  
  165.   
  166. static inline void gpio_set_value_cansleep(unsigned gpio, int value)  
  167. {  
  168.     might_sleep();  
  169.     gpio_set_value(gpio, value);  
  170. }  
  171.   
  172. #endif /* !CONFIG_HAVE_GPIO_LIB */  
  173.   
  174. #ifndef CONFIG_GPIO_SYSFS  
  175.   
  176. /* sysfs support is only available with gpiolib, where it's optional */  
  177.   
  178. static inline int gpio_export(unsigned gpio, bool direction_may_change)  
  179. {  
  180.     return -ENOSYS;  
  181. }  
  182.   
  183. static inline void gpio_unexport(unsigned gpio)  
  184. {  
  185. }  
  186. #endif  /* CONFIG_GPIO_SYSFS */  
  187.   
  188. #endif /* _ASM_GENERIC_GPIO_H */  
#ifndef _ASM_GENERIC_GPIO_H
#define _ASM_GENERIC_GPIO_H

#include <linux/types.h>
#include <linux/errno.h>

#ifdef CONFIG_GPIOLIB

#include <linux/compiler.h>

/* Platforms may implement their GPIO interface with library code,
 * at a small performance cost for non-inlined operations and some
 * extra memory (for code and for per-GPIO table entries).
 *
 * While the GPIO programming interface defines valid GPIO numbers
 * to be in the range 0..MAX_INT, this library restricts them to the
 * smaller range 0..ARCH_NR_GPIOS-1.
 */

#ifndef ARCH_NR_GPIOS
#define ARCH_NR_GPIOS		256
#endif

static inline int gpio_is_valid(int number)
{
	/* only some non-negative numbers are valid */
	return ((unsigned)number) < ARCH_NR_GPIOS;
}

struct seq_file;
struct module;

/**
 * struct gpio_chip - abstract a GPIO controller
 * @label: for diagnostics
 * @dev: optional device providing the GPIOs
 * @owner: helps prevent removal of modules exporting active GPIOs
 * @request: optional hook for chip-specific activation, such as
 *	enabling module power and clock; may sleep
 * @free: optional hook for chip-specific deactivation, such as
 *	disabling module power and clock; may sleep
 * @direction_input: configures signal "offset" as input, or returns error
 * @get: returns value for signal "offset"; for output signals this
 *	returns either the value actually sensed, or zero
 * @direction_output: configures signal "offset" as output, or returns error
 * @set: assigns output value for signal "offset"
 * @to_irq: optional hook supporting non-static gpio_to_irq() mappings;
 *	implementation may not sleep
 * @dbg_show: optional routine to show contents in debugfs; default code
 *	will be used when this is omitted, but custom code can show extra
 *	state (such as pullup/pulldown configuration).
 * @base: identifies the first GPIO number handled by this chip; or, if
 *	negative during registration, requests dynamic ID allocation.
 * @ngpio: the number of GPIOs handled by this controller; the last GPIO
 *	handled is (base + ngpio - 1).
 * @can_sleep: flag must be set iff get()/set() methods sleep, as they
 *	must while accessing GPIO expander chips over I2C or SPI
 *
 * A gpio_chip can help platforms abstract various sources of GPIOs so
 * they can all be accessed through a common programing interface.
 * Example sources would be SOC controllers, FPGAs, multifunction
 * chips, dedicated GPIO expanders, and so on.
 *
 * Each chip controls a number of signals, identified in method calls
 * by "offset" values in the range 0..(@ngpio - 1).  When those signals
 * are referenced through calls like gpio_get_value(gpio), the offset
 * is calculated by subtracting @base from the gpio number.
 */
struct gpio_chip {
	const char		*label;
	struct device		*dev;
	struct module		*owner;

	int			(*request)(struct gpio_chip *chip,
						unsigned offset);
	void			(*free)(struct gpio_chip *chip,
						unsigned offset);

	int			(*direction_input)(struct gpio_chip *chip,
						unsigned offset);
	int			(*get)(struct gpio_chip *chip,
						unsigned offset);
	int			(*direction_output)(struct gpio_chip *chip,
						unsigned offset, int value);
	void			(*set)(struct gpio_chip *chip,
						unsigned offset, int value);

	int			(*to_irq)(struct gpio_chip *chip,
						unsigned offset);

	void			(*dbg_show)(struct seq_file *s,
						struct gpio_chip *chip);
	int			base;
	u16			ngpio;
	unsigned		can_sleep:1;
	unsigned		exported:1;
};

extern const char *gpiochip_is_requested(struct gpio_chip *chip,
			unsigned offset);
extern int __must_check gpiochip_reserve(int start, int ngpio);

/* add/remove chips */
extern int gpiochip_add(struct gpio_chip *chip);
extern int __must_check gpiochip_remove(struct gpio_chip *chip);


/* Always use the library code for GPIO management calls,
 * or when sleeping may be involved.
 */
extern int gpio_request(unsigned gpio, const char *label);
extern void gpio_free(unsigned gpio);

extern int gpio_direction_input(unsigned gpio);
extern int gpio_direction_output(unsigned gpio, int value);

extern int gpio_get_value_cansleep(unsigned gpio);
extern void gpio_set_value_cansleep(unsigned gpio, int value);


/* A platform's <asm/gpio.h> code may want to inline the I/O calls when
 * the GPIO is constant and refers to some always-present controller,
 * giving direct access to chip registers and tight bitbanging loops.
 */
extern int __gpio_get_value(unsigned gpio);
extern void __gpio_set_value(unsigned gpio, int value);

extern int __gpio_cansleep(unsigned gpio);

extern int __gpio_to_irq(unsigned gpio);

#ifdef CONFIG_GPIO_SYSFS

/*
 * A sysfs interface can be exported by individual drivers if they want,
 * but more typically is configured entirely from userspace.
 */
extern int gpio_export(unsigned gpio, bool direction_may_change);
extern void gpio_unexport(unsigned gpio);

#endif	/* CONFIG_GPIO_SYSFS */

#else	/* !CONFIG_HAVE_GPIO_LIB */

static inline int gpio_is_valid(int number)
{
	/* only non-negative numbers are valid */
	return number >= 0;
}

/* platforms that don't directly support access to GPIOs through I2C, SPI,
 * or other blocking infrastructure can use these wrappers.
 */

static inline int gpio_cansleep(unsigned gpio)
{
	return 0;
}

static inline int gpio_get_value_cansleep(unsigned gpio)
{
	might_sleep();
	return gpio_get_value(gpio);
}

static inline void gpio_set_value_cansleep(unsigned gpio, int value)
{
	might_sleep();
	gpio_set_value(gpio, value);
}

#endif /* !CONFIG_HAVE_GPIO_LIB */

#ifndef CONFIG_GPIO_SYSFS

/* sysfs support is only available with gpiolib, where it's optional */

static inline int gpio_export(unsigned gpio, bool direction_may_change)
{
	return -ENOSYS;
}

static inline void gpio_unexport(unsigned gpio)
{
}
#endif	/* CONFIG_GPIO_SYSFS */

#endif /* _ASM_GENERIC_GPIO_H */



2、#include <plat/regs-gpio.h>:定义了GPIO相关的数据宏:

  1. /* linux/arch/arm/plat-s3c64xx/include/plat/regs-gpio.h 
  2.  * 
  3.  * Copyright 2008 Openmoko, Inc. 
  4.  * Copyright 2008 Simtec Electronics 
  5.  *      Ben Dooks <ben@simtec.co.uk> 
  6.  *      http://armlinux.simtec.co.uk/ 
  7.  * 
  8.  * S3C64XX - GPIO register definitions 
  9.  */  
  10.   
  11. #ifndef __ASM_PLAT_S3C64XX_REGS_GPIO_H  
  12. #define __ASM_PLAT_S3C64XX_REGS_GPIO_H __FILE__  
  13.   
  14. #include <plat/gpio-bank-a.h>  
  15. #include <plat/gpio-bank-b.h>  
  16. #include <plat/gpio-bank-c.h>  
  17. #include <plat/gpio-bank-d.h>  
  18. #include <plat/gpio-bank-e.h>  
  19. #include <plat/gpio-bank-f.h>  
  20. #include <plat/gpio-bank-g.h>  
  21. #include <plat/gpio-bank-h.h>  
  22. #include <plat/gpio-bank-i.h>  
  23. #include <plat/gpio-bank-j.h>  
  24. #include <plat/gpio-bank-k.h>  
  25. #include <plat/gpio-bank-l.h>  
  26. #include <plat/gpio-bank-n.h>  
  27. #include #include <plat/gpio-bank-q.h>  
  28. #include <plat/gpio-bank-o.h>  
  29. #include <plat/gpio-bank-p.h>  
  30. #include <plat/gpio-bank-q.h>  
  31. #include <mach/map.h>  
  32.   
  33. /* Base addresses for each of the banks */  
  34.   
  35. #define S3C64XX_GPA_BASE    (S3C64XX_VA_GPIO + 0x0000)  
  36. #define S3C64XX_GPB_BASE    (S3C64XX_VA_GPIO + 0x0020)  
  37. #define S3C64XX_GPC_BASE    (S3C64XX_VA_GPIO + 0x0040)  
  38. #define S3C64XX_GPD_BASE    (S3C64XX_VA_GPIO + 0x0060)  
  39. #define S3C64XX_GPE_BASE    (S3C64XX_VA_GPIO + 0x0080)  
  40. #define S3C64XX_GPF_BASE    (S3C64XX_VA_GPIO + 0x00A0)  
  41. #define S3C64XX_GPG_BASE    (S3C64XX_VA_GPIO + 0x00C0)  
  42. #define S3C64XX_GPH_BASE    (S3C64XX_VA_GPIO + 0x00E0)  
  43. #define S3C64XX_GPI_BASE    (S3C64XX_VA_GPIO + 0x0100)  
  44. #define S3C64XX_GPJ_BASE    (S3C64XX_VA_GPIO + 0x0120)  
  45. #define S3C64XX_GPK_BASE    (S3C64XX_VA_GPIO + 0x0800)  
  46. #define S3C64XX_GPL_BASE    (S3C64XX_VA_GPIO + 0x0810)  
  47. #define S3C64XX_GPM_BASE    (S3C64XX_VA_GPIO + 0x0820)  
  48. #define S3C64XX_GPN_BASE    (S3C64XX_VA_GPIO + 0x0830)  
  49. #define S3C64XX_GPO_BASE    (S3C64XX_VA_GPIO + 0x0140)  
  50. #define S3C64XX_GPP_BASE    (S3C64XX_VA_GPIO + 0x0160)  
  51. #define S3C64XX_GPQ_BASE    (S3C64XX_VA_GPIO + 0x0180)  
  52. #define S3C64XX_SPC_BASE    (S3C64XX_VA_GPIO + 0x01A0)  
  53. #define S3C64XX_MEM0CONSTOP (S3C64XX_VA_GPIO + 0x01B0)  
  54. #define S3C64XX_MEM1CONSTOP (S3C64XX_VA_GPIO + 0x01B4)  
  55. #define S3C64XX_MEM0CONSLP0 (S3C64XX_VA_GPIO + 0x01C0)  
  56. #define S3C64XX_MEM0CONSLP1 (S3C64XX_VA_GPIO + 0x01C4)  
  57. #define S3C64XX_MEM1CONSLP  (S3C64XX_VA_GPIO + 0x01C8)  
  58. #define S3C64XX_MEM0DRVCON  (S3C64XX_VA_GPIO + 0x01D0)  
  59. #define S3C64XX_MEM1DRVCON  (S3C64XX_VA_GPIO + 0x01D4)  
  60. #define S3C64XX_EINT0CON0   (S3C64XX_VA_GPIO + 0x0900)  
  61. #define S3C64XX_EINT0CON1   (S3C64XX_VA_GPIO + 0x0904)  
  62. #define S3C64XX_EINT0FLTCON0    (S3C64XX_VA_GPIO + 0x0910)  
  63. #define S3C64XX_EINT0FLTCON1    (S3C64XX_VA_GPIO + 0x0914)  
  64. #define S3C64XX_EINT0FLTCON2    (S3C64XX_VA_GPIO + 0x0918)  
  65. #define S3C64XX_EINT0FLTCON3    (S3C64XX_VA_GPIO + 0x091C)  
  66. #define S3C64XX_EINT0MASK   (S3C64XX_VA_GPIO + 0x0920)  
  67. #define S3C64XX_EINT0PEND   (S3C64XX_VA_GPIO + 0x0924)  
  68. #define S3C64XX_SPCONSLP    (S3C64XX_VA_GPIO + 0x0880)  
  69. #define S3C64XX_SLPEN       (S3C64XX_VA_GPIO + 0x0930)  
  70. #define S3C64XX_EINT12CON   (S3C64XX_VA_GPIO + 0x0200)  
  71. #define S3C64XX_EINT34CON   (S3C64XX_VA_GPIO + 0x0204)  
  72. #define S3C64XX_EINT56CON   (S3C64XX_VA_GPIO + 0x0208)  
  73. #define S3C64XX_EINT78CON   (S3C64XX_VA_GPIO + 0x020C)  
  74. #define S3C64XX_EINT9CON    (S3C64XX_VA_GPIO + 0x0210)  
  75. #define S3C64XX_EINT12FLTCON    (S3C64XX_VA_GPIO + 0x0220)  
  76. #define S3C64XX_EINT34FLTCON    (S3C64XX_VA_GPIO + 0x0224)  
  77. #define S3C64XX_EINT56FLTCON    (S3C64XX_VA_GPIO + 0x0228)  
  78. #define S3C64XX_EINT78FLTCON    (S3C64XX_VA_GPIO + 0x022C)  
  79. #define S3C64XX_EINT9FLTCON (S3C64XX_VA_GPIO + 0x0230)  
  80. #define S3C64XX_EINT12MASK  (S3C64XX_VA_GPIO + 0x0240)  
  81. #define S3C64XX_EINT34MASK  (S3C64XX_VA_GPIO + 0x0244)  
  82. #define S3C64XX_EINT56MASK  (S3C64XX_VA_GPIO + 0x0248)  
  83. #define S3C64XX_EINT78MASK  (S3C64XX_VA_GPIO + 0x024C)  
  84. #define S3C64XX_EINT9MASK   (S3C64XX_VA_GPIO + 0x0250)  
  85. #define S3C64XX_EINT12PEND  (S3C64XX_VA_GPIO + 0x0260)  
  86. #define S3C64XX_EINT34PEND  (S3C64XX_VA_GPIO + 0x0264)  
  87. #define S3C64XX_EINT56PEND  (S3C64XX_VA_GPIO + 0x0268)  
  88. #define S3C64XX_EINT78PEND  (S3C64XX_VA_GPIO + 0x026C)  
  89. #define S3C64XX_EINT9PEND   (S3C64XX_VA_GPIO + 0x0270)  
  90. #define S3C64XX_PRIORITY    (S3C64XX_VA_GPIO + 0x0280)  
  91. #define S3C64XX_SERVICE     (S3C64XX_VA_GPIO + 0x0284)  
  92. #define S3C64XX_SERVICEPEND (S3C64XX_VA_GPIO + 0x0288)  
  93.   
  94. /* values for S3C_EXTINT0 */  
  95. #define S3C64XX_EXTINT_LOWLEV    (0x00)  
  96. #define S3C64XX_EXTINT_HILEV     (0x01)  
  97. #define S3C64XX_EXTINT_FALLEDGE  (0x02)  
  98. #define S3C64XX_EXTINT_RISEEDGE  (0x04)  
  99. #define S3C64XX_EXTINT_BOTHEDGE  (0x06)  
  100.   
  101. #endif /* __ASM_PLAT_S3C64XX_REGS_GPIO_H */  
/* linux/arch/arm/plat-s3c64xx/include/plat/regs-gpio.h
 *
 * Copyright 2008 Openmoko, Inc.
 * Copyright 2008 Simtec Electronics
 *      Ben Dooks <ben@simtec.co.uk>
 *      http://armlinux.simtec.co.uk/
 *
 * S3C64XX - GPIO register definitions
 */

#ifndef __ASM_PLAT_S3C64XX_REGS_GPIO_H
#define __ASM_PLAT_S3C64XX_REGS_GPIO_H __FILE__

#include <plat/gpio-bank-a.h>
#include <plat/gpio-bank-b.h>
#include <plat/gpio-bank-c.h>
#include <plat/gpio-bank-d.h>
#include <plat/gpio-bank-e.h>
#include <plat/gpio-bank-f.h>
#include <plat/gpio-bank-g.h>
#include <plat/gpio-bank-h.h>
#include <plat/gpio-bank-i.h>
#include <plat/gpio-bank-j.h>
#include <plat/gpio-bank-k.h>
#include <plat/gpio-bank-l.h>
#include <plat/gpio-bank-n.h>
#include #include <plat/gpio-bank-q.h>
#include <plat/gpio-bank-o.h>
#include <plat/gpio-bank-p.h>
#include <plat/gpio-bank-q.h>
#include <mach/map.h>

/* Base addresses for each of the banks */

#define S3C64XX_GPA_BASE	(S3C64XX_VA_GPIO + 0x0000)
#define S3C64XX_GPB_BASE	(S3C64XX_VA_GPIO + 0x0020)
#define S3C64XX_GPC_BASE	(S3C64XX_VA_GPIO + 0x0040)
#define S3C64XX_GPD_BASE	(S3C64XX_VA_GPIO + 0x0060)
#define S3C64XX_GPE_BASE	(S3C64XX_VA_GPIO + 0x0080)
#define S3C64XX_GPF_BASE	(S3C64XX_VA_GPIO + 0x00A0)
#define S3C64XX_GPG_BASE	(S3C64XX_VA_GPIO + 0x00C0)
#define S3C64XX_GPH_BASE	(S3C64XX_VA_GPIO + 0x00E0)
#define S3C64XX_GPI_BASE	(S3C64XX_VA_GPIO + 0x0100)
#define S3C64XX_GPJ_BASE	(S3C64XX_VA_GPIO + 0x0120)
#define S3C64XX_GPK_BASE	(S3C64XX_VA_GPIO + 0x0800)
#define S3C64XX_GPL_BASE	(S3C64XX_VA_GPIO + 0x0810)
#define S3C64XX_GPM_BASE	(S3C64XX_VA_GPIO + 0x0820)
#define S3C64XX_GPN_BASE	(S3C64XX_VA_GPIO + 0x0830)
#define S3C64XX_GPO_BASE	(S3C64XX_VA_GPIO + 0x0140)
#define S3C64XX_GPP_BASE	(S3C64XX_VA_GPIO + 0x0160)
#define S3C64XX_GPQ_BASE	(S3C64XX_VA_GPIO + 0x0180)
#define S3C64XX_SPC_BASE	(S3C64XX_VA_GPIO + 0x01A0)
#define S3C64XX_MEM0CONSTOP	(S3C64XX_VA_GPIO + 0x01B0)
#define S3C64XX_MEM1CONSTOP	(S3C64XX_VA_GPIO + 0x01B4)
#define S3C64XX_MEM0CONSLP0	(S3C64XX_VA_GPIO + 0x01C0)
#define S3C64XX_MEM0CONSLP1	(S3C64XX_VA_GPIO + 0x01C4)
#define S3C64XX_MEM1CONSLP	(S3C64XX_VA_GPIO + 0x01C8)
#define S3C64XX_MEM0DRVCON	(S3C64XX_VA_GPIO + 0x01D0)
#define S3C64XX_MEM1DRVCON	(S3C64XX_VA_GPIO + 0x01D4)
#define S3C64XX_EINT0CON0	(S3C64XX_VA_GPIO + 0x0900)
#define S3C64XX_EINT0CON1	(S3C64XX_VA_GPIO + 0x0904)
#define S3C64XX_EINT0FLTCON0	(S3C64XX_VA_GPIO + 0x0910)
#define S3C64XX_EINT0FLTCON1	(S3C64XX_VA_GPIO + 0x0914)
#define S3C64XX_EINT0FLTCON2	(S3C64XX_VA_GPIO + 0x0918)
#define S3C64XX_EINT0FLTCON3	(S3C64XX_VA_GPIO + 0x091C)
#define S3C64XX_EINT0MASK	(S3C64XX_VA_GPIO + 0x0920)
#define S3C64XX_EINT0PEND	(S3C64XX_VA_GPIO + 0x0924)
#define S3C64XX_SPCONSLP	(S3C64XX_VA_GPIO + 0x0880)
#define S3C64XX_SLPEN		(S3C64XX_VA_GPIO + 0x0930)
#define S3C64XX_EINT12CON	(S3C64XX_VA_GPIO + 0x0200)
#define S3C64XX_EINT34CON	(S3C64XX_VA_GPIO + 0x0204)
#define S3C64XX_EINT56CON	(S3C64XX_VA_GPIO + 0x0208)
#define S3C64XX_EINT78CON	(S3C64XX_VA_GPIO + 0x020C)
#define S3C64XX_EINT9CON	(S3C64XX_VA_GPIO + 0x0210)
#define S3C64XX_EINT12FLTCON	(S3C64XX_VA_GPIO + 0x0220)
#define S3C64XX_EINT34FLTCON	(S3C64XX_VA_GPIO + 0x0224)
#define S3C64XX_EINT56FLTCON	(S3C64XX_VA_GPIO + 0x0228)
#define S3C64XX_EINT78FLTCON	(S3C64XX_VA_GPIO + 0x022C)
#define S3C64XX_EINT9FLTCON	(S3C64XX_VA_GPIO + 0x0230)
#define S3C64XX_EINT12MASK	(S3C64XX_VA_GPIO + 0x0240)
#define S3C64XX_EINT34MASK	(S3C64XX_VA_GPIO + 0x0244)
#define S3C64XX_EINT56MASK	(S3C64XX_VA_GPIO + 0x0248)
#define S3C64XX_EINT78MASK	(S3C64XX_VA_GPIO + 0x024C)
#define S3C64XX_EINT9MASK	(S3C64XX_VA_GPIO + 0x0250)
#define S3C64XX_EINT12PEND	(S3C64XX_VA_GPIO + 0x0260)
#define S3C64XX_EINT34PEND	(S3C64XX_VA_GPIO + 0x0264)
#define S3C64XX_EINT56PEND	(S3C64XX_VA_GPIO + 0x0268)
#define S3C64XX_EINT78PEND	(S3C64XX_VA_GPIO + 0x026C)
#define S3C64XX_EINT9PEND	(S3C64XX_VA_GPIO + 0x0270)
#define S3C64XX_PRIORITY	(S3C64XX_VA_GPIO + 0x0280)
#define S3C64XX_SERVICE		(S3C64XX_VA_GPIO + 0x0284)
#define S3C64XX_SERVICEPEND	(S3C64XX_VA_GPIO + 0x0288)

/* values for S3C_EXTINT0 */
#define S3C64XX_EXTINT_LOWLEV	 (0x00)
#define S3C64XX_EXTINT_HILEV	 (0x01)
#define S3C64XX_EXTINT_FALLEDGE	 (0x02)
#define S3C64XX_EXTINT_RISEEDGE	 (0x04)
#define S3C64XX_EXTINT_BOTHEDGE	 (0x06)

#endif /* __ASM_PLAT_S3C64XX_REGS_GPIO_H */


由上可知此头文件包含了<plat/gpio-bank-a.h>-------><plat/gpio-bank-q.h>系列头文件,而这些头文件里面定义了对应GPIO的一系列数据宏,例如 <plat/gpio-bank-m.h>里面定义的是led程序中用到的GPM端口相关的数据宏,如下:

  1. /* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-m.h 
  2.  * 
  3.  * Copyright 2008 Openmoko, Inc. 
  4.  * Copyright 2008 Simtec Electronics 
  5.  *  Ben Dooks <ben@simtec.co.uk> 
  6.  *  http://armlinux.simtec.co.uk/ 
  7.  * 
  8.  * GPIO Bank M register and configuration definitions 
  9.  * 
  10.  * This program is free software; you can redistribute it and/or modify 
  11.  * it under the terms of the GNU General Public License version 2 as 
  12.  * published by the Free Software Foundation. 
  13. */  
  14.   
  15. #define S3C64XX_GPMCON          (S3C64XX_GPM_BASE + 0x00)  
  16. #define S3C64XX_GPMDAT          (S3C64XX_GPM_BASE + 0x04)  
  17. #define S3C64XX_GPMPUD          (S3C64XX_GPM_BASE + 0x08)  
  18.   
  19. #define S3C64XX_GPM_CONMASK(__gpio) (0x3 << ((__gpio) * 2))  
  20. #define S3C64XX_GPM_INPUT(__gpio)   (0x0 << ((__gpio) * 2))  
  21. #define S3C64XX_GPM_OUTPUT(__gpio)  (0x1 << ((__gpio) * 2))  
  22.   
  23. #define S3C64XX_GPM0_HOSTIF_CS      (0x02 << 0)  
  24. #define S3C64XX_GPM0_EINT23      (0x03 << 0)  
  25. #define S3C64XX_GPM0_RESERVED1      (0x04 << 0)  
  26. #define S3C64XX_GPM0_DATA_CF10      (0x05 << 0)  
  27. #define S3C64XX_GPM0_CE_CF0      (0x06 << 0)  
  28. #define S3C64XX_GPM0_RESERVED2      (0x07 << 0)  
  29.   
  30. #define S3C64XX_GPM1_HOSTIF_CS_M      (0x02 << 0)  
  31. #define S3C64XX_GPM1_EINT24      (0x03 << 0)  
  32. #define S3C64XX_GPM1_RESERVED1      (0x04 << 0)  
  33. #define S3C64XX_GPM1_DATA_CF11      (0x05 << 0)  
  34. #define S3C64XX_GPM1_CE_CF1      (0x06 << 0)  
  35. #define S3C64XX_GPM1_RESERVED2      (0x07 << 0)  
  36.   
  37. #define S3C64XX_GPM2_HOSTIF_IF_CS_S      (0x02 << 0)  
  38. #define S3C64XX_GPM2_EINT25      (0x03 << 0)  
  39. #define S3C64XX_GPM2_HOSTIF_MDP_VSYNC      (0x04 << 0)  
  40. #define S3C64XX_GPM2_DATA_CF12      (0x05 << 0)  
  41. #define S3C64XX_GPM2_IORD_CF      (0x06 << 0)  
  42. #define S3C64XX_GPM2_RESERVED2      (0x07 << 0)  
  43.   
  44. #define S3C64XX_GPM3_HOSTIF_WE      (0x02 << 0)  
  45. #define S3C64XX_GPM3_EINT26      (0x03 << 0)  
  46. #define S3C64XX_GPM3_RESERVED1      (0x04 << 0)  
  47. #define S3C64XX_GPM3_DATA_CF13      (0x05 << 0)  
  48. #define S3C64XX_GPM3_IOWR_CF      (0x06 << 0)  
  49. #define S3C64XX_GPM3_RESERVED2      (0x07 << 0)  
  50.   
  51. #define S3C64XX_GPM4_HOSTIF_OE      (0x02 << 0)  
  52. #define S3C64XX_GPM4_EINT27      (0x03 << 0)  
  53. #define S3C64XX_GPM4_RESERVED1      (0x04 << 0)  
  54. #define S3C64XX_GPM4_DATA_CF14      (0x05 << 0)  
  55. #define S3C64XX_GPM4_IORDY_CF      (0x06 << 0)  
  56. #define S3C64XX_GPM4_RESERVED2      (0x07 << 0)  
  57.   
  58. #define S3C64XX_GPM5_HOSTIF_INTR      (0x02 << 0)  
  59. #define S3C64XX_GPM5_CF_DATA_DIR      (0x03 << 0)  
  60. #define S3C64XX_GPM5_RESERVED1      (0x04 << 0)  
  61. #define S3C64XX_GPM5_DATA_CF15      (0x05 << 0)  
  62. #define S3C64XX_GPM5_RESERVED2      (0x06 << 0)  
  63. #define S3C64XX_GPM5_RESERVED3      (0x07 << 0)  
/* linux/arch/arm/plat-s3c64xx/include/plat/gpio-bank-m.h
 *
 * Copyright 2008 Openmoko, Inc.
 * Copyright 2008 Simtec Electronics
 *  Ben Dooks <ben@simtec.co.uk>
 *  http://armlinux.simtec.co.uk/
 *
 * GPIO Bank M register and configuration definitions
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/

#define S3C64XX_GPMCON          (S3C64XX_GPM_BASE + 0x00)
#define S3C64XX_GPMDAT          (S3C64XX_GPM_BASE + 0x04)
#define S3C64XX_GPMPUD          (S3C64XX_GPM_BASE + 0x08)

#define S3C64XX_GPM_CONMASK(__gpio) (0x3 << ((__gpio) * 2))
#define S3C64XX_GPM_INPUT(__gpio)   (0x0 << ((__gpio) * 2))
#define S3C64XX_GPM_OUTPUT(__gpio)  (0x1 << ((__gpio) * 2))

#define S3C64XX_GPM0_HOSTIF_CS      (0x02 << 0)
#define S3C64XX_GPM0_EINT23      (0x03 << 0)
#define S3C64XX_GPM0_RESERVED1      (0x04 << 0)
#define S3C64XX_GPM0_DATA_CF10      (0x05 << 0)
#define S3C64XX_GPM0_CE_CF0      (0x06 << 0)
#define S3C64XX_GPM0_RESERVED2      (0x07 << 0)

#define S3C64XX_GPM1_HOSTIF_CS_M      (0x02 << 0)
#define S3C64XX_GPM1_EINT24      (0x03 << 0)
#define S3C64XX_GPM1_RESERVED1      (0x04 << 0)
#define S3C64XX_GPM1_DATA_CF11      (0x05 << 0)
#define S3C64XX_GPM1_CE_CF1      (0x06 << 0)
#define S3C64XX_GPM1_RESERVED2      (0x07 << 0)

#define S3C64XX_GPM2_HOSTIF_IF_CS_S      (0x02 << 0)
#define S3C64XX_GPM2_EINT25      (0x03 << 0)
#define S3C64XX_GPM2_HOSTIF_MDP_VSYNC      (0x04 << 0)
#define S3C64XX_GPM2_DATA_CF12      (0x05 << 0)
#define S3C64XX_GPM2_IORD_CF      (0x06 << 0)
#define S3C64XX_GPM2_RESERVED2      (0x07 << 0)

#define S3C64XX_GPM3_HOSTIF_WE      (0x02 << 0)
#define S3C64XX_GPM3_EINT26      (0x03 << 0)
#define S3C64XX_GPM3_RESERVED1      (0x04 << 0)
#define S3C64XX_GPM3_DATA_CF13      (0x05 << 0)
#define S3C64XX_GPM3_IOWR_CF      (0x06 << 0)
#define S3C64XX_GPM3_RESERVED2      (0x07 << 0)

#define S3C64XX_GPM4_HOSTIF_OE      (0x02 << 0)
#define S3C64XX_GPM4_EINT27      (0x03 << 0)
#define S3C64XX_GPM4_RESERVED1      (0x04 << 0)
#define S3C64XX_GPM4_DATA_CF14      (0x05 << 0)
#define S3C64XX_GPM4_IORDY_CF      (0x06 << 0)
#define S3C64XX_GPM4_RESERVED2      (0x07 << 0)

#define S3C64XX_GPM5_HOSTIF_INTR      (0x02 << 0)
#define S3C64XX_GPM5_CF_DATA_DIR      (0x03 << 0)
#define S3C64XX_GPM5_RESERVED1      (0x04 << 0)
#define S3C64XX_GPM5_DATA_CF15      (0x05 << 0)
#define S3C64XX_GPM5_RESERVED2      (0x06 << 0)
#define S3C64XX_GPM5_RESERVED3      (0x07 << 0)


 3、#include <plat/gpio-cfg.h>:此头文件包含了GPIO的各种配置函数,例如设置输入输出方式,上拉电阻使能等等:

  1. /* linux/arch/arm/plat-s3c/include/plat/gpio-cfg.h 
  2.  * 
  3.  * Copyright 2008 Openmoko, Inc. 
  4.  * Copyright 2008 Simtec Electronics 
  5.  *  http://armlinux.simtec.co.uk/ 
  6.  *  Ben Dooks <ben@simtec.co.uk> 
  7.  * 
  8.  * S3C Platform - GPIO pin configuration 
  9.  * 
  10.  * This program is free software; you can redistribute it and/or modify 
  11.  * it under the terms of the GNU General Public License version 2 as 
  12.  * published by the Free Software Foundation. 
  13. */  
  14.   
  15. /* This file contains the necessary definitions to get the basic gpio 
  16.  * pin configuration done such as setting a pin to input or output or 
  17.  * changing the pull-{up,down} configurations. 
  18.  */  
  19.   
  20. /* Note, this interface is being added to the s3c64xx arch first and will 
  21.  * be added to the s3c24xx systems later. 
  22.  */  
  23.   
  24. #ifndef __PLAT_GPIO_CFG_H  
  25. #define __PLAT_GPIO_CFG_H __FILE__  
  26.   
  27. typedef unsigned int __bitwise__ s3c_gpio_pull_t;  
  28.   
  29. /* forward declaration if gpio-core.h hasn't been included */  
  30. struct s3c_gpio_chip;  
  31.   
  32. /** 
  33.  * struct s3c_gpio_cfg GPIO configuration 
  34.  * @cfg_eint: Configuration setting when used for external interrupt source 
  35.  * @get_pull: Read the current pull configuration for the GPIO 
  36.  * @set_pull: Set the current pull configuraiton for the GPIO 
  37.  * @set_config: Set the current configuration for the GPIO 
  38.  * @get_config: Read the current configuration for the GPIO 
  39.  * 
  40.  * Each chip can have more than one type of GPIO bank available and some 
  41.  * have different capabilites even when they have the same control register 
  42.  * layouts. Provide an point to vector control routine and provide any 
  43.  * per-bank configuration information that other systems such as the 
  44.  * external interrupt code will need. 
  45.  */  
  46. struct s3c_gpio_cfg {  
  47.     unsigned int    cfg_eint;  
  48.   
  49.     s3c_gpio_pull_t (*get_pull)(struct s3c_gpio_chip *chip, unsigned offs);  
  50.     int     (*set_pull)(struct s3c_gpio_chip *chip, unsigned offs,  
  51.                     s3c_gpio_pull_t pull);  
  52.   
  53.     unsigned (*get_config)(struct s3c_gpio_chip *chip, unsigned offs);  
  54.     int  (*set_config)(struct s3c_gpio_chip *chip, unsigned offs,  
  55.                    unsigned config);  
  56. };  
  57.   
  58. #define S3C_GPIO_SPECIAL_MARK   (0xfffffff0)  
  59. #define S3C_GPIO_SPECIAL(x) (S3C_GPIO_SPECIAL_MARK | (x))  
  60.   
  61. /* Defines for generic pin configurations */  
  62. #define S3C_GPIO_INPUT  (S3C_GPIO_SPECIAL(0))  
  63. #define S3C_GPIO_OUTPUT (S3C_GPIO_SPECIAL(1))  
  64. #define S3C_GPIO_SFN(x) (S3C_GPIO_SPECIAL(x))  
  65.   
  66. #define s3c_gpio_is_cfg_special(_cfg) \  
  67.     (((_cfg) & S3C_GPIO_SPECIAL_MARK) == S3C_GPIO_SPECIAL_MARK)  
  68.   
  69. /** 
  70.  * s3c_gpio_cfgpin() - Change the GPIO function of a pin. 
  71.  * @pin pin The pin number to configure. 
  72.  * @pin to The configuration for the pin's function. 
  73.  * 
  74.  * Configure which function is actually connected to the external 
  75.  * pin, such as an gpio input, output or some form of special function 
  76.  * connected to an internal peripheral block. 
  77.  */  
  78. extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);  
  79.   
  80. /* Define values for the pull-{up,down} available for each gpio pin. 
  81.  * 
  82.  * These values control the state of the weak pull-{up,down} resistors 
  83.  * available on most pins on the S3C series. Not all chips support both 
  84.  * up or down settings, and it may be dependant on the chip that is being 
  85.  * used to whether the particular mode is available. 
  86.  */  
  87. #define S3C_GPIO_PULL_NONE  ((__force s3c_gpio_pull_t)0x00)  
  88. #define S3C_GPIO_PULL_DOWN  ((__force s3c_gpio_pull_t)0x01)  
  89. #define S3C_GPIO_PULL_UP    ((__force s3c_gpio_pull_t)0x02)  
  90.   
  91. /** 
  92.  * s3c_gpio_setpull() - set the state of a gpio pin pull resistor 
  93.  * @pin: The pin number to configure the pull resistor. 
  94.  * @pull: The configuration for the pull resistor. 
  95.  * 
  96.  * This function sets the state of the pull-{up,down} resistor for the 
  97.  * specified pin. It will return 0 if successfull, or a negative error 
  98.  * code if the pin cannot support the requested pull setting. 
  99. */  
  100. extern int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull);  
  101.   
  102. /** 
  103.  * s3c_gpio_getpull() - get the pull resistor state of a gpio pin 
  104.  * @pin: The pin number to get the settings for 
  105.  * 
  106.  * Read the pull resistor value for the specified pin. 
  107. */  
  108. extern s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin);  
  109.   
  110. #endif /* __PLAT_GPIO_CFG_H */  
/* linux/arch/arm/plat-s3c/include/plat/gpio-cfg.h
 *
 * Copyright 2008 Openmoko, Inc.
 * Copyright 2008 Simtec Electronics
 *	http://armlinux.simtec.co.uk/
 *	Ben Dooks <ben@simtec.co.uk>
 *
 * S3C Platform - GPIO pin configuration
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/

/* This file contains the necessary definitions to get the basic gpio
 * pin configuration done such as setting a pin to input or output or
 * changing the pull-{up,down} configurations.
 */

/* Note, this interface is being added to the s3c64xx arch first and will
 * be added to the s3c24xx systems later.
 */

#ifndef __PLAT_GPIO_CFG_H
#define __PLAT_GPIO_CFG_H __FILE__

typedef unsigned int __bitwise__ s3c_gpio_pull_t;

/* forward declaration if gpio-core.h hasn't been included */
struct s3c_gpio_chip;

/**
 * struct s3c_gpio_cfg GPIO configuration
 * @cfg_eint: Configuration setting when used for external interrupt source
 * @get_pull: Read the current pull configuration for the GPIO
 * @set_pull: Set the current pull configuraiton for the GPIO
 * @set_config: Set the current configuration for the GPIO
 * @get_config: Read the current configuration for the GPIO
 *
 * Each chip can have more than one type of GPIO bank available and some
 * have different capabilites even when they have the same control register
 * layouts. Provide an point to vector control routine and provide any
 * per-bank configuration information that other systems such as the
 * external interrupt code will need.
 */
struct s3c_gpio_cfg {
	unsigned int	cfg_eint;

	s3c_gpio_pull_t	(*get_pull)(struct s3c_gpio_chip *chip, unsigned offs);
	int		(*set_pull)(struct s3c_gpio_chip *chip, unsigned offs,
				    s3c_gpio_pull_t pull);

	unsigned (*get_config)(struct s3c_gpio_chip *chip, unsigned offs);
	int	 (*set_config)(struct s3c_gpio_chip *chip, unsigned offs,
			       unsigned config);
};

#define S3C_GPIO_SPECIAL_MARK	(0xfffffff0)
#define S3C_GPIO_SPECIAL(x)	(S3C_GPIO_SPECIAL_MARK | (x))

/* Defines for generic pin configurations */
#define S3C_GPIO_INPUT	(S3C_GPIO_SPECIAL(0))
#define S3C_GPIO_OUTPUT	(S3C_GPIO_SPECIAL(1))
#define S3C_GPIO_SFN(x)	(S3C_GPIO_SPECIAL(x))

#define s3c_gpio_is_cfg_special(_cfg) \
	(((_cfg) & S3C_GPIO_SPECIAL_MARK) == S3C_GPIO_SPECIAL_MARK)

/**
 * s3c_gpio_cfgpin() - Change the GPIO function of a pin.
 * @pin pin The pin number to configure.
 * @pin to The configuration for the pin's function.
 *
 * Configure which function is actually connected to the external
 * pin, such as an gpio input, output or some form of special function
 * connected to an internal peripheral block.
 */
extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);

/* Define values for the pull-{up,down} available for each gpio pin.
 *
 * These values control the state of the weak pull-{up,down} resistors
 * available on most pins on the S3C series. Not all chips support both
 * up or down settings, and it may be dependant on the chip that is being
 * used to whether the particular mode is available.
 */
#define S3C_GPIO_PULL_NONE	((__force s3c_gpio_pull_t)0x00)
#define S3C_GPIO_PULL_DOWN	((__force s3c_gpio_pull_t)0x01)
#define S3C_GPIO_PULL_UP	((__force s3c_gpio_pull_t)0x02)

/**
 * s3c_gpio_setpull() - set the state of a gpio pin pull resistor
 * @pin: The pin number to configure the pull resistor.
 * @pull: The configuration for the pull resistor.
 *
 * This function sets the state of the pull-{up,down} resistor for the
 * specified pin. It will return 0 if successfull, or a negative error
 * code if the pin cannot support the requested pull setting.
*/
extern int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull);

/**
 * s3c_gpio_getpull() - get the pull resistor state of a gpio pin
 * @pin: The pin number to get the settings for
 *
 * Read the pull resistor value for the specified pin.
*/
extern s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin);

#endif /* __PLAT_GPIO_CFG_H */


 

0
0
 
 
我的同类文章
http://blog.csdn.net
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值