精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

ARM SCP入門-AP與SCP通信

系統(tǒng) Linux
SCP入門系列就算講完了,有規(guī)范有源碼,有一點(diǎn)缺陷就是沒用qmeu運(yùn)行起來,官方也沒給出,只說用ARM的Fixed Virtual Platform (FVP)能運(yùn)行,不熟悉操作起來估計(jì)有點(diǎn)費(fèi)勁對PC要求也高,這個SCP也比較小眾在大規(guī)模的SoC上才有應(yīng)用,提出的挺早但是應(yīng)用的還是不多。

SoC上有很多核,ATF和Linux占據(jù)了A核,SCP占據(jù)了一個M核,當(dāng)遇到Linux沒有權(quán)限的事情的時候(SMC進(jìn)入EL3轉(zhuǎn)PSCI協(xié)議,例如電源管理),就需要給SCP打報(bào)告,SCP審批完批條子后去執(zhí)行。這其中涉及到了異構(gòu)核間通信,估計(jì)第一時間會想到mailbox,不過mailbox算是一個傳輸層,面向的是bit位數(shù)據(jù)的傳輸,可以把這些傳輸數(shù)據(jù)組織成一個協(xié)議層,在AP與SCP的核間通信中那就是SCMI。

1. SMC系統(tǒng)調(diào)用與PSCI協(xié)議

圖片圖片

    當(dāng)Linux想要關(guān)機(jī)或者休眠的時候,這涉及到整個系統(tǒng)電源狀態(tài)的變化,為了安全性Linux內(nèi)核沒有權(quán)利去直接執(zhí)行了,需要陷入到EL3等級去執(zhí)行,可以參考之前文章ARM ATF入門-安全固件軟件介紹和代碼運(yùn)行,在EL3中處理的程序是BL31,把SMC系統(tǒng)調(diào)用的參數(shù)轉(zhuǎn)化為PSCI協(xié)議去執(zhí)行,這時如果有SCP那A核就憋屈了,自己沒權(quán)利執(zhí)行需要通過SCMI協(xié)議上報(bào)給SCP了。這就是整個過程的軟件協(xié)議棧如上圖中:

  • 用戶層:首先用戶發(fā)起的一些操作,通過用戶空間的各service處理,會經(jīng)過內(nèi)核提供的sysfs,操作cpu hotplug、device pm、EAS、IPA等。
  • 內(nèi)核層:在linux內(nèi)核中,EAS(energy aware scheduling)通過感知到當(dāng)前的負(fù)載及相應(yīng)的功耗,經(jīng)過cpu idle、cpu dvfs及調(diào)度選擇idle等級、cpu頻率及大核或者小核上運(yùn)行。IPA(intrlligent power allocation)經(jīng)過與EAS的交互,做熱相關(guān)的管理。
  • ATF層:Linux kernel中發(fā)起的操作,會經(jīng)過電源狀態(tài)協(xié)調(diào)接口(Power State Coordination Interface,簡稱PSCI),由操作系統(tǒng)無關(guān)的framework(ARM Trusted Firmware,簡稱ATF)做相關(guān)的處理后,通過系統(tǒng)控制與管理接口(System Control and Management Interface,簡稱SCMI),向系統(tǒng)控制處理器(system control processor,簡稱SCP)發(fā)起低功耗操作。
  • SCP層:SCP(系統(tǒng)控制處理器system control processor)最終會控制芯片上的sensor、clock、power domain、及板級的pmic做低功耗相關(guān)的處理。

總結(jié):用戶進(jìn)程 --sysfs--> 內(nèi)核(EAS、IPA)--PSCI--> ATF --SCMI-->SCP --LPI--> 功耗輸出器件

1.1 SMC指令

    上面看完有一個整體的認(rèn)識,下面進(jìn)入正題,先介紹下什么是SMC指令,為什么走SMC就是安全通道,Linux直接給SCP通信就是非安全通道,這兩種通道怎么去區(qū)分?

    首先看SMC規(guī)范,ARM官方文檔地址:

https://developer.arm.com/documentation/den0028/latest

《DEN0028E_SMC_Calling_Convention_1.4》本文檔定義了一種通用的調(diào)用機(jī)制,可與Armv7和Armv8架構(gòu)中的安全監(jiān)視器調(diào)用(SMC)和系統(tǒng)監(jiān)控程序調(diào)用(HVC)指令一起使用。

SMC指令用于生成一個同步異常,該異常由運(yùn)行在EL3中的安全監(jiān)視器代碼處理。參數(shù)和返回值將在寄存器中傳遞。在由安全監(jiān)視器處理之后,由指令產(chǎn)生的調(diào)用可以傳遞到受信任的操作系統(tǒng)或安全軟件堆棧中的其他實(shí)體。

    HVC指令用于生成由在EL2中運(yùn)行的管理程序處理的同步異常。參數(shù)和返回值將在寄存器中傳遞。管理程序還可以捕獲由客戶操作系統(tǒng)(在EL1)發(fā)出的SMC調(diào)用,這允許適當(dāng)?shù)啬M、傳遞或拒絕調(diào)用。

    本規(guī)范旨在簡化集成和減少軟件層之間的碎片化,例如操作系統(tǒng)、系統(tǒng)管理程序、受信任的操作系統(tǒng)、安全監(jiān)視器和系統(tǒng)固件。具體的各種定義可以自己看手冊,我們在Linux代碼中執(zhí)行smc調(diào)用的時候的函數(shù)例如關(guān)機(jī)為:

