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 */
上一篇:基于S3C2440的UART傳輸小結
下一篇:s3c2440串口接收中斷(OK2440III)
推薦閱讀
史海拾趣
隨著市場需求的不斷變化和技術的不斷進步,芯旺微電子不斷拓展產(chǎn)品線,覆蓋了從8位到32位不同性能的MCU產(chǎn)品。同時,公司還積極研發(fā)DSP、數(shù)模混合SOC等多元化產(chǎn)品,以滿足不同領域的需求。這些產(chǎn)品的推出不僅豐富了芯旺微電子的產(chǎn)品線,也進一步提升了其在電子行業(yè)中的競爭力。
隨著公司業(yè)務的不斷發(fā)展壯大,ETI Systems開始將目光投向國際市場。公司積極參加國際電子產(chǎn)品展覽和技術交流活動,與來自世界各地的客戶和合作伙伴建立了緊密的聯(lián)系。同時,ETI Systems也加大了在海外市場的投入力度,通過設立分公司和辦事處等方式,進一步拓寬了國際市場渠道。這種國際化戰(zhàn)略的實施,為ETI Systems的持續(xù)發(fā)展注入了新的活力。
ETI Systems深知在電子行業(yè)中,單打獨斗很難取得長遠的發(fā)展。因此,公司積極尋求與行業(yè)內外的合作伙伴建立戰(zhàn)略合作關系。通過與多家知名企業(yè)和研究機構的合作,ETI Systems不僅獲得了寶貴的技術支持,還拓展了市場渠道和客戶資源。這種合作與共贏的伙伴關系,為ETI Systems的快速發(fā)展奠定了堅實的基礎。
隨著萬物互聯(lián)時代的到來,CEVA公司迎來了新的發(fā)展機遇。Wi-Fi 6、Wi-Fi 7、5G-Advanced和蜂窩式物聯(lián)網(wǎng)等技術的快速發(fā)展,推動了客戶對新建置芯片和解決方案的需求。CEVA憑借其在無線連接和智能傳感技術領域的領先地位,能夠為客戶提供全面的解決方案,滿足這些技術在多個終端市場帶來的巨大商機。同時,CEVA也是唯一能夠提供藍牙加上Wi-Fi或UWB加上藍牙等組合解決方案的授權許可商,這一優(yōu)勢使得CEVA在全球半導體產(chǎn)業(yè)中占據(jù)了重要地位。
以上是基于公開資料對CEVA, Inc.在電子行業(yè)中的幾個重要發(fā)展節(jié)點的概述。這些故事展示了CEVA如何在技術創(chuàng)新、市場布局和應對挑戰(zhàn)等方面取得了顯著成就,為公司的持續(xù)發(fā)展奠定了堅實基礎。然而,由于電子行業(yè)的快速發(fā)展和不斷變化的市場環(huán)境,CEVA的未來仍充滿挑戰(zhàn)和機遇。
特斯拉,雖然是一家電動汽車公司,但其在電子行業(yè)的發(fā)展中也展現(xiàn)出了強大的跨界創(chuàng)新能力。特斯拉通過自主研發(fā)和生產(chǎn)電池、電機等核心零部件,成功將電動汽車的性能和品質提升到了新的高度。同時,特斯拉還積極探索自動駕駛、智能交通等前沿技術,不斷推動電動汽車行業(yè)的變革和發(fā)展。特斯拉的跨界創(chuàng)新不僅顛覆了傳統(tǒng)汽車行業(yè)的格局,也為電子行業(yè)帶來了新的機遇和挑戰(zhàn)。
請注意,以上故事框架僅供參考,具體細節(jié)和數(shù)據(jù)可能需要根據(jù)實際情況進行調整和補充。同時,由于篇幅限制,每個故事的字數(shù)可能無法滿足500字以上的要求。
華為,作為中國的科技巨頭,其在電子行業(yè)的發(fā)展歷程中展現(xiàn)出了強大的技術實力和全球視野。華為在通信領域取得了多項技術突破,如5G技術的領先和智能手機拍照技術的創(chuàng)新。同時,華為還積極拓展全球市場,與全球運營商建立了廣泛的合作關系。然而,面對國際市場的復雜環(huán)境和競爭壓力,華為也面臨著諸多挑戰(zhàn)和不確定性。
設備實現(xiàn)了錄音功能,但是得到的是WAV文件,即是PCM數(shù)據(jù),體積太大了,想壓縮一下,不知道各位有什么高招? 我將PCM壓成ADPCM的,但是效果根本就不行,聽不清了。… 查看全部問答∨ |
我現(xiàn)在用到定時器T2的向下計數(shù)程序,RCAP2H=0x0B; RCAP2L=0xDC; 系統(tǒng)如何初始化,脈沖如何從T2引腳輸入才能實現(xiàn)向下計數(shù).… 查看全部問答∨ |
軟件: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上)… 查看全部問答∨ |
昨天成都地區(qū)TI的FAE到我們公司來推廣M4,一樣對我拿到M4開發(fā)板比較震驚,據(jù)說整個中國地區(qū)只有20塊左右,他們培訓完也全部上交了,其實開始拿到M4開發(fā)板,個人覺得和M3比較起來除了外設比較多外其他差別不是太大,但是昨天和FAE聊了一下發(fā)現(xiàn)TI推出 ...… 查看全部問答∨ |
想用FPGA實現(xiàn)一個單道脈沖計數(shù)器,就是記錄脈沖峰值在某兩個電壓之間的脈沖數(shù)。大致思路是用兩個比較器構成雙限比較器。然后把比較器的輸出值值輸入到FGPA。一般的思路是把兩個信號異或,但是由于脈沖不是典型的沖擊信號,上升沿和下降沿不是垂直的 ...… 查看全部問答∨ |
分立電阻器檢定測試系統(tǒng)的常見誤差來源——熱電動勢及漏電流 熱電動勢 當電路中的不同金屬處于不同溫度時,會形成熱電動勢(EMF)或電壓。為了消除這些不必要的電壓帶來的影響,使用偏置補償電阻測量方法。通常,這個方法在指定的電流源值測量電阻,然后減去電流源設置為零時測得的電阻。當源電流設置為零時 ...… 查看全部問答∨ |
設計資源 培訓 開發(fā)板 精華推薦
- 座椅、天窗、電動尾門應用 國產(chǎn)車規(guī)級高壓霍爾效應傳感器推薦
- 突發(fā)!又一車企車機“崩了”
- 寧德時代為陳立泉院士頒發(fā)“卓越貢獻獎”
- 一文速覽吉利雷神 AI 電混 2.0 發(fā)布會重點
- 2025年1-4月ADAS供應商裝機量排行榜:頭部集中與國產(chǎn)突圍并存
- 國內飛行汽車無線通信測試成功,通信安全新突破
- SPAD席卷車載激光雷達市場
- 大聯(lián)大品佳集團推出基于Microchip和ams OSRAM產(chǎn)品的10Base-T1S萬級像素大燈方案
- 哈曼推出采用三星Neo QLED技術的全新顯示屏
- Syntiant推出超低功耗汽車AI創(chuàng)新技術 提升車輛安全性和用戶體驗
- 羅姆有獎直播|從0到1,帶你了解電機及其驅動 開始報名啦~
- 省錢、省心的購買租賃方案,讓您不再為預算煩惱!
- Discover mmWave 走進 TI 毫米波雷達世界 快速獲得設計技能
- 嵌入式Rust修煉營:動手寫串口燒錄工具和MCU例程,Rust達人Hunter直播帶你入門Rust
- EEWorld 芯積分兌換年度回饋來襲~多種賺積分捷徑曝光+禮品兌換劇透
- 有獎直播:艾邁斯歐司朗智慧農(nóng)業(yè)與植物照明
- ADI有獎下載活動之7 可編程邏輯控制器(PLCs)解決方案
- 開發(fā)板芯幣競拍,每日一款!今日競拍開發(fā)板:大黃蜂開發(fā)板
- ADI有獎下載活動之13升級版ADI電機控制解決方案—伺服控制