懒了很长时间了,以导致最近变本加厉,现在得到了惩罚,这个月快要结卡时竟然欠了13.5个小时的工作时间,mY god...
连续3天了,晚上不得不在公司加班补时间,该看的电影都看完了,在公司也不能上网打游戏虐人,实在无聊中就将原来的一些东西整理了一下,自己是个记性不好的人,隔断时间整理自己,同时也希望可以方便他人。
----------------------------------------------------------------------------------------------------------------------------------------
/**/
/*********************************************************************************************************
* @Description:s3c2410的rtc驱动的实现,rtc(real time clock)实时时钟的驱动是个很好的
* 理解如果编写驱动的硬件,它包括了最基本的硬中断,软中断的底层机制;
* s3c2410的RTC驱动的实现个人认为更是对linux设备驱动一个很好的例子,他是通过二层结构来
* 实现的一个驱动,上层是一个arm common的公共层,对上提供标准的通用的RTC操作接口,下层由
* 我们来实现针对自己的chip和自己要提供的功能来实现的一层驱动;
*
* @FileTree:
**********************************************************************************************************
linux-2.6.14.6
|
|--arch
| |
| |--arm
| | |--mach-s3c2410
| | | |-devs.c //包含了对各个部件的resource的分配和定义,在这看rtc的资源;
| | |--common
| | | |-rtctime.c //一个arm平台的通用rtc函数层,它对上隐藏了各种soc的rtc driver的区别;
| | |--kernel
| | | |-time.c //内核的初始化例程time_init()会调用的xxx_cmos_xxx函数的实现;定义了全局自旋锁rtc_lock用来串行化所有CPU对RTC的操作
|
|--drivers
| |--char
| | |-s3c2410-rtc.c //具体的s3c2410上的rtc chip的驱动实现,如果需要在arm平台的
| | 板子上实现一个驱动,改写它就ok了。
|
|--include
| |--asm-arm
| | |--arch-s3c2410
| | | |-regs-rtc.h //S3C2410 Internal RTC register definition refer to datasheet;
| | |-rtc.h //arm平台rtc操作抽象层rtctime.c对应的.h
| |--linux
| | |-time.h //mktime的实现;
| | |-rtc.h //公用RTC .h
*
*[小结]
*1)提供给user的接口,在arch/arm/common/rtctime.c,include/asm-arm/rtc.h中实现,调用操作硬件驱动在drivers/char/s3c2410-rtc.c,include/asm-arm/arch-s3c2410/regs-rtc.h实现;
*2)提供给kernel的接口,在arch/arm/kernel/time.c,include/linux/time.h中实现,调用操作硬件驱动在drivers/char/s3c2410-rtc.c,include/asm-arm/arch-s3c2410/regs-rtc.h实现;
**********************************************************************************************************
*
* @Author: [email protected]
*
* @Function List: <Functions>
*
* <Static functions>
*
*
* @Changelog:
* 2007-06-24 LiYang First version
*
* @FQA:
* [50%]Q1.在驱动中要将设备注册到总线,必须将设备封装成struct device_driver;调查这个结构体中的每个成员.
* [0%]Q2.在板子(什么类型)上什么样的设备要用总线(什么类型)注册?
* [90%]Q3.
* struct device --总线设备
* struct device_driver --总线设备驱动
* struct platform_device --平台设备
* struct resource --平台资源
*
* [!0%]Q4.初始化rtc register的函数的后面的flag具体控制什么? (在s2s65a里是否可以用它控制是softReset or hardwareReset)
*
* [0%]Q5.什么时候调用suspend, resume?
**********************************************************************************************************/
/**/ /*****************************************************************************
* Structures & Unions & Enums (#typedef)
*/
/**/ /*[include/linux/device.h]
*总线设备驱动结构体,将它注册到板子的总线上
*/
static struct device_driver s3c2410_rtcdrv = ... {
.name = "s3c2410-rtc",
.owner = THIS_MODULE,
.bus = &platform_bus_type, //总线类型,貌似不用管
.probe = s3c2410_rtc_probe, //自检->初始化REG->注册到上一层
.remove = s3c2410_rtc_remove, //注销
.suspend = s3c2410_rtc_suspend, //[挂起???]
.resume = s3c2410_rtc_resume, //[重起???]
} ;
/**/ /*[/include/asm-arm/rtc.h]
*底层特别操作集,将他注册到上层的arm common操作层
*/
static struct rtc_ops s3c2410_rtcops = ... {
.owner = THIS_MODULE,
.open = s3c2410_rtc_open,
.release = s3c2410_rtc_release,
.ioctl = s3c2410_rtc_ioctl,
.read_time = s3c2410_rtc_gettime,
.set_time = s3c2410_rtc_settime,
.read_alarm = s3c2410_rtc_getalarm,
.set_alarm = s3c2410_rtc_setalarm,
.proc = s3c2410_rtc_proc,
} ;
/**/ /*****************************************************************************
* Global Variables
*/
* @Description:s3c2410的rtc驱动的实现,rtc(real time clock)实时时钟的驱动是个很好的
* 理解如果编写驱动的硬件,它包括了最基本的硬中断,软中断的底层机制;
* s3c2410的RTC驱动的实现个人认为更是对linux设备驱动一个很好的例子,他是通过二层结构来
* 实现的一个驱动,上层是一个arm common的公共层,对上提供标准的通用的RTC操作接口,下层由
* 我们来实现针对自己的chip和自己要提供的功能来实现的一层驱动;
*
* @FileTree:
**********************************************************************************************************
linux-2.6.14.6
|
|--arch
| |
| |--arm
| | |--mach-s3c2410
| | | |-devs.c //包含了对各个部件的resource的分配和定义,在这看rtc的资源;
| | |--common
| | | |-rtctime.c //一个arm平台的通用rtc函数层,它对上隐藏了各种soc的rtc driver的区别;
| | |--kernel
| | | |-time.c //内核的初始化例程time_init()会调用的xxx_cmos_xxx函数的实现;定义了全局自旋锁rtc_lock用来串行化所有CPU对RTC的操作
|
|--drivers
| |--char
| | |-s3c2410-rtc.c //具体的s3c2410上的rtc chip的驱动实现,如果需要在arm平台的
| | 板子上实现一个驱动,改写它就ok了。
|
|--include
| |--asm-arm
| | |--arch-s3c2410
| | | |-regs-rtc.h //S3C2410 Internal RTC register definition refer to datasheet;
| | |-rtc.h //arm平台rtc操作抽象层rtctime.c对应的.h
| |--linux
| | |-time.h //mktime的实现;
| | |-rtc.h //公用RTC .h
*
*[小结]
*1)提供给user的接口,在arch/arm/common/rtctime.c,include/asm-arm/rtc.h中实现,调用操作硬件驱动在drivers/char/s3c2410-rtc.c,include/asm-arm/arch-s3c2410/regs-rtc.h实现;
*2)提供给kernel的接口,在arch/arm/kernel/time.c,include/linux/time.h中实现,调用操作硬件驱动在drivers/char/s3c2410-rtc.c,include/asm-arm/arch-s3c2410/regs-rtc.h实现;
**********************************************************************************************************
*
* @Author: [email protected]
*
* @Function List: <Functions>
*
* <Static functions>
*
*
* @Changelog:
* 2007-06-24 LiYang First version
*
* @FQA:
* [50%]Q1.在驱动中要将设备注册到总线,必须将设备封装成struct device_driver;调查这个结构体中的每个成员.
* [0%]Q2.在板子(什么类型)上什么样的设备要用总线(什么类型)注册?
* [90%]Q3.
* struct device --总线设备
* struct device_driver --总线设备驱动
* struct platform_device --平台设备
* struct resource --平台资源
*
* [!0%]Q4.初始化rtc register的函数的后面的flag具体控制什么? (在s2s65a里是否可以用它控制是softReset or hardwareReset)
*
* [0%]Q5.什么时候调用suspend, resume?
**********************************************************************************************************/
/**/ /*****************************************************************************
* Structures & Unions & Enums (#typedef)
*/
/**/ /*[include/linux/device.h]
*总线设备驱动结构体,将它注册到板子的总线上
*/
static struct device_driver s3c2410_rtcdrv = ... {
.name = "s3c2410-rtc",
.owner = THIS_MODULE,
.bus = &platform_bus_type, //总线类型,貌似不用管
.probe = s3c2410_rtc_probe, //自检->初始化REG->注册到上一层
.remove = s3c2410_rtc_remove, //注销
.suspend = s3c2410_rtc_suspend, //[挂起???]
.resume = s3c2410_rtc_resume, //[重起???]
} ;
/**/ /*[/include/asm-arm/rtc.h]
*底层特别操作集,将他注册到上层的arm common操作层
*/
static struct rtc_ops s3c2410_rtcops = ... {
.owner = THIS_MODULE,
.open = s3c2410_rtc_open,
.release = s3c2410_rtc_release,
.ioctl = s3c2410_rtc_ioctl,
.read_time = s3c2410_rtc_gettime,
.set_time = s3c2410_rtc_settime,
.read_alarm = s3c2410_rtc_getalarm,
.set_alarm = s3c2410_rtc_setalarm,
.proc = s3c2410_rtc_proc,
} ;
/**/ /*****************************************************************************
* Global Variables
*/