s3c2410 RTC驱动框架linux内核源码分析

博主由于工作欠时需要加班,利用空闲时间整理了s3c2410 RTC驱动的框架分析。通过对linux内核源码的研究,文章详细探讨了硬件驱动模块的struct和框架设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 懒了很长时间了,以导致最近变本加厉,现在得到了惩罚,这个月快要结卡时竟然欠了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:    liyangth@gmail.com         
*                                
*  @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,
}
;


linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |-- alsa-oss-1.0.15.tar.bz2 | | |-- alsa-tools-1.0.15.tar.bz2 | | |-- alsa-utils-1.0.13.tar.bz2 | | `-- pyalsa-1.0.15.tar.bz2 | |-- ALSA驱动范例 | | |-- sa11xx-uda1341.c | | `-- uda1341.h | |-- ALSA应用程序范例 | | |-- pcm.c | | `-- pcm_min.c | |-- OSS驱动范例 | | `-- s3c2410-uda1341.c | `-- OSS应用程序范例 | |-- mixer.c | `-- sound.c |-- 18 | |-- FRAMEBUFFER应用程序范例 | | `-- fb_display | | |-- fb_display.c | | |-- fb_display.h | | |-- Makefile | | |-- README | | `-- test.c | `-- S3C2410 LCD驱动 | |-- s3c2410fb.c | `-- s3c2410fb.h |-- 19 | |-- busybox源代码 | | `-- busybox-1.2.1.tar.bz2 | |-- MTD工具 | | `-- mtd-utils-1.0.0.tar.gz | |-- nand驱动范例 | | `-- s3c2410.c | |-- nor驱动范例 | | `-- s3c2410nor.c | `-- yaffs&yaffs2源代码 | |-- yaffs.tar.gz | `-- yaffs2.tar.gz |-- 20 | |-- USB串口驱动 | | |-- usb-serial.c | | `-- usb-serial.h | |-- USB工具 | | `-- usbview-1.0.tar.tar | |-- USB骨架程序 | | `-- usb-skeleton.c | |-- USB键盘驱动 | | |-- input.h | | |-- usb_input.h | | `-- usbkbd.c | `-- usb主机控制器驱动范例 | |-- ohci-s3c2410.c | `-- usb-control.h |-- 21 | |-- PCI骨架程序 | | `-- pci-skeleton.c | `-- PCI驱动范例 | `-- i810_audio.c `-- 22 |-- 范例代码 | |-- oops范例 | | |-- oops_example.asm | | `-- oops_example.c | `-- proc范例 | `-- sim_proc.c `-- 内核调试工具 |-- ddd-3.3.11.tar.gz |-- gdbmod-2.4.bz2 |-- kdb-v4.4-2.6.15-rc5-common-1.bz2 |-- kdb-v4.4-2.6.15-rc5-common-2.bz2 |-- kdb-v4.4-2.6.15-rc5-i386-1.bz2 `-- linux-2.6.15.5-kgdb-2.4.tar.tar 73 directories, 91 files
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值