106工業局

Maker

 

 

現在位置:艾鍗學院Embedded Linux 課程> 嵌入式Linux驅動程式

1. 早鳥報名享優惠95折
2. 報名立即送最新Raspberry Pi 3 +研發開發套件組
3. 本課程有數位線上學習版本

 

你有這樣的問題嗎?
▪ 有8051, AVR單晶片等MCU開發經驗,如I2C, SPI 等,但不知如何將這些Driver移植到 Linux平台
▪ Linux 驅動程式程式進入點在那裡? Linux 驅動程式要如何跟上層的應用程式溝通? 不同硬體裝置l驅動程式的架構是不是不同? 在Linux多工的環境下, 驅動程如何處理多工同時存取? 同步I/O與非同步I/O、中斷、DMA等I/O方式,Linux 驅動程式如何撰寫?
▪ 看過一些Linux 驅動程式的書,但看不懂? 或者是,.....好像懂,但卻又不知如何寫起?!
▪ 為什麼Windows USB Driver裝不起來? 安裝過程因找不到檔案而安裝失敗
▪ 如何看懂 HID格式、如何獲得device傳送過來的資料?
課程目標
快速上手:Raspberry Pi 學Linux驅動程式, 並且搭配本公司所設計的Raspberry Pi I/O擴充板作為驅動程式實戰演練,實戰GPIO, UART, I2C, SPI等Linux硬體驅動,並了解USB硬體架構以及Linux在USB的軟體框架。
1. Linux驅動程式初探-Linux核心程式介面:
學習Driver撰寫的各個層面包含核心APIs、中斷處理、同步、記憶體管理等等。導正學員Linux Device Driver與 Linux 基本作業系統的觀念,為將來的Driver coding打下良好的基礎。可以了解user-space與kernel-space 之間的關係。可以開始研讀及參考kernel裡面或是別人撰寫的 device driver source code。
2. 實際硬體驅動-Linux驅動程式:
能了解硬體工作原理與kernel對特定硬體的驅動程式架構。你可以了解真實硬體驅動程式的開發。如UART, GPIO 、I2C、SPI 等驅動程式。
3. 教你如何於Linux 下開發USB設備的驅動程式:
你會了解USB硬體架構以及Linux在USB的軟體框架。課程從USB HID 類別到USB Mass Storage 類別,由淺入深一步步帶你從實作中,學會USB開發方法與除錯技巧。 此外,課程使用立肯科技USB邏輯分析儀器,揭開你看不到的USB的神秘面紗。
2017年課程全面採用本公司所設計的最新Raspberry Pi I/O 擴充板

ADC、DC馬達驅動、G-sensor、紅外線收發器、OLED、Buzzer、LED、Button、DIP Switch、Relay 

課程大綱 
本課桯使用最新Linux Kernel 4.4.x 版本
第一階段 
Part I - Linux 核心程式介面 
1. Linux Device Driver Introduction
▪ Linux 驅動程式架構
▪ Linux Device Driver架構
▪ Linux Coding Style
▪ Kernel Space VS User Space
▪ Linux Device Driver種類 (Char, Block and Network)
▪ Compiling (Makefile,Kconfig) & Loading 
▪ 開發環境建立-暖身: 我的第一個Kernel Module-Hello world
2. Common Kernel APIs
▪ Kernel Thread 
▪ Synchronization (Spin Lock, Mutex, Semaphore)

▪ Memory Allocation
▪ Cache & Memory Map
▪ Proc file system
▪ Sysfs file system
▪ HAL I/O Routine
▪ Kernel Double Linked List
3. How to Debug Device Driver?
Part II - Linux 驅動程式實戰 

● 字元裝置Driver 
● Linux Misc Device
● Linux GPIO 驅動程式 for LED, Button,Relay
● Linux 中斷註冊 & 中斷控制器HAL層架構 
 Bottom Halves (Tasklet & Work Queue)
● 進階字元Driver: 

    Non-blocking I/O : 使用Wait Queue & completion 機制

    kernel 對UserSpace通知: SIGIO 信號非同步通知,call_usermodehelper()

● Kernel Timer List (Jiffies, timer ticks) for LED 閃爍
● Linux Serial port 驅動程式 for Bluetooth 模組
● Linux Platform Device & Platform Driver 架構
Linux Device Tree 
● Linux SPI Client驅動程式 for ADC Driver (MCP3008)
● Linux IIO Driver(Linux Industrial I/O Subsystem) 

● Linux SPI Bus master 驅動程式 for BCM2835 SPI controller
Linux I2C Client驅動程式 for EEPROM
Linux I2C Bus master驅動程式 for BCM2835 I2C controller
● Linux User Space Driver - BCM2835 C I/O Library

第二階段 
Part I Fundamentals of USB

● Introduction to USB Architecture
● USB Data Flow Type
● USB Communication protocol
● USB Device Enumeration
 Linux USB Driver Software Framework

    Linux USB Host Controller Driver

    Linux USB Class driver

    Linux USB Core and API

    Linux Urbs

●USB Debug using USB Protocol Analyzer (使用立肯科技USB分析儀)
Part II Linux USB Driver實作 (Writing a USB Driver)

● USB HID – Mouse driver 實作

    如何看懂 HID-Mouse資料格式

    如何獲得mouse device傳送過來的資料

    如何獲得mouse device的descriptors

    Lab: 透過USB Mouse控制Raspberry Pi GPIO

● USB HID – keyboard driver實作

    如何看懂 HID-Keyboard資料格式

    如何獲得kerboard device傳送過來的資料

    如何獲得kerboard device的descriptors

    Lab應用: 透過USB鍵盤向控制Raspberry Pi GPIO