#define PSCI_0_2_FN_BASE   0x84000000
#define PSCI_0_2_FN(n) (PSCI_0_2_FN_BASE + (n))
#define PSCI_0_2_FN_SYSTEM_OFF PSCI_0_2_FN(8)
static void psci_sys_poweroff(void)
{
  invoke_psci_fn(PSCI_0_2_FN_SYSTEM_OFF, 0, 0, 0);
}

PSCI_0_2_FN_SYSTEM_OFF的值計(jì)算為:0x84000000+8,在規(guī)范的表6-2:分配給不同服務(wù)的功能標(biāo)識符的子范圍中,

圖片圖片

    表中的各種功能就是走安全通道的,不是SMC或者HVC命令的功能就是非安全通道的,當(dāng)然也可以根據(jù)自己的需求選擇,一般PSCI協(xié)議中的功能都是走安全通道。

1.2 PSCI協(xié)議

PSCI協(xié)議官方地址:

https://developer.arm.com/documentation/den0022/d/

《Power_State_Coordination_Interface_PDD_v1_1_DEN0022D》

    本文檔定義了一個電源管理的標(biāo)準(zhǔn)接口,操作系統(tǒng)供應(yīng)商可用于在ARM設(shè)備上使用不同特權(quán)級別的監(jiān)控軟件。該接口旨在在以下電源管理場景中代碼通用化:

  • 內(nèi)核空閑管理。
  • 動態(tài)添加和刪除核心,以及輔助核心引導(dǎo)。
  • 系統(tǒng)關(guān)閉和復(fù)位。

該接口不包括動態(tài)電壓和頻率縮放(DVFS)或設(shè)備電源管理(例如,對圖形處理器等外設(shè)的管理)。

為什么需要PSCI?

    具有電源管理感知的操作系統(tǒng)動態(tài)地改變核心的電源狀態(tài),平衡可用的計(jì)算容量以匹配當(dāng)前的工作負(fù)載,同時努力使用最小的功率量。其中一些技術(shù)可以動態(tài)地打開和關(guān)閉內(nèi)核,或?qū)⑺鼈冎糜陟o止?fàn)顟B(tài),在靜止?fàn)顟B(tài)下它們不再執(zhí)行計(jì)算。這意味著它們消耗的能量很少。這些技術(shù)的主要例子是:

  • 空閑管理:當(dāng)操作系統(tǒng)中的內(nèi)核在核心上沒有線程可以調(diào)度時,它會將該核心置于時鐘門控、保留狀態(tài),甚至是完全電源門控狀態(tài)。然而,該核心仍然可用于操作系統(tǒng)。
  • 熱插拔:當(dāng)計(jì)算需求低時,核心會物理關(guān)閉,當(dāng)需求增加時恢復(fù)在線。該操作系統(tǒng)將遷移所有遠(yuǎn)離離線的核心的中斷和線程,并在它們重新聯(lián)機(jī)時重新平衡負(fù)載。

具體包含那些功能,可以自己去看規(guī)范文檔,這里截圖算個記錄:

圖片圖片

比如關(guān)機(jī)就是5.10里面的內(nèi)容。

2. SCMI協(xié)議

    現(xiàn)在繼續(xù)聊SCP里面的東西,上來就是SCMI協(xié)議,同樣還是去ARM官網(wǎng)找:

《DEN0056B_System_Control_and_Management_Interface_v2_0》

這個協(xié)議在哪里用到,我們來看一個圖:

圖片圖片

    SCP會以服務(wù)的方式來支持AP參與運(yùn)行管理,這也就需要SCP和AP之間有一個通信接口。這個通信接口在硬件上可以通過共享存儲和MHU(Message Handling Unit)實(shí)現(xiàn);在軟件上,通過定義一組通信協(xié)議來實(shí)現(xiàn)。

主要涉及的模塊如下:

  • mhu模塊:Message Handling Unit (MHU)在module/mhu/src/mod_mhu.c中實(shí)現(xiàn)
  • msg_smt模塊:Shared Memory Transport 是一種用于描述系統(tǒng)內(nèi)存拓?fù)涞臄?shù)據(jù)結(jié)構(gòu)。在ARM 架構(gòu)中,SCP 固件使用 Shared Memory Transport來提供有關(guān)系統(tǒng)內(nèi)存的信息,如地址范圍、類型、屬性等。System Memory Tables 通常由系統(tǒng)固件在啟動過程中生成,并由SCP 固件和其他系統(tǒng)組件使用。它們允許系統(tǒng)軟件了解和管理系統(tǒng)中可用的內(nèi)存資源。
  • SCMI模塊:System Control & Management Interface (SCMI)
  • 業(yè)務(wù)處理模塊,為scmi protocol模塊例如scmi_power_domain

    SCMI抽象出協(xié)議和傳輸兩層,協(xié)議層描述能夠支持的命令,傳輸層定義了命令通過什么方式傳輸,發(fā)送命令方稱為agent。有個限制,每個agent的傳輸通道必須一個或者多個,然后如果有安全需求,那安全AP必須使用安全的通道進(jìn)行傳輸數(shù)據(jù)。

