推薦產品
聯係我們
北京谈球吧论坛科技有限公司

谘詢熱線:010-82488292

公司電話:010-82488292

公司傳真:010-82611646

企業郵箱:sales@changyinwuye.com

地址:北京市海澱區中關村大街19號 新中關大廈B座南翼15層1507室

當前位置:谈球吧论坛科技首頁 » 新聞資訊 » 行業資訊 » RK3288雙屏雙顯使用說明(androids4.4&5.1-SDK)

RK3288雙屏雙顯使用說明(androids4.4&5.1-SDK)

文章出處:谈球吧论坛科技 人氣:9
摘要 : 本文主要介紹了 RockChip(以下簡稱 RK) SDK 平台上支持的異顯方案,包括係統 API、補丁、內核配置方法等,適用於以下 SDK 平台:RK3188 androids4.4, RK3188 androids5.1,RK3288 androids4.4, RK3288 androids5.1

 

 

 

 

版 本 曆 史

 

 

 

 

 

 

 

 

 

 

版本號

作者

修改日期

修改說明

備注

 

 

 

 

 

 

 

 

 

V1.0

SZC

2016-10-20

添加係統 API

 

 

 

 

 

 

 

 

 

 

V1.1

SZY

2016-10-21

添加補丁與配置

 

 

 

 

 

 

 

 

 

 

V1.2

ZY

2016-11-07

整理格式,補充配置說明

 

 

 

 

 

 

 

 

 

 

V1.3

ZY

2016-11-08

增加雙屏觸摸簡單說明

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

目 錄

 

1

簡介

.............................................................................................................

2

2

係統 API .......................................................................................................

2

 

2.1

androids PRESENTATION ...............................................................................

2

 

2.1.1

API 介紹 ............................................................................................

2

 

2.1.2

Presentation 示例 ...............................................................................

5

 

2.2

RK DUALSCREEN ........................................................................................

8

 

2.2.1

API 介紹 ............................................................................................

8

 

2.2.2

RockChip DualScreen 接口使用示例 ........................................................

9

3

補丁與配置 ...................................................................................................

11

 

3.1

androids .................................................................................................

11

 

3.1.1

RK3288 androids 5.1 ..........................................................................

11

 

3.1.2

RK3288 androids 4.4 ..........................................................................

12

 

3.1.3

RK3188 androids 5.1 ..........................................................................

12

 

3.1.4

RK3188 androids 4.4 ..........................................................................

12

 

3.2

KERNEL DRIVER .........................................................................................

12

 

3.2.1

RK3288 androids 5.1 ..........................................................................

12

 

3.2.2

RK3288 androids 4.4 ..........................................................................

14

4

雙屏觸摸

.....................................................................................................

14

 

4.1

原理說明 .................................................................................................

14

 

4.2

補丁

......................................................................................................