● USB HID雙向通訊應用

● USB Mass storage實作

    如何看懂 Mass Storage資料格式

    如何得到Flash Drive的相關資訊 (ex:隨身碟名稱,容量…)

    如何得到Flash Drive的Partition Type

    Lab應用: SCSI command讀寫Flash Drive

 
 
 

講義預覽

 

適合對象
1. 須要移植或整合一些Driver到Linux平台上
2. 已在嵌入式Linux開發相關領域,欲再增強本身Linux Device Driver專業技能者。
3. 想學會Linux驅動程式開發技巧。
職涯方向
Linux驅動程式工程師 |  嵌入式Linux系統開發工程師 | 韌體工程師 | Linux 軟體工程師 | Linux平台驅動程式
Linux System Engineer |  Embedded Linux driver programmer | Linux Firmware Engineer 
課程Q&A
1. 學習Linux驅動程式要具備那些基礎?
具備基本的Linux操作且熟悉C語言。另外,對於Linux系統程式有基本的開發經驗,尤其是與I/O相關的系統呼叫,如 read,write, ioctl, select等。最後,擁有一些基本硬體控制的觀念。具備基本的Linux操作及C語言基礎。另外,對於Linux系統程式有基本的開發經驗,尤其是與I/O相關的系統呼叫,如 read,write, ioctl, select等。最後,擁有一些基本硬體控制的觀念。
2. Linux驅動程式和核心之間的關係?
Linux 驅動程式運行時包在核心裡面的,核心視驅動程式為「黑盒子」,核心不知道也不想知道驅動程式裡面那些硬體控制的細節,但上層應用程式或核心本身又要去使用硬體,所以核心只好 定義出一個"驅動程式架構與界面",之後核心才可 以透過這個界面來操作硬體而又不用去知道其硬體驅動程式的相關細節,諸如暫存器讀寫。
3. Linux驅動程式架構?
Linux驅動程式的撰寫必須符合核心所定義的"架構",因為Linux驅動程式是和核心一起運行的,任何驅動程式設計錯誤,都可能導致kernel panic ! 但僅管如此,也不代表驅動程式的撰寫者一定要深入探究核心內部的太多細節,只要了解一些常用標準的kernel API與 synchronization之類的問題即可。要想寫出架構良好的Linux驅動程式,必須先理解核心某些子系統的運作原理或是各子系統之間的關連性,例如你要撰寫的是USB界面的網路卡,那麼你就要先去了解Linux核心所定義的USB子系統的架構,同時你也要去看網路子系統的架構,以及USB和網路子系統彼此間的關連性,例如資料流的傳遞和相關的kernel API。”架構”這一詞意謂著,核心已事先定義出一般化的資料結構與操作函式,你只要去撰寫特定的部份,通常也就是跟硬體有關的部份,所以整個Linux驅動程式並非總是從頭寫起。
4. Raspberry Pi 已有一些週邊GPIO Library可使用,如Wiring Pi ,那為什麼還要修這門課?
 
Wiring Pi 屬於在應用層User Space的作法, 而非在Kernel 核心層實作。應用層的Driver作法,必須等到root 檔案系統存在後才能執行, 無法在Linux kernel 開機階段就自動掛載driver,且應用層只能使用Polling 無法使用核心硬體中斷機制, 所以Wiring Pi 的作法僅適合用在簡單慢速對效能不要求的裝置。本課程為底層 Kernel Space的作法效能高。另一方面, 從104觀察就業市場, Linux驅動程式或嵌入式Linux系統開發的相關工作, 指的都是在 Kernel Space的開發。然不可諱言, 對於一般學生使用Wiring Pi 這類的library 確實易於上手,畢竟僅需有Arduino開發能力即可, 只是產業界對於RD研發工程師而言,有較高的職能要求。
 
5. Raspberry Pi I/O 擴充板有什麼功能?
   Raspberry Pi 擴充板V3.0 簡要說明如下:
  • 1.由於Raspberry Pi 沒有類比輸入的能力: 所以此擴充板加入ADC 晶片以提供8 通道的類比訊號輸入, 如此可以讓Raspberry Pi 可以擁有連接類比感測器的的能力。
  • 2.拉出Pi的硬體PWM訊號腳, 並加入DC 驅動電路, 使Pi 可以直接連接DC 馬達及BLDC無刷馬達
  • 3.SB Debug Console: 不用再買Serial-TO-USB的轉接線材了, 本擴充板已內建PL2303晶片了, 故可以直接接到PC USB
  • 4.同時擁有IR紅外線發送器及接收器, 可以讓Pi當作多媒體的應用平台或IR遙控器
  • 5.具OLED的模組座,可以直接接上OLED用來顯示系統狀態 ( I2C OLED 將隨出貨附贈)
  • 6.TH1 可以直接連接光敏電阻, 可以進行光度感測 (光敏電阻將隨出貨附贈)
  • 7.內建 G-Sensor (LIS3DH) 可以感測Pi 在X,Y,Z軸方向的移動狀態
  • 8.具有nRF24L01的2.4G RF通訊模組座,可以進行2.4G 無線通訊實作
  • 9.用DIP Switch 記錄不同狀態,Pi 就能有不同的啓動狀態或選擇進入不同的功能模式
  • 10.接出I2C連接座、SPI連接座方便外接更多的數位式感測器
    了解更多... 

延伸學習
 
上課花絮
▪ 從無到有的培訓過程,紮實前瞻且完善
 
▪ 經濟部工業局智慧電子學院短期在職訓練
 
▪ 教學實錄Preview