娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月14日(星期六)

2020年06月14日 | s3c2440 省電模式開發(fā)詳解

發(fā)布者:閃耀之星 來源: eefocus關鍵字:s3c2440  省電模式  休眠部分 手機看文章 掃描二維碼
隨時隨地手機看文章

1、源碼包
Kernel:linux-2.6.18.2
Uboot:u-boot-1.1.4
Gcc:arm-linux-gcc-3.4.1.tar.bz2

 

開發(fā)流程及詳細步驟
1、休眠部分

1.電源管理守護進程
省略

 

2.內核接口文件(arch/arm/kernel/apm.c)
電源守護進程通過apm.c的ioctl函數(shù)來使內核開始進入sleep模式。
case APM_IOC_SUSPEND:
        as->suspend_result = -EINTR;
        if (as->suspend_state == SUSPEND_READ) {
               as->suspend_state = SUSPEND_ACKED;
               suspends_pending--;
        } else {
               queue_event(APM_USER_SUSPEND, as);
        }
        if (suspends_pending == 0)
               apm_suspend(); //由此進入sleep
       調用的順序如下:


3.進sleep前的準備工作
A.關閉系統(tǒng)進程(kernel/power/ console.c)
int pm_prepare_console(void) //該函數(shù)使所有系統(tǒng)進程休眠或關閉。
B.關閉外設驅動電源(drivers/base/power/suspend.c)
int device_power_down(pm_message_t state) //該函數(shù)使所有設備驅動sleep

4.進入sleep前的設置(arch/arm/mach-s3c2410/pm.c)
static int s3c2410_pm_enter(suspend_state_t state) //該函數(shù)引導進sleep前的設置

static int s3c2410_pm_enter(suspend_state_t state)
{
unsigned long regs_save[16];
unsigned long tmp;

s3c2410_pm_debug_init(); //sleep中uart不能再用,此函數(shù)實現(xiàn)uart重新初始化用來調試

DBG("s3c2410_pm_enter(%d)n", state); //打印信息

if (state != PM_SUSPEND_MEM) {
        printk(KERN_ERR PFX "error: only PM_SUSPEND_MEM supportedn");
        return -EINVAL;
} //判斷是否是休眠只用ram實現(xiàn),應為該項目不支持硬盤休眠功能。

if (!any_allowed(s3c_irqwake_intmask, s3c_irqwake_intallow) &&
    !any_allowed(s3c_irqwake_eintmask, s3c_irqwake_eintallow)) {
        printk(KERN_ERR PFX "No sources enabled for wake-up!n");
        printk(KERN_ERR PFX "Aborting sleepn");
        return -EINVAL;
} //判斷中斷喚醒是否允許,不允許則不能進入休眠。


s3c2410_pm_check_prepare(); //如果需要在sleep前檢查ram則此函數(shù)會運行,否則此函數(shù)為空,即如果CONFIG_S3C2410_PM_CHECK被定義。


s3c2410_sleep_save_phys = virt_to_phys(regs_save);
//將用來保存系統(tǒng)寄存器的數(shù)組地址轉為物理地址,以供后面調用。
DBG("s3c2410_sleep_save_phys=0x%08lxn", s3c2410_sleep_save_phys); //打印信息
__raw_writel(virt_to_phys(s3c2410_cpu_resume), S3C2410_GSTATUS3);
                             //將系統(tǒng)喚醒時需要調用的函數(shù)地址寫入GSTATUS3寄存器。
DBG("GSTATUS3 0x%08xn", __raw_readl(S3C2410_GSTATUS3)); //打印信息
DBG("GSTATUS4 0x%08xn", __raw_readl(S3C2410_GSTATUS4)); //打印信息

s3c2410_pm_do_save(gpio_save, ARRAY_SIZE(gpio_save));  //保存io口配置狀態(tài)
s3c2410_pm_do_save(irq_save, ARRAY_SIZE(irq_save));      //保存中斷配置狀態(tài)
s3c2410_pm_do_save(core_save, ARRAY_SIZE(core_save));  //保存核心配置狀態(tài)
s3c2410_pm_do_save(uart_save, ARRAY_SIZE(uart_save));    //保存串口配置狀態(tài)

s3c2410_pm_configure_extint(); //配置外部中斷喚醒,使系統(tǒng)休眠中可以按鍵喚醒

DBG("sleep: irq wakeup masks: %08lx,%08lxn",
    s3c_irqwake_intmask, s3c_irqwake_eintmask); //打印信息

__raw_writel(s3c_irqwake_intmask, S3C2410_INTMSK);        //屏蔽系統(tǒng)定義中斷
__raw_writel(s3c_irqwake_eintmask, S3C2410_EINTMASK); //打開外部喚醒中斷

__raw_writel(__raw_readl(S3C2410_EINTPEND), S3C2410_EINTPEND);
//通過寫已經(jīng)被申請的位,將中斷請求寄存器清空

arm920_flush_kern_cache_all(); //清緩沖區(qū)

s3c2410_pm_check_store();//如果需要在sleep前檢查ram則此函數(shù)會運行,否則此函數(shù)為空,即如果CONFIG_S3C2410_PM_CHECK被定義。

__raw_writel(0x00, S3C2410_CLKCON);  //關閉所有外設時鐘

s3c2410_cpu_suspend(regs_save); //調用匯編函數(shù)s3c2410_cpu_suspend 進入sleep。
/************************************************************************/
上為進入休眠部分,下為喚醒部分。
/************************************************************************/
cpu_init(); //CPU初始化

tmp = __raw_readl(S3C2410_GSTATUS2);
tmp &= S3C2410_GSTATUS2_OFFRESET;
__raw_writel(tmp, S3C2410_GSTATUS2); //清除喚醒復位標記

s3c2410_pm_do_restore_core(core_save, ARRAY_SIZE(core_save)); //恢復核心配置
s3c2410_pm_do_restore(gpio_save, ARRAY_SIZE(gpio_save));       //恢復io口配置
s3c2410_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));            //恢復中斷配置
s3c2410_pm_do_restore(uart_save, ARRAY_SIZE(uart_save));         //恢復串口配置