圖片圖片

協(xié)議層:

  • 通道(channel)必須是分開獨(dú)立的,各個agent不能使用同一個。避免platform無法識別message對應(yīng)方
  • agent必須是獨(dú)立的操作系統(tǒng)
  • 通道支持雙向通訊,另外也能夠支持中斷、polling兩種方式,讓agent選擇

從agent到platform的消息分為兩種,同步和異步,為A2P通道:

  • 同步(synchronous),agent返回的時候?qū)?yīng)的platform操作就已經(jīng)完成了。platform返回操作結(jié)果命令也是通過agent到platform的通道,同一個通道完成這些操作
  • 異步(asynchronoous),當(dāng)platform完成后,會發(fā)送 delayed response給到agent告知對方工作完成,這是P2A通道。agent發(fā)送完消息后,立馬得到platform的返回,然后釋放通道繼續(xù)做下一次傳輸

SCMI協(xié)議的整體應(yīng)用框圖,從SCMI規(guī)范截圖如下:

圖片圖片

scmi transport,channel,agent的對應(yīng)關(guān)系:

1. 一個scp可以有多個agent,agent是運(yùn)行在操作系統(tǒng),安全固件的軟件或者一個使用scmi協(xié)議的設(shè)備。例如juno有如下代理,0保留給平臺。

enum  juno_scmi_agent_idx {
     /* 0 is reserved for the platform  */
     JUNO_SCMI_AGENT_IDX_OSPM = 1,
     JUNO_SCMI_AGENT_IDX_PSCI,
     JUNO_SCMI_AGENT_IDX_COUNT,
 };

2. transport定義了scmi協(xié)議如何傳輸。比如shared memory。一個agent可以有多個A2P或P2A channel,channel是雙向的,但是協(xié)議發(fā)起者(主)-接收者(從)關(guān)系是固定的。故若要使能通知功能,除了一個A2P channel外,還需要一個P2A channel分配給這個agent.

SCMI協(xié)議的message header定義如下,對應(yīng)代碼module/scmi/include/mod_scmi_std.h中定義

圖片圖片

[protocol_id]:

圖片圖片

[message id]:

message id是二級功能區(qū)分id算cmd,例如設(shè)置狀態(tài)、獲取狀態(tài)等具體操作。如果有新增的協(xié)議,那里面0/1/2這三個message都必須按照協(xié)議走。

圖片圖片

[message type]:

Commands 的message type都是0。對于不支持的協(xié)議和message類型,platform都要回復(fù) NOT_SUPPORTED

Delayed responses 類型都是2

Notifications 為3

傳輸層:

    傳輸層文檔也就定義了一種方式,mailbox方式(核間通訊的一種ip)。這種通訊的前提是系統(tǒng)能夠在agents和platform之間存在共享內(nèi)存(ddr和片上flash都行,最好是片上flash)。mailebox能夠完美支持前面提到的通道的需求,中斷、內(nèi)存和完成中斷等都能夠,而且是軟件可操控。比如下面流程指出的中斷和polling方式:

圖片圖片

mailbox通訊怎么定義在flash里面的layout:

圖片圖片

 3. Agent scmi消息處理流程

    這里我們以一個protocol_id為0x11的power domain控制消息為例子進(jìn)行說明:

圖片圖片

scp中scmi消息處理時序圖

1) mhu模塊-中斷產(chǎn)生:scmi底層硬件對應(yīng)的模塊是mhu模塊,當(dāng)硬件收到agent的消息時候會產(chǎn)生中斷,中斷處理函數(shù)為mhu_isr。在該函數(shù)中通過中斷源查表獲取對應(yīng)的設(shè)備和smt channel。然后調(diào)用transport模塊的api(調(diào)用transport_channel->api->signal_message(transport_channel->id);)發(fā)送消息。

2)transport模塊-獲取通道上下文:signal_message api中通過channel id獲取channel上下文信息,檢查通道是否ready和locked,調(diào)用scmi模塊的api 處理(channel_ctx->scmi_api->signal_message(channel_ctx->scmi_service_id);)。

3) scmi模塊-產(chǎn)生處理事件:

?scmi的api函數(shù)signal_message中將該消息封裝成事件,通過fwk_put_event發(fā)送一個fwk_event_light。(事件中source_id為scmi模塊,.target_id 為上一級smt 中channel_ctx->scmi_service_id,也是scmi。所以讓該事件是自己發(fā)給自己的)。因?yàn)閑vent有隊(duì)列,中斷調(diào)用的api是實(shí)時的。在scmi的.process_event回調(diào)函數(shù)中處理上面的事件。

?首先通過scmi維護(hù)的scmi_ctx.service_ctx_table獲取transport信息找到transport_api(msg_smt模塊提供),然后讀出scmi消息的頭部(scmi_protocol_id、scmi_message_id、scmi_message_type、scmi_token)。

