• RTC驱动程序分析



    drivers tc tc-s3c.c



    s3c_rtc_init
         platform_driver_register
               s3c_rtc_probe
                        rtc_device_register("s3c", &pdev->dev, &s3c_rtcops, THIS_MODULE)
                                  rtc_dev_prepare
                                            cdev_init(&rtc->char_dev, &rtc_dev_fops);
      rtc_dev_add_device
                                            cdev_add




    app:    open("/dev/rtc0");
    -------------------------------------------
    kernel: sys_open
                    rtc_dev_fops.open
                             rtc_dev_open
                                     // 根据次设备号找到以前用"rtc_device_register"注册的rtc_device
                                     struct rtc_device *rtc = container_of(inode->i_cdev,struct  rtc_device, char_dev);
                                     const struct rtc_class_ops *ops = rtc->ops;
                                     err = ops->open ? ops->open(rtc->dev.parent) : 0;



    s3c_rtc_open
    app:    ioctl(fd, RTC_RD_TIME,...)
    -------------------------------------------
    kernel: sys_ioctl
                    rtc_dev_fops.ioctl
                           rtc_dev_ioctl
                                          struct rtc_device *rtc = file->private_data;
                                          rtc_read_time(rtc, &tm);
                                                 err = rtc->ops->read_time(rtc->dev.parent, tm);
                                                        s3c_rtc_gettime
                 
                 
                   
    测试RTC:
    1. 修改archarmplat-s3c24xxcommon-smdk.c
    static struct platform_device __initdata *smdk_devs[] = {
    &s3c_device_nand,
    &smdk_led4,
    &smdk_led5,
    &smdk_led6,
    &smdk_led7,
    改为(在数组smdk_devs里加上s3c_device_rtc):
    static struct platform_device __initdata *smdk_devs[] = {
    &s3c_device_nand,
    &smdk_led4,
    &smdk_led5,
    &smdk_led6,
    &smdk_led7,
    &s3c_device_rtc,


    在 smdk_machine_init(void) 里添加设备 platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs));   也就是把数组smdk_devs里的设备,注册到设备链表里。    方便以后与注册的驱动链表匹配。


    2. make uImage, 使用新内核启动


    3. ls /dev/rtc* -l
       date /* 显示系统时间 */
       date 123015402011.30 /* 设置系统时间 date [MMDDhhmm[[CC]YY][.ss]] */
       hwclock -w           /* 把系统时间写入RTC */
       
       短电,重启,执行date
       



    注:韦老师总结,我添加了一点东西

  • 相关阅读:
    二分与三分
    NOIP应试技巧
    数论
    并差集
    最短路
    图的遍历

    最小生成树
    树状数组
    线段树
  • 原文地址:https://www.cnblogs.com/alan666/p/8312086.html
Copyright © 2020-2023  润新知