解压软件-win7依赖服务或组无法启动

export_symbol
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