?然后通過get_agent_id(event->target_id, &agent_id)獲取該scmi 協(xié)議的agent_id(OSPM、PSCI等),根據(jù)agent_id獲取到agent_type(psci、ospi等)。

?最后根據(jù)scmi_protocol_id找到protocol(例如0x11是power domain處理),調(diào)用protocol->message_handler(protocol->id, event->target_id,payload, payload_size, ctx->scmi_message_id)執(zhí)行相對應(yīng)的protocol的消息處理函數(shù)。message_handler函數(shù)執(zhí)行到了scmi_power_domain模塊。

4)scmi_power_domain模塊-解析scmi消息:.message_handle函數(shù)對消息進(jìn)行檢驗(yàn),將進(jìn)行權(quán)限判斷,然后查表調(diào)用具體的消息處理函數(shù)handler_table[message_id](service_id, payload)。例如scmi_protocol_id為scmi_power_domain,scmi_message_type為MOD_SCMI_PD_POWER_STATE_SET,則處理函數(shù)為scmi_pd_power_state_set_handler。該函數(shù)中將會進(jìn)行策略判斷(大多數(shù)模塊為空),然后調(diào)用scmi_pd_ctx.pd_api->set_state(pd_id, pd_power_state)進(jìn)行power domain的set,pd_api對應(yīng)power_domain模塊中對外api函數(shù)。

5)power_domain模塊-調(diào)用driver處理:power_domain模塊的api set_state函數(shù)先組裝了一個event發(fā)給pd_id,也就是自己。pd_process_event()函數(shù)進(jìn)行處理,process_set_state_request()按照pd的樹形結(jié)構(gòu)對狀態(tài)進(jìn)行設(shè)置,然后調(diào)用initiate_power_state_transition()執(zhí)行status = pd->driver_api->set_state(pd->driver_id, state);更新pd的狀態(tài),并拿到執(zhí)行結(jié)果status 。這里driver_api是在product/juno/scp_ramfw/config_power_domain.c的struct fwk_element element_table變量中定義,可以看到為FWK_MODULE_IDX_JUNO_PPU中提供

6) juno_ppu模塊-寄存器設(shè)置:根據(jù)ppu_id拿到ppu的上下文ppu_ctx,按照傳入的state值(on或者off)執(zhí)行status = ppu_set_state_and_wait(ppu_ctx, mode);最后執(zhí)行reg->POWER_POLICY = (uint32_t)mode;進(jìn)行寄存器設(shè)置生效。

7) scmi_power_domain模塊-返回結(jié)果:最后調(diào)用scmi_pd_ctx.scmi_api->respond(service_id, &return_values,....)到scmi 模塊。

8) scmi模塊:scmi中api的respond函數(shù)將會通過service_id查表service_ctx_table獲取transport信息,然后調(diào)用ctx->respond(ctx->transport_id, payload, size),為msg_smt模塊中respond api()(注transport_id在config_scmi.c 中配置。指定transport為smt模塊+smt內(nèi)的具體channel element元素))。

9)transport模塊:msg_smt模塊中的respond api為smt_respond()函數(shù)。通過上一級傳入的transport_id/channel_id的element_idx部分,查表smt_ctx.channel_ctx_table獲取channel消息。  然后填充Shared Memory,并調(diào)用channel_ctx->driver_api->raise_interrupt(channel_ctx->driver_id)產(chǎn)生中斷,通知agent。

10.)mhu模塊產(chǎn)生中斷:raise_interrupt()函數(shù)中,根據(jù)slot_id找到設(shè)備上下文,然后對寄存器進(jìn)行設(shè)置reg->SET |= (1U << slot);。

從上面可以看到,scmi的處理流程基本是通用的,涉及到不同平臺的就是最后硬件的設(shè)置,需要新建一個juno_ppu模塊-寄存器設(shè)置,及其配置文件。

SCP中scmi協(xié)議處理:

    系統(tǒng)支持兩種agent:PSCI和OSPM,發(fā)來的SCMI消息根據(jù)protocol_id進(jìn)行分類,然后根據(jù)message_id子命令找到合適的處理函數(shù),最后根據(jù)message_type決定是否進(jìn)行回復(fù)。    關(guān)于SCMI協(xié)議的一些參數(shù)定義可以參考代碼:

