Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android深度探索與HAL驅動開發(卷1)-- 第七章隨筆,android驅動開發

Android深度探索與HAL驅動開發(卷1)-- 第七章隨筆,android驅動開發

編輯:關於android開發

Android深度探索與HAL驅動開發(卷1)-- 第七章隨筆,android驅動開發


應用程序、庫、內核、驅動程序的關系  

  從上到下,一個軟件系統可以分為:應用程序、庫、操作系統(內核)、驅動程序。開發人員可以專注於自己熟悉的部分,對於相鄰層,只需要了解它的接口,無需關注它的實現細節。以點亮LED為例,這4層軟件的協作關系如下:

 

  1、應用程序使用庫提供的open函數打開代表LED的設備文件。  

  2、庫數據open函數傳入的參數執行“swi”指令,這條指令會引起CPU異常,進入內核。   

  3、內核的異常處理函數根據這些參數找到相應的驅動程序,返回一個文件句柄給庫,進而返回給應用程序。 

  4、應用程序得到文件句柄後,使用庫提供的write或ioclt函數發出的控制命令。  

  5、庫根據write或ioclt函數傳入的參數執行“swi”指令,這條指令會引起異常,進入內核。 

  6、內核的異常處理函數根據這些參數調用驅動程序的相關函數,點亮LED。 

  7、庫(比如glibc)給應用程序提供的open、read、write、ioctl、mmap等接口函數被稱為系統調用,它們都是設置好相關寄存器後,執行某條指令引發異常進入內核。對於ARM架構的 CPU,這條指令為swi。除系統調用接口外,庫還提供其他函數,比如字符串處理函數(strepy、strcmp等)、輸入/輸出函數(scanf、printf等)、數據庫,還有應用程序的啟動代碼等。 在異常處理函數中,內核會根據傳入的參數執行各種操作,比如根據設備文件名找到對應的驅動程序,調用驅動程序的相關函數等。

 

LED驅動的實現原理

  盡管Linux驅動直接與硬件打交道,但並不是Linux驅動直接向硬件中的內存寫數據,而是與本機的I/O內存(I/O Memory,位於內核空間)進行交互。所謂I/O內存是通過各種借口(PCI、USB、藍牙、以太網口等)連接到主機(PC、手機)的硬件(網卡、聲卡、攝像頭等)

  在主機內存中的映射。 例如,在Ubuntu Linux上運行的驅動只需要訪問運行Ubuntu Linux的主機中的I/O內存即可,然後Linux內核會利用I/O內存中的數據硬件交互。

  Linux內核提供了多個與I/O內存交互的函數,如ioread16,ioread32,iowrite16,iowrite32等。Linux內核的內存管理模塊負責同步I/O內存與硬件中的數據。原理如圖:

 

  每一個連接Linux的硬件在I/O內存中都會有映射首地址。在使用ioread32、iowrite32等函數讀寫I/O內存是需要指定這些首地址。開發板上的LED也有其映射首地址。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved