除去内核源码下的include目录外,在arch/arm/mach-s3c2410/和arch/arm/plat-s3c24xx/目录下都有include目录的。
#include <linux/kernel.h> /* printk() */
#include <linux/slab.h> /* kmalloc() */
#include <linux/fs.h> /* file_operations、inode_operations、super_operations结构体*/
#include <linux/errno.h> /* error codes */
#include <linux/types.h> /* size_t等各种系统typedef的数据类型 */
#include <linux/fcntl.h> /* O_ACCMODE */
#include <linux/poll.h> /* COPY_TO_USER */
#include <linux/module.h> /*MODULE_LICENSE("GPL");内核认识的特定许可有, "GPL"( 适用 GNU 通用公共许可的任何版本 ), "GPL v2"( 只适用 GPL 版本 2 ), "GPL and additional rights", "Dual BSD/GPL", "Dual MPL/GPL", "Proprietary". 除非你的模块明确标识是在内核认识的一个自由许可下, 否则就假定它是私有的, 内核在模块加载时被"弄污浊"了. 象我们在第 1 章"许可条款"中提到的, 内核开发者不会热心帮助在加载了私有模块后遇到问题的用户. MODULE_AUTHOR ( 声明谁编写了模块 ), MODULE_DESCRIPION( 一个人可读的关于模块做什么的声明 ), MODULE_VERSION ( 一个代码修订版本号; 看 <linux/module.h> 的注释以便知道创建版本字串使用的惯例), MODULE_ALIAS ( 模块为人所知的另一个名子 ), MODULE_DEVICE_TABLE ( 来告知用户空间, 模块支持那些设备 ). */
#include <linux/init.h> /* #define module_init(x) __initcall(x); driver initialization entry point #define module_exit(x) __exitcall(x); driver exit entry point */
#include <linux/miscdevice.h> /* extern int misc_register(struct miscdevice * misc); 注册miscdevice结构体成员变量设备 extern int misc_deregister(struct miscdevice *misc); 注销miscdevice结构体成员变量设备 */
#include <linux/cdev.h> /* 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 *); */
#include <mach/hardware.h> /* 和GPIO口操作相关的函数定义的头文件 对应的源文件在/linux-2.6.32.2/arch/arm/plat-s3c24xx/gpio.c void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function); unsigned int s3c2410_gpio_getcfg(unsigned int pin); void s3c2410_gpio_pullup(unsigned int pin, unsigned int to); int s3c2410_gpio_getpull(unsigned int pin); void s3c2410_gpio_setpin(unsigned int pin, unsigned int to); unsigned int s3c2410_gpio_getpin(unsigned int pin); unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change); int s3c2410_gpio_getirq(unsigned int pin); int s3c2410_gpio_irq2pin(unsigned int irq);*/ #include <mach/regs-gpio.h> /* 和GPIO口相关的一些宏定义(在arch/arm/mach-s3c2410/mach) */
#include <linux/platform_device.h> /* */
#include <linux/interrupt.h> /* typedef irqreturn_t (*irq_handler_t)(int, void *); extern void free_irq(unsigned int, void *);extern void disable_irq(unsigned int irq); extern void enable_irq(unsigned int irq);等和中断相关函数的声明 */
#include <linux/wait.h> /* wake_up_interruptible 唤醒 q 指定的注册在等待队列上的进程。该函数不能直接的立即唤醒进程,而是由调度程序转换上下文,调整为可运行状态。 static DECLARE_WAIT_QUEUE_HEAD(button_waitq);声明等待队列为全局变量 wait_event_interruptible该函数修改task的状态为TASK_INTERRUPTIBLE,意味着改进程将不会继续运行直到被唤醒,然后被添加到等待队列wq中*/
#include <linux/poll.h> /* poll_wait */
#include <asm/uaccess.h> /* copy_to_user和copy_from_user */ #include <asm/io.h> /* __raw_readl __raw_writel*/
#include <linux/clk.h> /* struct clk *clk_get(struct device *dev, const char *id); unsigned long clk_get_rate(struct clk *clk); */
#include <plat/clock.h> /* struct clk;结构体的定义 (在arch/arm/plat-s3c/plat/include/clock.arch中,对应的源文件在/arm/plat-s3c/clock.c)*/
#include <linux/device.h> //包含了device、class 、device_driver等结构的定义
#include <mach/regs-mem.h> /* 和bank相关的寄存器的宏定义 */
#include <asm/div64.h> /* Linux内核中64位除法函数do_div */
#include <linux/fb.h> /* struct fb_info 结构体的定义 */
#include <mach/fb.h> /* struct s3c2410fb_display(在arch/arm/mach-s3c2410/include/mach/fb.h) */
#include <linux/module.h> 模块头文件 #include <linux/kernel.h> 驱动要写入内核,与内核相关的头文件 #include <linux/fs.h> 文件系统头文件 #include <linux/init.h> 初始化头文件 #include <linux/delay.h> 延时头文件 #include <asm/irq.h> 与处理器相关的中断 #include <linux/interrupt.h> 操作系统中断 #include <asm/uaccess.h> 与处理器相关的入口 //#include <asm/arch/regs-gpio.h> 与处理器相关的IO口操作 #include <mach/regs-gpio.h> 同上 //#include <asm/hardware.h> 与处理器相关的硬件 #include <mach/hardware.h> 同上 #include <linux/device.h> 设备驱动文件 #include <linux/poll.h> 轮询文件 #include <linux/gpio.h> 操作系统相关的IO口文件 #include <stdio.h> 标准输入输出 #include <stdlib.h> 标准库 #include <unistd.h> #include <sys/ioctl.h> IO控制
#include <sys/types.h> 变量类型的头文件,因为linux要兼容各种长度的变量 #include <sys/stat.h> 文件操作的头文件 #include <fcntl.h> 同上 #include <sys/select.h> 同上 #include <sys/time.h> 时间编程的头文件 #include <errno.h> 错误代码头文件