1.先写关于ARM9芯片的寄存器读写的api接口,这样统一并且方便其他驱动程序调用; 2.看型号这是颗片外的RTC芯片吧,这样还需要串口总线的驱动,负责读写RTC芯片的数据,一般都是I2C的居多,如果随板的套件 里没有的话(问问老师,既然让写RTC的驱动,I2C部分不是重点应该被忽略掉,要是也没有就T_T吧),就需要自己实现了,要么用I/O模拟,要么使用ARM上的I2C硬件寄存器接口,也是需要整出一个读写RTC寄存器的api接口; 3.最后是RTC的驱动部分,结合你的需求(读,写,设置时间)和驱动程序的框架,定义一个file_operations的结构。读和写的部分可以单独使用一个接口,也可以放在ioctl里使用命令完成读写的功能;设置时间的显示12/24制就需要使用ioctl了,转换12/24的状态,这部分一般在RTC的datasheet中也介绍,没有的话就只好人工手动实现转换了; static struct file_operations rtc_fops = { owner: THIS_MODULE, read: rtc_read, write: rtc_write, ioctl: rtc_ioctl, open: rtc_open, release: rtc_release, };
4.检验。编译后,使用insmod加载,然后用hwclock -r 命令读取硬件RTC的时间看是否成功;成功的话,再用date和hwclock -s 和 -w选项(具体其他选项的使用看hwclock --help)将系统时间设置到RTC,然后再测试将RTC时间设置到系统,看是否可以成功转换; 5.交作业。
|
1.上面说的第1步的意思是:在驱动程序里免不了要读写ARM的类似GPIO的寄存器,如GPIO的置位寄存器,清零寄存器,上拉,输入输出这些等,使用一组统一的接口来操作
这些寄存器,这样不仅RTC驱动方便使用,其他的驱动程序也可以使用,如果用的是2410可能有这些接口:
s3c2410_gpio_getpin();
s3c2410_gpio_cfgpin(S3C2410_GPG2,S3C2410_GPG2_INP);
s3c2410_gpio_pullup(S3C2410_GPG2,0);
s3c2410_gpio_cfgpin(S3C2410_GPG13,S3C2410_GPG13_INP);
s3c2410_gpio_pullup(S3C2410_GPG13,0);
第1步说的api指的是这样的设置寄存器的接口,如果是新移植的其他ARM芯片的话就需要自己实现类似这样的接口了,当然,这也不是必须的;)
ps:这一步和使用串口或网口连接板子没有直接的关系;)
2.驱动调试的时候如没有特别的要求一般先用动态加载的方式,如果需要编译到内核里,调试完成后添加就可以了;
如果一开始就放在driver/char/目录下,每次修改后都需要重新编译驱动,连带内核也编译了,时间会很长,所以动态加载调试还是很方便的;
3.RTC编译完,加载到内核后,需要有一个用户层的应用程序来调用这个驱动进行测试,也就是你说的“test”,这个test可以自己写,在test里open驱动,然后read,write它的值。相对于RTC的驱动来说,还有一个命令行下的命令,hwclock,也可以当"test"来用,并且最终RTC驱动完成时,修改系统时间和设置RTC时间也一般也是用这个命令(结合date命令)完成的。
4.最后调试完后,将它编译进内核:
a) 写好的驱动程序rtc_driver.c放在driver/char/目录下;
b) 修改Makefile,加入一行obj-$(CONFIG_RTC_XXXX) += rtc_driver.o 是说:如果CONFIG_RTC_XXXX配置为Y 则编绎rtc_driver.c生成文件rtc_driver.o
c) 修改Kconfig 加入菜单项
menu "Character devices"
config RTC_XXXX
bool "rtcrtcrtcrtcrtc"
修改Makefile和Kconfig参考Makefile中其他驱动的格式,copy就行了.
基本上是这样了,有问题的话还得具体再调试;
阅读(1988) | 评论(0) | 转发(0) |