1. 程式人生 > >基於spi匯流排驅動程式的編寫

基於spi匯流排驅動程式的編寫

作者:劉廣富,華清遠見嵌入式學院講師。 
本文不具體分析linux核心中SPI匯流排的架構,只針對這種架構闡述如何進行SPI裝置驅動的編寫。 
簡而言之,SPI驅動的編寫分為兩個部分: 
第一、spi_device的構建和註冊
第二、spi_driver的構建和註冊 
1.spi_device的構建並註冊 
首先在板檔案中新增spi_board_info,例如: 
static struct spi_board_info s3c_spi_devs[] __initdata = {
{
.modalias = "m25p10a",
.mode = SPI_MODE_0,
.max_speed_hz = 1000000,
.bus_num = 0,

.chip_select = 0,
.controller_data = &smdk_spi0_csi[SMDK_MMCSPI_CS],
},
}; 
並在板檔案的init函式中呼叫spi_register_board_info(s3c_spi_devs,ARRAY_SIZE(s3c_spi_devs)); 
這個函式會把spi_board_info註冊到連結串列board_list上。spi_device封裝了一個spi_master結構體,事實上spi_master的註冊會在spi_register_board_info之後,spi_master註冊的過程中會呼叫scan_boardinfo掃描board_list,找到掛接在它上面的spi裝置,然後建立並註冊spi_device。 

2. spi_driver的構建與註冊,分為三部曲: 
(1)構建spi_driver 
static struct spi_driver m25p80_driver = { 
. driver = {
.name ="m25p80",
.bus =&spi_bus_type,
.owner = THIS_MODULE,
},
.probe = m25p_probe,
.remove =__devexit_p(m25p_remove),
}; 
(2)spid_river的註冊 
spi_register_driver(&m25p80_driver);當匹配了spi_device以後呼叫probe 
(3)實現probe操作: 

spi_transfer(裡面集成了資料buf空間地址等資訊) 
spi_message(是spi_transfer的**)的構建;spi_message_init(初始化spi_message)、spi_message_add_tail(將新的spi_transfer新增到spi_message佇列尾部) 
spi_sync函式的呼叫(呼叫spi_master傳送spi_message) 
例如: 
struct spi_transfer st={
.tx_buf = buf,
.len = len,
。。。。。。。。。
};//填充spi_transfer 的tx_buf、rx_buf和len就可以
struct spi_message meg;//定義message
spi_init_message(&meg);//初始化meg
spi_message_add_tail(&st,&meg);
//將st放在message佇列尾部
Spi_sync(spi_device,&meg);
//將message與spi_device關聯,傳送meg 
這樣就基本完成了SPI裝置的驅動編寫,讀寫具體操作要根據晶片的時序來確定,具體如何利用SPI傳資料那麼就要看自己程式的邏輯。

相關推薦

基於spi匯流排驅動程式編寫

作者:劉廣富,華清遠見嵌入式學院講師。 本文不具體分析linux核心中SPI匯流排的架構,只針對這種架構闡述如何進行SPI裝置驅動的編寫。 簡而言之,SPI驅動的編寫分為兩個部分: 第一、spi_device的構建和註冊第二、spi_driver的構建和註冊 1.spi_d

SPI匯流排驅動、裝置驅動

SPI驅動分析 zynq SPI控制器理解記錄 SPI匯流排 SPI Master控制器驅動 SPI Device驅動 其他外設使用SPI通訊 原始碼記錄 問題記錄 一次傳遞一定數量的時候出現了超時的現象

用一個例項來理解驅動程式編寫流程 (自用)

#include <linux/module.h> #include <linux/kernel.h> #include <asm/io.h> #include <linux/miscdevice.h> #include <linu

Linux驅動程式編寫&&應用程式對她的呼叫

        Linux驅動程式的開發,我相信這是很多致力於嵌入式學習的騷年的終極夢想,不管是技術含量,還是薪金待遇,她都一一完美的體現了出來!當然,crk_13也一樣!不過,越是誘人的東西往往也越是可望而不可即,或許大家都對驅動開發的難度之大,要求之高有所耳聞!以我個人

io口模擬spi,stm32f103與MS5611基於spi匯流排的溫度壓力高度資料讀取