s3c2410_pm_debug_init(); //串口調試函數(shù)初始化

DBG("post sleep: IRQs 0x%08x, 0x%08xn",
    __raw_readl(S3C2410_SRCPND),
    __raw_readl(S3C2410_EINTPEND)); //打印信息

s3c2410_pm_show_resume_irqs(IRQ_EINT0, __raw_readl(S3C2410_SRCPND),
                          s3c_irqwake_intmask); //查看中斷喚醒源信息
s3c2410_pm_show_resume_irqs(IRQ_EINT4-4, __raw_readl(S3C2410_EINTPEND),
                          s3c_irqwake_eintmask); //查看中斷喚醒源信息

DBG("post sleep, preparing to returnn");

s3c2410_pm_check_restore();//如果需要在sleep前檢查ram則此函數(shù)會運行,否則此函數(shù)為空,即如果CONFIG_S3C2410_PM_CHECK被定義。

DBG("S3C2410 PM Resume (post-restore)n");
return 0;
}


5.進休眠前的最后匯編段程序(arch/arm/mach-s3c2410/sleep.s)
ENTRY(s3c2410_cpu_suspend)
stmfd      sp!, { r4 - r12, lr }

@@ store co-processor registers

mrc p15, 0, r4, c15, c1, 0     @ CP access register
mrc p15, 0, r5, c13, c0, 0     @ PID
mrc p15, 0, r6, c3, c0, 0       @ Domain ID
mrc p15, 0, r7, c2, c0, 0       @ translation table base address
mrc p15, 0, r8, c1, c0, 0       @ control register

stmia       r0, { r4 - r13 }

@@ flush the caches to ensure everything is back out to
@@ SDRAM before the core powers down

#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
bl    arm920_flush_kern_cache_all
#endif

@@ prepare cpu to sleep

ldr   r4, =S3C2410_REFRESH
ldr   r5, =S3C24XX_MISCCR
ldr   r6, =S3C2410_CLKCON
ldr   r7, [ r4 ]         @ get REFRESH (and ensure in TLB)
ldr   r8, [ r5 ]         @ get MISCCR (and ensure in TLB)
ldr   r9, [ r6 ]         @ get CLKCON (and ensure in TLB)

orr   r7, r7, #S3C2410_REFRESH_SELF    @ SDRAM sleep command
orr   r8, r8, #(S3C2410_MISCCR_USBSUSPND0 | S3C2410_MISCCR_USBSUSPND1) @suspend usb
orr   r8, r8, #(S3C2400_MISCCR_SPUCR_LDIS | S3C2400_MISCCR_SPUCR_HDIS) @suspend d(0-31)
orr   r8, r8, #S3C2410_MISCCR_SDSLEEP @ SDRAM power-down signals
orr   r9, r9, #S3C2410_CLKCON_POWER    @ power down command

teq   pc, #0                   @ first as a trial-run to load cache
bl    s3c2410_do_sleep
teq   r0, r0                    @ now do it for real
b     s3c2410_do_sleep   @

