解压软件-win7依赖服务或组无法启动
![export_symbol](/uploads/image/0526.jpg)
2023年4月3日发(作者:win7 64位纯净版ghostxp5)
首先rtc是实时时钟,linux中他的作用主要有两个:
①、时间日期维持功能:
主要是由RTC实时时钟控制寄存器RTCCON进行功能的使能控制,由节拍时间
计数寄存器TICNT来产生节拍时间中断来实现实时操作系统功能相关的时间和
实时同步。其中对时间日期的操作实际上是对BCD码操作,而BCD码则是由一
系列的寄存器组成(BCD秒寄存器BCDSEC、BCD分寄存器BCDMIN、BCD小
时寄存器BCDHOUR、BCD日期寄存器BCDDATE、BCD日寄存器BCDDAY、
BCD月寄存器BCDMON、BCD年寄存器BCDYEAR)。
②、报警功能:
主要由RTC报警控制寄存器RTCALM进行功能使能控制,并产生报警中断。报
警时间日期的设置也是对一系列的寄存器进行操作(报警秒数据寄存器ALMSEC、
报警分钟数据寄存器ALMMIN、报警小时数据寄存器ALMHOUR、报警日期数
据寄存器ALMDATE、报警月数据寄存器ALMMON、报警年数据寄存器
ALMYEAR)。
staticstructresources3c_rtc_resource[]={
[0]={
.start=S3C24XX_PA_RTC,
.end=S3C24XX_PA_RTC+0xff,
.flags=IORESOURCE_MEM,
},
#if!defined(CONFIG_CPU_S3C6400)&&!defined(CONFIG_CPU_S3C6410)
[1]={
.start=IRQ_RTC,
.end=IRQ_RTC,
.flags=IORESOURCE_IRQ,
},
[2]={
.start=IRQ_TICK,
.end=IRQ_TICK,
.flags=IORESOURCE_IRQ
}
#else
[1]={
.start=IRQ_RTC_ALARM,
.end=IRQ_RTC_ALARM,
.flags=IORESOURCE_IRQ,
},
[2]={
.start=IRQ_RTC_TIC,
.end=IRQ_RTC_TIC,
.flags=IORESOURCE_IRQ
}
#endif
};
structplatform_devices3c_device_rtc={
.name="s3c2410-rtc",
.id=-1,
.num_resources=ARRAY_SIZE(s3c_rtc_resource),
.resource=s3c_rtc_resource,
};
EXPORT_SYMBOL(s3c_device_rtc);
以上是相应的设备资源,他也是platform设备,在板子启动的时候注册到系统中。
下面是相应的设备驱动:
staticstructplatform_drivers3c2410_rtcdrv={
.probe=s3c_rtc_probe,
.remove=s3c_rtc_remove,
.suspend=s3c_rtc_suspend,
.resume=s3c_rtc_resume,
.driver={
.name="s3c2410-rtc",
.owner=THIS_MODULE,
},
};
staticchar__initdatabanner[]="S3C24XXRTC,(c)2004,2006Simtec
Electronicsn";
staticint__inits3c_rtc_init(void)
{
printk(banner);
MSG(INFO,("lzf-%s-%sn",__FUNCTION__,__FILE__));
returnplatform_driver_register(&s3c2410_rtcdrv);
}
staticvoid__exits3c_rtc_exit(void)
{
MSG(INFO,("lzf-%s-%sn",__FUNCTION__,__FILE__));
platform_driver_unregister(&s3c2410_rtcdrv);
}
module_init(s3c_rtc_init);
module_exit(s3c_rtc_exit);
MODULE_DESCRIPTION("SamsungS3CRTCDriver");
MODULE_AUTHOR("BenDooks<*************.uk>");
MODULE_LICENSE("GPL");
老路子module_init(exit)platform驱动注册,驱动注册,由于设备和驱动的name
相同,调用驱动的probe初始化硬件:
先说一些头文件:probe会用到的一些变量
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*IhaveyettofindanS3Cimplementationwithmorethanone
*ofthesertcblocksin*/
staticstructresource*s3c_rtc_mem;
staticvoid__iomem*s3c_rtc_base;
staticints3c_rtc_alarmno=NO_IRQ;
staticints3c_rtc_tickno=NO_IRQ;
staticints3c_rtc_freq=1;
staticDEFINE_SPINLOCK(s3c_rtc_pie_lock);
staticunsignedinttick_count;
开始probe:
staticints3c_rtc_probe(structplatform_device*pdev)
{
u8tmp;
structrtc_device*rtc;//定义一个RTC设备
structresource*res;//定义一个资源
intret;
MSG(INFO,("lzf-%s-%sn",__FUNCTION__,__FILE__));
pr_debug("%s:probe=%pn",__FUNCTION__,pdev);
/*findtheIRQs*/
//在系统定义的RTC平台设备中获取TICK节拍时间中断号
s3c_rtc_tickno=platform_get_irq(pdev,1);
if(s3c_rtc_tickno<0){
dev_err(&pdev->dev,"noirqforrtctickn");
return-ENOENT;
}
//在系统定义的RTC平台设备中获取RTC报警中断号
s3c_rtc_alarmno=platform_get_irq(pdev,0);
if(s3c_rtc_alarmno<0){
dev_err(&pdev->dev,"noirqforalarmn");
return-ENOENT;
}
pr_debug("s3c2410_rtc:tickirq%d,alarmirq%dn",
s3c_rtc_tickno,s3c_rtc_alarmno);
/*getthememoryregion*/
//获得RTC的使用的IO端口资源
res=platform_get_resource(pdev,IORESOURCE_MEM,0);
if(res==NULL){
dev_err(&pdev->dev,"failedtogetmemoryregionresourcen");
return-ENOENT;
}
printk("res->start:%xres->end:%xn",res->start,res->end);
//申请RTC的IO端口资源占用的空间
s3c_rtc_mem=request_mem_region(res->start,
res->end-res->start+1,
pdev->name);
if(s3c_rtc_mem==NULL){
dev_err(&pdev->dev,"failedtoreservememoryregionn");
ret=-ENOENT;
gotoerr_nores;
}
//RTC的io端口物理地址映射到编程空间
s3c_rtc_base=ioremap(res->start,res->end-res->start+1);
if(s3c_rtc_base==NULL){
dev_err(&pdev->dev,"failedioremap()n");
ret=-EINVAL;
gotoerr_nomap;
}
/*checktoseeifeverythingissetupcorrectly*/
//这个是重要的函数,对RTC寄存器操作
s3c_rtc_enable(pdev,1);
pr_debug("s3c2410_rtc:RTCCON=%02xn",
readb(s3c_rtc_base+S3C2410_RTCCON));
s3c_rtc_setfreq(s3c_rtc_freq);
/*registerRTCandexit*/
//实时时钟注册
rtc=rtc_device_register("s3c",&pdev->dev,&s3c_rtcops,
THIS_MODULE);
if(IS_ERR(rtc)){
dev_err(&pdev->dev,"cannotattachrtcn");
ret=PTR_ERR(rtc);
gotoerr_nortc;
}
#if!defined(CONFIG_CPU_S3C6400)&&!defined(CONFIG_CPU_S3C6410)
rtc->max_user_freq=128;
#else
rtc->max_user_freq=32768;
#endif
platform_set_drvdata(pdev,rtc);
//下面是实时时钟用IIc的时候初始化的一些东西
#if1
tmp=((1<<4)|(0x3<<0));
iic_write(DS1337_ADDR,0x07,&tmp,1);//fords1307
#endif
tmp=0x18;
iic_write(DS1337_ADDR,0xE,&tmp,1);
iic_read(DS1337_ADDR,0xF,&tmp,1);
tmp|=0x80;
iic_write(DS1337_ADDR,0xF,&tmp,1);
return0;
err_nortc:
s3c_rtc_enable(pdev,0);
iounmap(s3c_rtc_base);
err_nomap:
release_resource(s3c_rtc_mem);
err_nores:
returnret;
}
更多推荐
export_symbol
发布评论