module/scmi/include/mod_scmi_std.h

    例如上面我們介紹過0x11 power domain,其他的處理過程相似可以通過下面表速查到相關(guān)模塊,從模塊的static int (*handler_table中根據(jù)message_id下標(biāo)迅速找到處理函數(shù):

protocol_id

描述

涉及模塊及處理代碼

0x10

Base protocol

module/scmi/src/mod_scmi_base.c

0x11

Power domain management protocol

module/scmi_power_domain/src/mod_scmi_power_domain.c

0x12

System power management protocol

module/scmi_system_power/src/mod_scmi_system_power.c

0x13

Performance domain management protocol

module/scmi_perf/src/mod_scmi_perf.c

0x14

Clock management protocol

module/scmi_clock/src/mod_scmi_clock.c

0x15

Sensor management protocol

module/scmi_sensor/src/mod_scmi_sensor.c

0x16

Reset domain management protocol

module/scmi_reset_domain/src/mod_scmi_reset_domain.c

0x17

Voltage domain management protocol

module/scmi_voltage_domain/src/mod_scmi_voltage_domain.c

0x18

Power capping and monitoring protocol

不支持

0x19

Pin Control protocol

不支持

4. PPU的電源控制

0x11

Power domain management protocol

module/scmi_power_domain/src/mod_scmi_power_domain.c

0x12

System power management protocol

module/scmi_system_power/src/mod_scmi_system_power.c

0x11 pd,0x12 system是通過power domain模塊,然后到PPU模塊進(jìn)行電源控制的。關(guān)于PPU可以去PCSA規(guī)范中查看,PPU是一個硬件模塊,SCP通過PPU去控制具體的時鐘、電源等硬件。PPU類型如下所示:

enum  mod_pd_type {
     MOD_PD_TYPE_CORE,
     MOD_PD_TYPE_CLUSTER,
     MOD_PD_TYPE_DEVICE,
     MOD_PD_TYPE_DEVICE_DEBUG,
     MOD_PD_TYPE_SYSTEM,
     MOD_PD_TYPE_COUNT
 };

這里舉例CPU COER的電源硬件控制,其他的自己看代碼。

MOD_PD_TYPE_CORE的處理api為core_pd_driver_api,如下:

static  const struct mod_pd_driver_api core_pd_driver_api = {
     .set_state = core_set_state,
     .get_state = pd_get_state,
     .reset = core_reset,
     .prepare_core_for_system_suspend =  core_prepare_core_for_system_suspend,
 };

core_set_state:

首先根據(jù)ppu_id拿到上下文參數(shù)(config_juno_ppu.c中定義),然后根據(jù)要設(shè)置的state進(jìn)行分開處理:

static  int core_set_state(fwk_id_t ppu_id, unsigned int state) {
     get_ctx(ppu_id, &ppu_ctx);
     dev_config = ppu_ctx->config;
    
     mode = pd_state_to_ppu_mode[state];
     switch ((enum mod_pd_state)state) {
     case MOD_PD_STATE_OFF:
         //設(shè)置PPU狀態(tài),并等待生效
         status =  ppu_set_state_and_wait(ppu_ctx, mode);
         //清空這個PPU對應(yīng)的中斷消息
         status =  clear_pending_wakeup_irq(dev_config);
         //關(guān)閉這個PPU對應(yīng)的中斷消息
         status =  disable_wakeup_irq(dev_config);
         //關(guān)閉軟重啟中斷消息
         status =  fwk_interrupt_disable(dev_config->warm_reset_irq);
         break;
 
     case MOD_PD_STATE_SLEEP:
         status =  ppu_set_state_and_wait(ppu_ctx, mode);
         status =  clear_pending_wakeup_irq(dev_config);
         status = enable_wakeup_irq(dev_config);
         status =  fwk_interrupt_disable(dev_config->warm_reset_irq);
         break;
 
     case MOD_PD_STATE_ON:
         status =  fwk_interrupt_clear_pending(dev_config->warm_reset_irq);
         status =  fwk_interrupt_enable(dev_config->warm_reset_irq);
         status =  ppu_set_state_and_wait(ppu_ctx, mode);
         break;
 
     default:
         fwk_unexpected();
         status = FWK_E_PANIC;
         break;
     }
 
     //power_domain模塊中api調(diào)用,對這個pd進(jìn)行訂閱的模塊會收到電源變化通知
     status = ppu_ctx->pd_api->report_power_state_transition(ppu_ctx->bound_id,
         state);
 
     return FWK_SUCCESS;
 }·

ppu_set_state_and_wait(ppu_ctx, mode);中設(shè)置PPU的mode,首先mode的轉(zhuǎn)化如下:

static  enum ppu_mode pd_state_to_ppu_mode[] = {
     [MOD_PD_STATE_OFF]  = PPU_MODE_OFF,
     [MOD_PD_STATE_SLEEP]  = PPU_MODE_OFF,
     [MOD_PD_STATE_ON]  = PPU_MODE_ON,
     [MOD_SYSTEM_POWER_POWER_STATE_SLEEP0]  = PPU_MODE_MEM_RET,
 };

ppu_set_state_and_wait()函數(shù)中,對于mode的設(shè)置:

static int ppu_set_state_and_wait(struct  ppu_ctx *ppu_ctx, enum  ppu_mode mode)
 {
     //對寄存器進(jìn)行設(shè)置
     reg = ppu_ctx->reg;
     reg->POWER_POLICY =  (uint32_t)mode;
    
     //根據(jù)配置信息等待PPU設(shè)置完成
     dev_config = ppu_ctx->config;
     params.mode = mode;
     params.reg = reg;
     if (fwk_id_is_equal(dev_config->timer_id,  FWK_ID_NONE)) {
         /* Wait for the PPU to set */
         while  (!set_power_status_check(?ms)) {
             continue;
         }
     }

對于中斷的控制通過framework/src/fwk_interrupt.c中對外函數(shù)

int  fwk_interrupt_disable(unsigned int interrupt)
 {
     if (!initialized) {
         return FWK_E_INIT;
     }
 
     return  fwk_interrupt_driver->disable(interrupt);
 }

fwk_interrupt_driver在arch/arm/arm-m/src/arch_nvic.c中實(shí)現(xiàn):

static  int disable(unsigned int interrupt)
 {
     if (interrupt >= irq_count) {
         return FWK_E_PARAM;
     }
 
     NVIC_DisableIRQ((enum  IRQn)interrupt);
 
     return FWK_SUCCESS;
 }
 
 __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
 {
   if ((int32_t)(IRQn) >= 0)
   {
     NVIC->ICER[(((uint32_t)IRQn)  >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
     __DSB();
     __ISB();
   }
 }

對硬件寄存器進(jìn)行了設(shè)置。

其他:

    SCP入門系列就算講完了,有規(guī)范有源碼,有一點(diǎn)缺陷就是沒用qmeu運(yùn)行起來,官方也沒給出,只說用ARM的Fixed Virtual Platform (FVP)能運(yùn)行,不熟悉操作起來估計(jì)有點(diǎn)費(fèi)勁對PC要求也高,這個SCP也比較小眾在大規(guī)模的SoC上才有應(yīng)用,提出的挺早但是應(yīng)用的還是不多。其實(shí)找一個qemu支持的板子,把代碼改一改應(yīng)該也能運(yùn)行起來,有興趣的可以自己嘗試下。

本文轉(zhuǎn)載自微信公眾號「OS與AUTOSAR研究」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系公眾號。

責(zé)任編輯:武曉燕 來源: OS與AUTOSAR研究
相關(guān)推薦

2009-11-18 09:28:44

linuxscp命令

2013-12-13 11:04:36

命令scp

2009-12-14 11:08:07

Linux scp

2009-11-23 11:51:07

linuxscp

2020-09-03 13:20:17

scprsync遷移指南

2010-03-08 10:49:29

Linux scp命令

2022-02-26 08:39:09

LinuxScp命令

2010-12-24 10:25:20

SCP 命令

2010-04-27 15:08:01

2009-09-07 09:27:18

scpLinux主機(jī)復(fù)制

2013-04-09 15:06:23

2022-05-31 10:38:50

Linux密碼scp

2023-12-26 15:19:46

數(shù)據(jù)中心運(yùn)維

2018-01-30 17:00:10

Linuxscp命令排除文件

2011-03-25 09:35:07

2022-12-25 10:09:44

2020-04-26 14:25:56

目錄Linux操作系統(tǒng)

2024-10-14 14:34:11

2024-11-11 14:43:11

2019-12-13 10:42:03

LinuxSCP命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

欧美自拍第一页| 超薄肉色丝袜一二三| 日韩精品卡一| 99精品久久久久久| 人体精品一二三区| 亚洲怡红院在线观看| 国产精品调教| 在线观看成人免费视频| japanese在线播放| 可以直接在线观看的av| 激情五月婷婷综合网| 97精品一区二区三区| 国产综合精品久久久久成人av| 亚洲tv在线| 亚洲成人精品影院| 四虎永久国产精品| 二区三区在线视频| 午夜在线视频观看| 免费影视亚洲| 国产日本一区二区| 国产精品久久精品国产| 中文字字幕在线中文乱码| 日韩香蕉视频| 九色精品美女在线| 亚洲av熟女国产一区二区性色| 综合中文字幕| 欧美日韩精品二区第二页| 亚洲不卡中文字幕无码| 在线观看的网站你懂的| 欧美韩国日本不卡| 久久久久国产精品视频| www三级免费| 精品一区二区三区在线视频| 欧洲亚洲免费在线| 日韩免费观看一区二区| 欧美精品日韩| 久久精品视频中文字幕| 九一在线免费观看| 免费电影一区二区三区| 亚洲第一精品电影| 激情小说欧美色图| 国产精品视频首页| 欧美日本国产视频| 性欧美videossex精品| 中文字幕高清在线播放| 午夜精品成人在线| 国产爆乳无码一区二区麻豆| 日韩专区在线| 亚洲国产精华液网站w| 欧美成人dvd在线视频| 亚洲精品视频专区| 国产v日产∨综合v精品视频| 1区1区3区4区产品乱码芒果精品| 中文字幕码精品视频网站| 日本不卡一区二区三区高清视频| 欧美与欧洲交xxxx免费观看| 国产精品午夜影院| 亚洲影院在线| 国产成人精品电影久久久| 久久久久久久久久久久久久av| 亚洲精品视频啊美女在线直播| 久久久国产视频| 亚洲天堂成人在线视频| 亚洲精品久久久久久| 日韩一级淫片| 日韩欧美国产成人一区二区| 一级日本黄色片| 日韩一区网站| 欧美成人精品1314www| 亚洲妇女无套内射精| 视频二区欧美| 日韩av网站在线| 亚洲天堂久久新| jvid福利在线一区二区| 日韩在线视频网站| 国产成人自拍网站| 韩国亚洲精品| 青青青国产精品一区二区| 波多野结衣不卡| 精品一区二区成人精品| 99九九视频| 天堂中文字幕在线| 国产婷婷色一区二区三区| 一区二区精品在线观看| 青青青草视频在线| 欧美日韩一区二区免费视频| 黄色免费网址大全| 日韩精品成人| 国产婷婷97碰碰久久人人蜜臀 | 九色porny视频在线观看| 精品高清一区二区三区| 国产又黄又猛又粗又爽的视频| 亚洲精品自拍| 亚洲电影免费观看高清完整版在线观看| 亚洲最大的黄色网| 欧洲乱码伦视频免费| 欧美乱妇40p| 一级黄色免费网站| 黑人巨大精品欧美一区| 精品国产一区二区三区四区vr | 日本一区二区三区四区| 欧美日韩dvd| 最近高清中文在线字幕在线观看1| 欧美日韩在线三级| 亚洲久久久久久| 91亚洲一区| 97成人精品视频在线观看| 在线观看免费高清视频| jlzzjlzz亚洲日本少妇| 在线不卡视频一区二区| 三级中文字幕在线观看| 制服丝袜亚洲网站| 蜜桃av免费看| 欧美激情视频一区二区三区在线播放 | 在线观看视频一区二区欧美日韩| 不卡的一区二区| 国产欧美日韩影院| 久久久视频精品| 国产精品福利电影| 久久久av毛片精品| 久久精品xxx| 免费一级欧美在线观看视频| 国产丝袜一区二区三区| 99免费在线观看| 国产一区二区三区av电影| 日韩精品无码一区二区三区| 精精国产xxxx视频在线播放| 日韩欧美中文一区| 日本爱爱小视频| 美女精品网站| 精品欧美国产| av资源网在线播放| 日韩女优制服丝袜电影| 亚洲人与黑人屁股眼交| 日韩国产欧美三级| 欧美精品欧美精品| 嗯啊主人调教在线播放视频| 日韩三级免费观看| 欧美高清视频一区二区三区| 久久精品72免费观看| 亚洲高清视频一区| 国产一区二区精品调教| 亚洲精选在线观看| 亚洲第一在线播放| av不卡一区二区三区| av在线免费观看国产| 精品视频在线观看网站| 久久精品国产免费观看| 国产一区二区三区黄片| 中文字幕一区二区在线观看| 美女少妇一区二区| 成人在线视频免费观看| 国产精品美女主播| aaa在线免费观看| 欧美唯美清纯偷拍| 欧美日韩中文字幕视频| 日韩电影在线免费看| 性刺激综合网| 性欧美video另类hd尤物| www.日本久久久久com.| 国产熟女一区二区丰满| 樱桃国产成人精品视频| 久久久无码人妻精品无码| 亚洲私人影院| 国产精品一区二区在线观看| a级片在线免费| 日韩电视剧在线观看免费网站| 国产精品500部| 久久久99精品免费观看| 亚洲欧美日韩综合网| 999国产精品永久免费视频app| 91免费人成网站在线观看18| 亚洲区欧洲区| 亚洲国产精品成人精品| 免费无码国产精品| 国产精品毛片大码女人| 亚洲一级片免费观看| 禁久久精品乱码| 免费国产一区二区| 国产在视频一区二区三区吞精| 久久久精品亚洲| 欧美性受xxxx狂喷水| 一本色道亚洲精品aⅴ| 国精产品视频一二二区| 国产一区二区三区蝌蚪| 国产av天堂无码一区二区三区| 一区二区三区视频免费观看| 国产色视频一区| 国产精品一品| 亚洲品质视频自拍网| 国产伦精品一区二区三区免.费| 亚洲午夜av在线| 精品无码人妻一区二区免费蜜桃| 激情都市一区二区| 各处沟厕大尺度偷拍女厕嘘嘘| 欧美精品一区二区三区中文字幕| 91丝袜美腿美女视频网站| 欧美大胆a人体大胆做受| 中文字幕亚洲精品| 六月婷婷中文字幕| 欧美在线不卡视频| 精品少妇久久久| 中文一区二区在线观看| 亚洲欧美日韩偷拍| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品国三级国产av| 视频一区中文| 国产欧美日韩一区| 人人精品久久| 国产91色在线|免| 超碰在线免费播放| 永久免费看mv网站入口亚洲| 亚洲第一色网站| 欧美久久久久久蜜桃| 国产一区二区99| 夜夜夜精品看看| 日本伦理一区二区三区| 久久久一区二区三区捆绑**| 美女露出粉嫩尿囗让男人桶| 久久激情五月激情| 无码无遮挡又大又爽又黄的视频| 欧美网站在线| 欧美xxxx吸乳| 成人嘿咻视频免费看| 久久99精品久久久久久水蜜桃| 国产精品一区免费在线| 国产一区二区丝袜高跟鞋图片| 在线看的毛片| 午夜精品久久久久久久99热| 日本精品600av| 久久久精品视频成人| 97电影在线看视频| 亚洲天堂成人在线| 可以免费看污视频的网站在线| 欧美精品一区二区三区高清aⅴ | 国产精品91xxx| 色播五月综合网| 日韩av中文在线观看| 欧美aⅴ在线观看| 国产精品日韩久久久| 青草青青在线视频| 亚洲二区在线| 欧美视频在线观看网站| 亚洲国产精品第一区二区三区| 四虎永久免费网站| 91tv精品福利国产在线观看| 宅男一区二区三区| 亚洲精品久久| 久久久久久久久久久久久国产| 水蜜桃久久夜色精品一区| 先锋影音一区二区三区| 欧美国产偷国产精品三区| 一区二区三区国| 天天影视欧美综合在线观看| 宅男在线精品国产免费观看| 久久精品国内一区二区三区水蜜桃| 在线成人性视频| 香蕉久久网站| 4444亚洲人成无码网在线观看| 欧美.www| 国产 日韩 欧美在线| 99精品免费视频| 无码无遮挡又大又爽又黄的视频| 日韩国产欧美在线视频| 岛国av免费在线| 国产乱码精品一品二品| 一级黄色大片免费看| 成人免费高清视频| 亚洲综合自拍网| 国产三级久久久| 又色又爽的视频| 亚洲另类色综合网站| 国产网友自拍视频| 色婷婷激情综合| 伊人久久亚洲综合| 欧美成人a在线| 亚洲欧美日韩成人在线| 有码中文亚洲精品| 久草资源在线| 97色在线视频观看| 成人精品动漫| 99理论电影网| 嫩草一区二区三区| 日韩视频在线免费播放| 亚洲小说区图片区| 国产精品亚洲二区在线观看| 久久国产福利国产秒拍| 欧美做受高潮中文字幕| 国产喂奶挤奶一区二区三区| 69av.com| 在线精品观看国产| 国产夫妻在线观看| 精品亚洲一区二区三区| 免费观看久久久久| 45www国产精品网站| 成人亚洲精品| 开心色怡人综合网站| 婷婷综合视频| 亚洲精品无码久久久久久| 精品亚洲porn| 右手影院亚洲欧美| 亚洲精品国产高清久久伦理二区| 91美女免费看| 欧美一级欧美三级在线观看| 女人天堂在线| 欧美精品久久久久久久久久| 精品国产黄a∨片高清在线| 精品视频一区在线| 欧美国产三区| 亚洲va综合va国产va中文| 91丨porny丨最新| 激情小说中文字幕| 欧美日韩午夜在线| 熟妇人妻中文av无码| 久久成人18免费网站| 成人在线视频播放| 狠狠色综合一区二区| 牛夜精品久久久久久久99黑人| 欧在线一二三四区| www.欧美色图| 久久久久黄色片| 欧美日韩国产乱码电影| 精品影院一区| 欧美一级免费视频| 成人午夜三级| 日韩一区二区高清视频| 国产一区二区调教| 韩国一级黄色录像| 欧美午夜片在线看| 精品电影在线| 欧美一级免费视频| 神马日本精品| 日韩视频在线视频| 成人免费毛片嘿嘿连载视频| 国产盗摄x88av| 欧美高清精品3d| 欧美一区二区三区| 国产欧美日韩中文| 日韩高清欧美| 国产野外作爱视频播放| 欧美国产日本视频| 国产精品无码一区| 色哟哟入口国产精品| 51一区二区三区| 亚洲欧洲三级| 久久99精品久久久久久动态图| 免费黄色在线网址| 欧美日韩国产综合草草| 日本高清中文字幕在线| 国产一区二区在线播放| 91偷拍一区二区三区精品| 精品亚洲视频在线| 亚洲男人天堂av| 亚洲AV无码成人片在线观看| 欧美大片欧美激情性色a∨久久| 日韩中文字幕一区二区高清99| 中国女人做爰视频| 成人av在线电影| 国产成人在线观看网站| 亚洲男人天堂古典| 91在线亚洲| japanese在线视频| 国产成人在线色| 中日韩精品视频在线观看| 亚洲美女动态图120秒| 日本欧美韩国| 亚洲欧洲免费无码| 懂色av一区二区三区免费观看 | 9191在线| 99re视频在线观看| 一本久久知道综合久久| x88av在线| 欧美一区二区三区电影| 俺来俺也去www色在线观看| 久久久婷婷一区二区三区不卡| 爽好久久久欧美精品| 91大神福利视频| 欧美成人高清电影在线| 午夜不卡影院| 一区二区三区免费看| 国产成人亚洲综合a∨婷婷| 在线观看国产亚洲| 中文字幕亚洲图片| 亚洲免费一区三区| 久久久噜噜噜www成人网| 国产精品狼人久久影院观看方式| va婷婷在线免费观看| 欧美一区二区三区免费视| 波多野结衣在线观看一区二区| 亚洲五月激情网| 黑人巨大精品欧美一区二区免费| 午夜在线视频| 精品不卡在线| 九九视频精品免费| 国产成人无码精品亚洲| 北条麻妃久久精品| 西瓜成人精品人成网站| 色噜噜狠狠一区二区| 岛国av一区二区在线在线观看| 欧美精品电影|