@@ align next bit of code to cache line
.align      8
s3c2410_do_sleep:
streq       r7, [ r4 ]                @ SDRAM sleep command
    mov r0, #0x1000

1: subs r0, r0, #1          @wait until the SelfRefresh is released
    bne 1b
streq       r8, [ r5 ]                @ SDRAM power-down config
streq       r9, [ r6 ]                @ CPU sleep
1:     beq 1b
mov pc, r14


2、喚醒部分
1、Uboot部分(u-boot-1.1.4/cpu/arm920t/start.s)
reset:
#if 0
mrs r0, cpsr      /* Set the cpu to SVC32 mode */
bic   r0, r0, #0x1f
orr   r0, r0, #0xd3
msr cpsr, r0
#endif

/* disable watchdog timer */
mov r0, #WTCON_BASE
ldr r1, =0x0
str r1, [r0, #oWTCON]
/*
* mask all IRQs by setting all bits in the INTMR - default
*/
mov r0, #INT_BASE
ldr   r1, =0xffffffff
str    r1, [r0, #oINTMSK]

ldr   r1, =0x7ff
str    r1, [r0, #oINTSUBMSK]

mov r0, #CLK_BASE
ldr r1, =0xffffffff
str r1, [r0, #oLOCKTIME]

/* FCLK:HCLK:PCLK */
ldr r1, =0x0
str r1, [r0, #oCAMDIVN]

ldr r1, =_clkdivn
str r1, [r0, #oCLKDIVN]

mrc p15, 0, r1, c1, c0, 0           /* read ctrl register */
orr r1, r1, #0xc0000000           /* Asynchronous */
mcr p15, 0, r1, c1, c0, 0           /* write ctrl register */

/* UPLL setup */
ldr r1, =_upllcon
str r1, [r0, #oUPLLCON]

nop
nop
nop         /* wait until upll has the effect */
nop
nop

/* PLL setup */
ldr r1, =_mpllcon
str r1, [r0, #oMPLLCON]
/* configure memory */
bl    memset
/* Power Manage  Check if this is a wake-up from sleep */
ldr r1, PMST_ADDR
ldr r0, [r1]
@bic r0,r0,#0xfffffffd
tst r0, #(0x02)
bne WakeupStart
WakeupStart:
    /* Clear sleep reset bit */   
    ldr r0, PMST_ADDR
    mov r1, #0x0       @PMST_SMR
    str r1, [r0]
  
    ldr r0, PMCTL1_ADDR  /* Release the SDRAM signal protections */
    ldr r1, =0x00010330
   str r1, [r0]
   
    ldr r0, =0x48000024
    ldr r1, [r0]
    bic r1, r1, #0x400000
    str r1, [r0]
     
   mov r1, #0x1000
1: subs r1, r1, #1 /* wait until the SelfRefresh is released. */
    bne 1b
   
    /* Go... */  
    ldr r0, =0x560000B8 /* read a return address  go to s3c2410_cpu_resume*/
    ldr r1, [r0]
      
    mov pc, r1
    nop
    nop
1: b   1b      /* infinite loop */

[1] [2]
關鍵字:s3c2440  省電模式  休眠部分 引用地址:s3c2440 省電模式開發(fā)詳解

上一篇:基于S3C2440的UART傳輸小結
下一篇:s3c2440串口接收中斷(OK2440III)

推薦閱讀

一年一度的CES?Asia再度揭開帷幕,2018年6月13日至15日,在上海新國際博覽中心CES Asia聚集了來自80多個國家的500多家企業(yè),以“智造,悅享生活”為主題,向大眾展示人工智能、3D打英無人機、無人駕駛、智能家居以及AR/VR等時下熱門技術產(chǎn)品;另外,還有包括、智能穿戴、物聯(lián)網(wǎng)、生活科技等一系列的科技產(chǎn)品匯集。?作為國內領先的手勢識別解決方案提供...
在近期舉行的2019年亞洲消費電子展(CES Asia)展會期間,Stream TV Networks, Inc.(以下簡稱Stream TV)展示了65寸8K裸眼3D電視機,內置8KLCD背光液晶超清屏幕,采用New Seecube 3D光學棱鏡技術,結合裸眼3D多視點渲染及視頻實時轉處理技術,可以幾乎不損失亮度和太多分辨率,并可以實現(xiàn)實時轉換,將2D或3D影像實時轉換為裸眼3D效果。 ...
DMA簡介直接存儲器存取(DMA)用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸。無須CPU干預,數(shù)據(jù)可以通過DMA快速地移動,這就節(jié)省了CPU的資源來做其他操作。換而言之就是當外設有數(shù)據(jù)發(fā)送給mcu,此時可以使用DMA接收到用戶定義空間(不占用cpu),接收完成在產(chǎn)生中斷發(fā)給mcu(才占用CPU)反正一樣。當CPU和DMA同時訪問相同的目標(RAM或外設)...
從蒸汽到內燃機,再到電動機,幾百年的歷史進程中,世界驅動力的升級讓城市運轉的節(jié)奏更快更強,而汽車可以說是城市動力的親歷者和見證者。不過,正如曾經(jīng)每一次變革都會受到來自技術或能源上的阻力一樣,汽車在即將告別化石能源全力擁抱新能源技術,駛向未來駕駛的過程中也面臨著不小的挑戰(zhàn)。“一代正極材料,一代動力電池”,從錳酸鋰到磷酸鐵鋰,再到三...

史海拾趣

問答坊 | AI 解惑

cadence 16.3

bt 種子,16.2 有時候會死機,不知道這個好不好一些,破解同1.62…

查看全部問答∨

WinCE下,wav音頻壓縮問題

設備實現(xiàn)了錄音功能,但是得到的是WAV文件,即是PCM數(shù)據(jù),體積太大了,想壓縮一下,不知道各位有什么高招? 我將PCM壓成ADPCM的,但是效果根本就不行,聽不清了。…

查看全部問答∨

那位高手能提供定時器T2向下計數(shù)的C51程序

我現(xiàn)在用到定時器T2的向下計數(shù)程序,RCAP2H=0x0B;  RCAP2L=0xDC; 系統(tǒng)如何初始化,脈沖如何從T2引腳輸入才能實現(xiàn)向下計數(shù).…

查看全部問答∨

三星2440驅動程序集

三星2440驅動程序集 http://www.itxxh.cn/book/2440/zaxsw1567.shtml…

查看全部問答∨

EVC中SDK卸載和PB中刪除workspace的問題

軟件:evc4、platform builder5.0 問題: 1、在安裝了很多SDK后想卸掉一些不用的,可是卸載并刪除Windows CE Tools\\wce500\\下對應的SDK文件夾后,打開EVC工程后,發(fā)現(xiàn)該SDK選項還在,    如何根除該SDK?下圖是我卸載后X86_320_240仍 ...…

查看全部問答∨

我想做一個安裝文件,用什么工具制作? InstallShield能做WinCE上的安裝盤嗎?(在PC上運行,裝到WinCE上)

我想做一個安裝文件,用什么工具制作? InstallShield能做WinCE上的安裝盤嗎?(在PC上運行,裝到WinCE上)…

查看全部問答∨

【M4學習之一】與TI的FAE聊M3/M4的區(qū)別

昨天成都地區(qū)TI的FAE到我們公司來推廣M4,一樣對我拿到M4開發(fā)板比較震驚,據(jù)說整個中國地區(qū)只有20塊左右,他們培訓完也全部上交了,其實開始拿到M4開發(fā)板,個人覺得和M3比較起來除了外設比較多外其他差別不是太大,但是昨天和FAE聊了一下發(fā)現(xiàn)TI推出 ...…

查看全部問答∨

VHDL語言對2個信號的判斷?

想用FPGA實現(xiàn)一個單道脈沖計數(shù)器,就是記錄脈沖峰值在某兩個電壓之間的脈沖數(shù)。大致思路是用兩個比較器構成雙限比較器。然后把比較器的輸出值值輸入到FGPA。一般的思路是把兩個信號異或,但是由于脈沖不是典型的沖擊信號,上升沿和下降沿不是垂直的 ...…

查看全部問答∨

分立電阻器檢定測試系統(tǒng)的常見誤差來源——熱電動勢及漏電流

熱電動勢 當電路中的不同金屬處于不同溫度時,會形成熱電動勢(EMF)或電壓。為了消除這些不必要的電壓帶來的影響,使用偏置補償電阻測量方法。通常,這個方法在指定的電流源值測量電阻,然后減去電流源設置為零時測得的電阻。當源電流設置為零時 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 东丰县| 江西省| 新化县| 舟山市| 台江县| 诏安县| 阳西县| 如皋市| 嘉鱼县| 桐梓县| 花莲市| 建宁县| 崇仁县| 桂平市| 全州县| 儋州市| 安福县| 淳安县| 富平县| 贵德县| 景泰县| 佛教| 桐城市| 内黄县| 伊通| 霞浦县| 慈溪市| 潼南县| 汾阳市| 内黄县| 墨脱县| 揭西县| 巴彦淖尔市| 红河县| 桓台县| 吐鲁番市| 金阳县| 林芝县| 乌海市| 屯昌县| 孟连|