以下檔案為原始檔/**    -----------------------MS5611驅動 && IO口模擬SPI驅動-------------------------  *******************************************

linux核心SPI匯流排驅動分析(一)

下面有兩個大的模組: 一個是SPI匯流排驅動的分析            (研究了具體實現的過程) 另一個是SPI匯流排驅動的編寫(不用研究具體的實現過程) SPI匯流排驅動分析 1 SPI概述      SPI是英語Serial Peripheral inte

基於樹莓派Raspberry: 字元裝置核心驅動程式框架編寫

        之前寫了一篇移植2.4寸TFT驅動到樹莓派的文章,那篇博文中的驅動程式碼是國外大牛寫的,看了一下,還是有很多地方沒理解,是得好好再學習一下核心驅動的編寫,這裡就從字元裝置驅動開始,採用最簡單的LED驅動來建立核心驅動移植的驅動框架.        個人原創,

linux系統匯流排SPI匯流排三之SPI主控制器驅動程式分析

嵌入式微處理器訪問SPI裝置有兩種方式:使用GPIO模擬SPI介面的工作時序或者使用SPI控制器。使用GPIO模擬SPI介面的工作時序是非常容易實現的,但是會導致大量的時間耗費在模擬SPI介面的時序上,訪問效率比較低,容易成為系統瓶頸。這裡主要分析使用SPI控制器的情況。

spi協議->裸機程式->master驅動程式分析

SPI協議參考: SPI協議及其工作原理淺析      http://bbs.chinaunix.net/thread-1916003-1-1.html SPI匯流排協議及SPI時序圖詳解     http://blog.163.com/sunshine_lin

FPGA nios編寫LCD12864的驅動程式過程以及注意事項,本人親自踩坑,重要!!!

LCD12864引腳如下: FPGA開發板得提供,3.3v電壓,5v電壓,普通io都是3.3v電壓 DB:資料腳,得用雙向io,因為程式裡面需要讀取液晶的應答(普通io3.3v可以) E: 輸出引

Linux裝置驅動程式架構分析之I2C架構(基於3.10.1核心)

作者:劉昊昱  核心版本:3.10.1 I2C體系架構的硬體實體包括兩部分: 硬體I2C Adapter:硬體I2C Adapter表示一個硬體I2C介面卡,也就是I2C控制器。一般是SOC中的一個介面,也可以用GPIO模擬。硬體I2C Adapter主要用來在I2

編寫USB滑鼠驅動程式,並測試

學習目標:編寫USB滑鼠驅動程式,並測試(將USB滑鼠的左鍵當作L按鍵,將USB滑鼠的右鍵當作S按鍵,中鍵當作回車按鍵). 一、怎麼寫USB裝置驅動程式?步驟如下: 1. 首先先定義全域性變數usb_driver結構體,並在入口函式中通過usb_register()函式進行註冊; 2. 分別寫usb

Linux裝置驅動程式學習(基於2440的GPIO字元裝置驅動)

GPIO驅動程式如下:  #include <linux/module.h> #include <linux/kernel.h> #include <linux/errno.h> #include <linux/string.h> #include <li

Linux SPI匯流排和裝置驅動架構之一:系統概述

SPI是"Serial Peripheral Interface" 的縮寫,是一種四線制的同步序列通訊介面,用來連線微控制器、感測器、儲存裝置,SPI裝置分為主裝置和從裝置兩種,用於通訊和控制的四根線分別是: CS    片選訊號SCK  時鐘訊號MISO  主裝置的資料

Linux下SPI從裝置驅動編寫

 SPI(Serial Peripheral Interface) 是一個同步的四線制序列線,用於連線微控制器和感測器、儲存器及外圍裝置。三條訊號線持有時鐘訊號(SCLK,經常在10MHz左右)和並行資

基於platform匯流排驅動分析

1.platform匯流排基本概念裝置和驅動若基於裝置驅動模型,則它們通常都需要掛接在一種總線上。匯流排相對於裝置和驅動,可謂是“媒人”擔當對於本身依附於 USB、 I2C、SPI 等的裝置而言,這自然不是問題。但是很多的裝置(比如led)實際並不依附於匯流排,沒了“媒人”,

觸控式螢幕驅動編寫驅動程式

我們開啟我們的核心板原理圖可以看到這四根引腳分別接在xadcAIN2,3,4,5上面 搜尋發現不需要配置什麼暫存器 我們看一看晶片手冊上的觸控式螢幕那一章,我們的工作就是閱讀那一章然後弄清楚那裡面的東西就可以了 先來看一看核心自帶的觸控式螢幕驅動做了什麼事情 ts.clo

Ti437x LED匯流排驅動模型程式+裝置樹

本文主要記錄AM437X驅動的LED。含簡單的字元裝置驅動、裝置驅動模型、裝置樹以及LED子系統。 目前就Linux驅動的理解是: Linux驅動 = 裸機 + 框架 關於框架,目前的理解是: 以LED驅動為例,之前印象中就是韋老大

Linux SPI匯流排和裝置驅動架構之二:SPI通用介面層

通過上一篇文章的介紹,我們知道,SPI通用介面層用於把具體SPI裝置的協議驅動和SPI控制器驅動聯接在一起,通用介面層除了為協議驅動和控制器驅動提供一系列的標準介面API,同時還為這些介面API定義了相應的資料結構,這些資料結構一部分是SPI裝置、SPI協議驅動和SPI控制

Marvell 88W8686/88W8782/88W8801 WiFi模組驅動程式編寫

本文以STM32F1系列的微控制器為例,詳細講解Marvell公司的88W8686/88W8782/88W8801 WiFi模組驅動程式的編寫。編寫程式時為了程式碼簡短起見,直接用暫存器操作,不使用STM32庫函式。IDE採用Keil uVision5。為了儲存下