15

 

  1 簡介

  本文主要介紹了 RockChip(以下簡稱 RK) SDK 平台上支持的異顯方案,包括係統 API、補丁、內核配置方法等,適用於以下 SDK 平台:

  l RK3188 androids4.4

  l RK3188 androids5.1

  l RK3288 androids4.4

  l RK3288 androids5.1

  2 係統 API

  RK 雙屏異顯方案有兩種方式:androids Presentation 和 RK dualscreen。androids Presentation 是 Google 提供的雙屏方案,實現了 View 級別的 VOP 派發,邏輯均在同一個 APP 上進行控製;RK dualscreen 則是實現了 APP 級別的 VOP 派發,異顯的兩部分分別是不同的 APP。

  Presentation 比較適用於對自身需求進行深入定製的方案,RK dualscreen 在滿足深入定製方案下,也支持,快速集成多方 APP,進行功能整合。兩者各有優缺點,也能夠進行互補。

  2.1 androids Presentation

  2.1.1 API 介紹

  官方 API 以及示例說明文檔:

  //developer.androids.com/reference/androids/app/Presentation.html

  Presentation 是 google 官方提供的一個特殊的 dialog 類型,用來將特定內容顯示到其他非

  主屏顯示器上。它在創建時,需要綁定顯示屏,並根據這個目標顯示屏以及其大小來配置 context

  和 resource。目前係統提供了兩種方式來與目標顯示屏進行綁定。

  1. 通過 MediaRouter 接口獲取並綁定:

  MediaRouter mediaRouter =(MediaRouter)

  context.getSystemService(Context.MEDIA_ROUTER_SERVICE); MediaRouter.RouteInfo route = mediaRouter.getSelectedRoute(); if(route !=null){

  Display presentationDisplay = route.getPresentationDisplay();

  if(presentationDisplay !=null){

  Presentation presentation =newMyPresentation(context, presentationDisplay);

  presentation.show();

  }

  }

  2. 通過 DisplayManager 接口獲取並綁定:

  DisplayManager displayManager =(DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); Display[] presentationDisplays =

  displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION); if(presentationDisplays.length >0){

  // If there is more than one suitable presentation display, then we could consider

  // giving the user a choice. For this example, we simply choose the first display

  // which is the one the system recommends as the preferred presentation display. Display display = presentationDisplays[0];

  Presentation presentation =new MyPresentation(context, presentationDisplay); presentation.show();

  }

  MediaRouter 和 DisplayManager 接口不在此處詳細介紹。

  Presentation 的接口使用簡單,功能明確,主要接口如下:

  1. 構造接口

  (1) Presentation(Context outerContext,Display display)

  接口說明:

  實例一個使用默認主題,綁定到目標 display 上的 Presentation 對象。

  參數說明:

  outerContext:application 的 context 對象;

  display:要綁定的目標 display,可以通過上述介紹的 MediaRouter 和 DisplayManager

  接口獲取。

  (2) Presentation(Context outerContext, Display display, int theme)

  接口說明:

  實例一個使用特定主題,並綁定到目標 display 上的 Presentation 對象。

  參數說明:

  outerContext:application 的 context 對象;

  display:要綁定的目標 display,可通過上述介紹的 MediaRouter 和 DisplayManager 接

  口獲取;

  theme:窗口使用的主題資源。

  2. 方法接口

  (1) Display getDisplay()

  接口說明:

  獲取當前 presentation 顯示所在的目標屏。

  (2) Resources getResources()

  接口說明:

  獲取用於當前 presentation 的 Resources 對象。

  (3) void onDisplayChanged()

  接口說明:

  當 presentation 綁定的 display 發生變化(如大小、方向等)時,係統會回調此接口,並且係統將自動調用 cancel()接口,關閉此 presentation。

  (4) void onDisplayRemoved()

  接口說明:

  當 presentation 綁定的 display 被移除時,係統會回調此接口,並在此之後,係統會自動調

  用 cancel()接口,關閉此 presentation。

  (5) void show()

  接口說明:

  用 於 顯 示 此 presentation , 如 果 顯 示 設 備 無 法找 到 , 調 用 此 接 口 , 將 拋 出

  WindowManager.InvalidDisplayException 異常。

  (6) void onStart()

  接口說明:

  當此 presentation 啟動後,會調用此接口,類似 activity 的 onStart。

  (7) void onStop()

  接口說明:

  當此 presentation 正在走 stop 流程時,將會調用到此接口,類似 activity 的 onStop。

  2.1.2 Presentation 示例

  穀歌官方提供了 ApiDemo,用來展示各個 API 的使用,presentation 在源碼中的範例路徑

  為:

  development/samples/ApiDemos/./src/com/example/androids/apis/app/Presentation Activity.java。

  關鍵代碼(紅色字體)介紹如下:

  1. 獲取目標顯示設備: public void updateContents() {

  clear();

  String displayCategory = getDisplayCategory();

  Display[] displays = mDisplayManager.getDisplays(displayCategory); addAll(displays);

  Log.d(TAG, "There are currently " + displays.length + " displays connected."); for (Display display : displays) {

  Log.d(TAG, "" + display);

  }

  }

  private String getDisplayCategory() {

  return mShowAllDisplaysCheckbox.isChecked() ? null : DisplayManager.DISPLAY_CATEGORY_PRESENTATION;

  }

  通過 DisplayManager 接口獲取 PRESENTATION 類型的顯示設備,添加到隊列當中並綁定

  到各個 View 當中。

  2. 點擊 CheckItem,創建 Presentation,並顯示:

  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (buttonView == mShowAllDisplaysCheckbox) {

  // Show all displays checkbox was toggled. mDisplayListAdapter.updateContents();

  } else {

  //Display item checkbox was toggled.

  final Display display = (Display)buttonView.getTag();

  if (isChecked) {

  PresentationContents contents = new PresentationContents(getNextPhoto()); showPresentation(display, contents);

  } else {

  hidePresentation(display);

  }

  }

  }

  通過 View 的 setTag 綁定對象的方法,將 display 對象綁定到具體 View 當中,並在需要時,通過 getTag 獲取對應的 display 對象。

  private void showPresentation(Display display, PresentationContents contents) { final int displayId = display.getDisplayId();

  if (mActivePresentations.get(displayId) != null) {

  return;

  }

  Log.d(TAG, "Showing presentation photo #" + contents.photo + " on display #" + displayId +

  ".");

  DemoPresentation presentation = new DemoPresentation(this, display, contents);

  presentation.show();

  presentation.setOnDismissListener(mOnDismissListener);

  mActivePresentations.put(displayId, presentation);

  }

  在範例中自定義了一個 Presentation 類,此處通過調用自定義的 Presentation,並顯式調

  用 show 方法,將此 Presentation 顯示到對應的 display 上。

  此處的 PresentationContents 隻是自定義了一個數據的封裝方式,傳給 Presentation,實

  際使用當中,可以根據項目需要,或者通過其他方式給顯示的數據即可,不需要也創建這類對象。

  3. 自定義 Presentation 類:

  private final class DemoPresentation extends Presentation { final PresentationContents mContents;

  public DemoPresentation(Context context, Display display, PresentationContents contents) { super(context, display);

  mContents = contents;

  }

  @Override

  protected void onCreate(Bundle savedInstanceState) {

  // Be sure to call the super class. super.onCreate(savedInstanceState);

  // Get the resources for the context of the presentation.

  // Notice that we are getting the resources from the context of the presentation.

  Resources r = getContext().getResources();

  // Inflate the layout. setContentView(R.layout.presentation_content); final Display display = getDisplay();

  final int displayId = display.getDisplayId(); final int photo = mContents.photo;

  // Show a caption to describe what‘s going on. TextView text = (TextView)findViewById(R.id.text); text.setText(r.getString(R.string.presentation_photo_text, photo, displayId,

  display.getName()));

  // Show a n image for visual interest.

  ImageView image = (ImageView)findViewById(R.id.image); image.setImageDrawable(r.getDrawable(PHOTOS[photo]));

  GradientDrawable drawable = new GradientDrawable(); drawable.setShape(GradientDrawable.RECTANGLE); drawable.setGradientType(GradientDrawable.RADIAL_GRADIENT);

  // Set the background to a random gradient. Point p = new Point(); getDisplay().getSize(p); drawable.setGradientRadius(Math.max(p.x, p.y) / 2); drawable.setColors(mContents.colors);

  findViewById(androids.R.id.content).setBackground(drawable);

  }

  }

  如上,可看出 Presentation 跟 Activity 的繼承類似,在構造中調用父類構造方法,在 onCreate 中調用 setContentView 方法設置顯示的 View 布局。

  以上便是 androids Presentation 的大體介紹,總體上來說,使用比較容易,其是 Dialog 類

  的子類,繼承和使用與 activity 類似,比較重要的一個步驟是如何獲取要綁定的 display 對象,

  實現了 View 級別的 vop 派發。

  2.2 RK DualScreen

  RK DualScreen 主要區別與 androids presentation,在於它實現了應用的派發,允許廠商快速根據現有的 app 功能,進行模塊的集成,減少開發周期和研發成本。

  2.2.1 API 介紹

  以下新增 API 主要是在框架中的 Context 以及 Activity 類中添加,實際使用過程中要注意實

  例的對象。

  (1) public void setDualScreen(boolean enable) Context 類

  接口說明:

  此接口用來開啟/關閉係統的雙屏異顯功能模塊;

  參數說明:

  true:打開雙屏異顯功能;

  false:關閉雙屏異顯功能。

  注意:

  由於此接口需要進行 update config,因此要求 app 需要集成如下:

  l Permission:

  androidsManifest.xml:

  l System share uid:

  androidsManifest.xml:

  androids:sharedUserId="androids.uid.system"

  androids.mk:

  LOCAL_CERTIFICATE := platform

  LOCAL_SDK_VERSION := current

  (2) public void moveAppToDisplay(int id) Activity 類

  接口說明:

  用於將當前應用移動到指定的 display id 設備上,使用此接口,開發廠商需要做好副屏的 APP

  管理,避免滯留太多的 APP 在副屏,導致出現一些性能或者管理混亂問題。

  參數說明:

  Id: 目標 display 的 id。

  取值範圍:當前係統包含的所有顯示設備的 ID 值。

  (3) public void syncDualDisplay() Activity 類

  接口說明:

  用於同步顯示狀態,將異顯的狀態同步回同顯狀態;

  (4) public void moveExtendDisplay() Activity 類

  接口說明:

  此接口是 RK 內部框架集成在手勢操作上的方法,與 moveAppToDisplay 接口的主要區別在

  於,此接口流程上添加了將副屏上的應用個數控製在 1 個,即,當移動新的 APP 到副屏時,會將

  副屏舊的 APP 移動至主屏。

  2.2.2 RockChip DualScreen 接口使用示例

  示例代碼參見補丁中的 DemoRKDualScreenDemo.tar.gz 工程。該工程,主要演示的功

  能為:獲取 display 列表並顯示,用戶點擊副屏(當前在主屏,因此點擊主屏框架不做處理)id

  後,應用調用接口顯示到副屏,延遲 4s 後自動調用切換到主屏,延遲 4s 調用框架異顯接口(帶

  app 個數控製),延遲 4s 後會再調用同步接口,同步狀態為同顯。

  關鍵代碼見如下:

  1. 打開雙屏異顯功能

  public void openDualScreen(View view) {

  mContext.setDualScreen(true);

  }

  2. 獲取顯示列表

  public void updateContents() { clear();

  Display[] displays = mDisplayManager.getDisplays(null); addAll(displays);

  Log.d(TAG, "There are currently " + displays.length + " displays connected."); for (Display display : displays) {

  Log.d(TAG, "" + display);

  }

  notifyDataSetChanged();

  }

  3. 點擊 listview,調用接口將 app 派發到對應 display 設備上:

  private final OnItemClickListener itemClickListener = new OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) {

  int displayid = ((ViewHolder)view.getTag()).displayid;

  Log.e(TAG, "click list position = " + position + ", displayId = "+ displayid); ((MainActivity)MainActivity.this).moveAppToDisplay(displayid); mHandler.sendEmptyMessageDelayed(MOVE_TO_DISPLAY_0, 4000);

  }

  };

  4. 移動當前應用到主屏:

  case MOVE_TO_DISPLAY_0:

  Log.d(TAG, "MOVE BACK TO #0"); ((MainActivity)MainActivity.this).moveAppToDisplay(0); mTextView.setText("move to display:0"); mHandler.sendEmptyMessageDelayed(MOVE_EXTEND_DISPLAY, 4000); break;

  主屏默認 ID 為 0,我們這裏直接寫 0,實際當中可以通過 Display 對象進行判斷。

  5. 移動當前應用到外部顯示設備:

  case MOVE_EXTEND_DISPLAY:

  Log.d(TAG, "MOVE TO EXTEND DISPLAY");

  ((MainActivity)MainActivity.this).moveExtendDisplay();

  mTextView.setText("move to display:EXTEND DISPLAY"); mHandler.sendEmptyMessageDelayed(SYNC_DUAL_SCREEN, 4000);

  break;

  此接口為 RK 框架集成的手勢操作的接口,自帶管理副屏應用,限製副屏應用個數為 1 個。

  6. 將狀態同步為同顯狀態:

  case SYNC_DUAL_SCREEN:

  Log.d(TAG, "SYNC BACK");

  mTextView.setText("move to display:SYNC");

  ((MainActivity)MainActivity.this).syncDualDisplay();

  break;

  7. 關閉雙屏異顯功能:

  public void closeDualScreen(View view) {

  mContext.setDualScreen(false);

  }

  3 補丁與配置

  3.1 androids

  3.1.1 RK3288 androids 5.1

  1. 基於最新 SDK 打上補丁 frameworks_base_dualscreen_api-last.patch。

  2. 使 用 雙 LCD 屏 時 , 請 在 /hardware/rockchip/hwcomposer 打 上 補 丁

  32885.1-hardware-rockchip-hwcomposer-base-on-c38e733b3.patch , 並在 build.prop 裏添加屬性 ro.htg.force=1。

  3.1.2 RK3288 androids 4.4

  1. 單 LCD 屏加 HDMI,請用 repo 同步最新代碼,然後依次打上 RK3288/4.4 目錄下的兩個補丁:

  (1) fix_hwc_can‘t_be_patched_after_pull_source_code.7z

  (2) [RK3288_androids4.4.4-SDK]雙屏雙顯_Patch_V1.1.7z

  2. 雙 LCD 屏時,在 1)基礎上,使用 hwcomposer_rga_force_htg.tar 替換工程中的源碼目錄 hardware/rk29/libhwcomposer。

  3.1.3 RK3188 androids 5.1

  1. 請基於最新 SDK 打上補丁 frameworks_base_dualscreen_api-last.patch。

  2. SDK 默認支持 LCD + HDMI 雙顯場景。

  3. 雙 LCD 屏場景,請將 patch/rk3188/5.1/ hwcomposer.rk30board.so 替換工程中的 hwcomposer.rk30board.so,並在 build.prop 裏添加屬性 ro.htg.force=1。

  3.1.4 RK3188 androids 4.4

  打上補丁 RK3188/4.4/ RK3188_4.4_dual_screen.7z。

  3.2 Kernel Driver

  內核驅動根據安卓版本以及平台的不同會做區分。

  3.2.1 RK3288 androids 5.1

  1. rk3288 支持的顯示接口可以任意組合。

  2. 雙屏異顯時,一個顯示接口當主屏,另一個當副屏;主副屏由板級 dts 文件確定,啟動後無法動態更改;

  3. 當兩路顯示接口顯示不同分辨率時,rk3288 隻能為一路顯示接口提供精確時鍾,另一路顯示接口時鍾會有微小頻偏;

  3.2.1.1 BOX 平台

  1. 在 rk3288-box.dts 使能 lcdc0 和 lcdc1(默認關閉),並確定主副屏順序:

  2. 將顯示接口掛到對應的 lcdc,即不同顯示接口連接的 lcdc_id 應不同。例如,HDMI 和CVBS(rk1000)會通過 dts 文件的配置來選擇:

  3. lcdc 模塊上電順序,默認 lcdc0 先加載。若需要修改,需調整 rk3288.dtsi 中 lcdc0 和 lcdc1 的順序,放在前麵的先加載。

  3.2.1.2 MID 平台

  1. 屏 + HDMI。SDK 默認支持方式。屏有 EDP,LVDS,MIPI 等接口,使用時在 dts 中

  使能對應的接口,關閉其他沒用到的接口。

  2. 雙 LCD 屏。該接法內核需打上補丁 RK3228/5.1/RK3288_dual_lcd.patch。

  使用該補丁的注意事項:

  (1) 默認接法為 LVDS + EDP,如果是 MIPI 屏請參考 EDP 屏驅動做修改;

  (2) disp_mode 為 DUAL_LCD 模式,主要用於支持雙 LCD 顯示的產品配置;

  l fb 節點中屬性 rockchip,disp-mode 設置為 DUAL_LCD;

  l rk_screen 節點打開兩個 screen 節點配置,分別設置 sceen_prop 屬性為 PRMRY

  和 EXTEND 並 include 對應屏的時序配置文件。

  l LCDC0 和 LCDC1 節點同時打開;

  l 打開 EDP、MIPI、LVDS 中需要使用的兩個節點,關閉不需要的其他設備節點,如

  HDMI 和 MIPI;

  l 設置 fb 節點中 rockchip,uboot-logo-on=<0>;

  (3) 雙 LCD 屏用法,HWC 也需要做相應的修改,請見章節 3.1.1。

  3.2.2 RK3288 androids 4.4

  4.4 的雙屏異顯功能隻在 MID 平台上實現,接法為 LCD + HDMI,HDMI 作為副屏。

  4 雙屏觸摸

  4.1 原理說明

  從原生的 androids 係統的代碼中可以看到 , 觸摸的事件實體中已經包含了一個叫做

  displayId 的成員。這說明雙觸摸的框架 androids 基本已經做好,如果觸摸事件的 displayId

  對應的是主屏,那麽它就會把該事件送給主屏的 TouchedWindow。同理,如果觸摸事件的

  displayId 對應的是副屏,那麽它就會把該事件送給副屏的 TouchedWindow。所以關鍵的地方就是這個 displayId 是如何被賦值的, 查看 inputflinger 的 Eventhub.cpp 代碼

  openDeviceLocked 中,如果是 USB 或者藍牙接口的觸摸屏,該觸摸設備會設置一個

  INPUT_DEVICE_CLASS_EXTERNAL 屬性,那麽 input 框架就是根據這個屬性來最終將其的

  event 送給副屏的 TouchedWindow。

  所以如果使用觸摸屏,主屏使用的是 I2C 接口,副屏使用的是 USB 或者藍牙接口。那麽就可以實現雙觸摸。如果兩個都使用的是 I2C,或者都使用的是 USB(藍牙),隻要修改代碼保證主屏上的觸摸設備不帶 INPUT_DEVICE_CLASS_EXTERNAL 屬性,副屏上的觸摸設備帶上這個

  屬性,也可以實現雙觸摸功能。

  4.2 補丁

  在 framework/base 目錄下打上 frameworks_base_dual-TouchInput-feature.patch。

  注意:本補丁隻適用於 androids Presentation 方案的雙屏異顯。

我要評論:  
*內 容:
驗證碼: 換一張
 

共有0條評論

還在等什麽,趕緊來評論!
網站地圖k8凱發體育appk8凱發體育app下載凱發k8體育APP凱發k8娛樂官網app下載體育凱發k8體育APP官方網站下載球盟會APP手機登錄球盟會官網