天天看點

Linux驅動之RTC移植

drivers\rtc\rtc-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. 修改arch\arm\plat-s3c24xx\common-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):

&s3c_device_rtc,

2. make uimage, 使用新核心啟動

3. ls /dev/rtc* -l

   date /* 顯示系統時間 */

   date 123015402011.30 /* 設定系統時間 date [mmddhhmm[[cc]yy][.ss]] */

   hwclock -w           /* 把系統時間寫入rtc */

   短電,重新開機,執行date

繼續閱讀