1. 程式人生 > >MT7620掛載多片SPI Flash方法

MT7620掛載多片SPI Flash方法

http://www.mamicode.com/info-detail-472955.html

整體思路借鑑上文

背景知識

總所周知,mt7620有兩個獨立的硬體spi介面,且對應的片選cs為cs0與cs1.如果讀者朋友對spi匯流排的通訊協議略懂的話,會發現:spi的通訊是按照message的方式來進行的,一次通訊過程是通過transfer_one_message的方法來實現.實際上是對spi硬體介面的分時複用.如果我們能夠找到辦法,擴充一下cs片選訊號,且保留對spi硬體的分時複用,不就可以完美實現我們的目標了?那麼問題來了:如何擴充cs片選?如何讓spi硬體不產生衝突?具體如何實現?各位看官莫急,且聽我慢慢道來.

實現過程

dts檔案的奧祕

dts檔案中有很多隱藏關卡(不要問我為神馬知道這麼多,因為我喜歡看驅動原始碼,嘿嘿^_^),通過簡單的改動,就可以讓spi憑空多出cs片選來.

[email protected] {
            compatible ="ralink,rt5350-spi";
            status ="okay";
            cs-gpios =<0>,<0>,<&gpio3 01>;...};

怎麼樣?就這麼簡(REN)單(XING),就能為spi匯流排新增一個用gpio口線實現的片選cs2(這個處理過程,實際上是在spi.c中完成的,讀者朋友花點時間看看這個檔案便能豁然開朗).在進行下面的講解之前,讓我再囉嗦幾句,cs-gpio前面的<0>,<0>表示使用系統預設的cs0,與cs1,而cs2則繫結到gpio72.接下來,我們就要對驅動進行相應的修改,使之能夠配合我們新指定的cs.

修改spi-rt2880.c

新增標頭檔案

由於要用到gpio口,所以需要在檔案開頭 
#include <linux/gpio.h>

修改巨集定義

讓mt7620的第二個spi成為分時複用的硬體介面,修改如下:

// manfeel, try to add more cs pins(>2)#define M(cs)(cs ?1: cs)#define RAMIPS_SPI_STAT(cs)(0x00+(M(cs)* RAMIPS_SPI_DEV_OFFSET))#define RAMIPS_SPI_CFG(cs)(0x10+(M(cs)* RAMIPS_SPI_DEV_OFFSET))#define
RAMIPS_SPI_CTL(cs)(0x14+(M(cs)* RAMIPS_SPI_DEV_OFFSET))
#define RAMIPS_SPI_DATA(cs)(0x20+(M(cs)* RAMIPS_SPI_DEV_OFFSET))#define RAMIPS_SPI_FIFO_STAT(cs)(0x38+(M(cs)* RAMIPS_SPI_DEV_OFFSET))

也就是說,當cs>=1的時候,第二個spi介面負責所有的通訊工作.

改動rt2880_spi_setup

staticint rt2880_spi_setup(struct spi_device *spi){struct rt2880_spi *rs = spidev_to_rt2880_spi(spi);int status =0;if((spi->max_speed_hz ==0)||(spi->max_speed_hz >(rs->sys_freq /2)))
        spi->max_speed_hz =(rs->sys_freq /2);if(spi->max_speed_hz <(rs->sys_freq /128)){
        dev_err(&spi->dev,"setup: requested speed is too low %d Hz\n",
            spi->max_speed_hz);return-EINVAL;}// manfeel, set cs_gpioint cs = spi->cs_gpio;if(cs >=0){
        status = gpio_request(cs, dev_name(&spi->dev));
        dev_info(spi->master->dev.parent,"in %s, cs_gpio = %d, status = %d\n",__func__, cs, status);if(status)return status;
        status = gpio_direction_output(cs,!(spi->mode & SPI_CS_HIGH));}/*
     * baudrate & width will be set rt2880_spi_setup_transfer
     */return status;}

注意spi->cs_gpio,與dts中的cs-gpios對應,其值分別為-2,-2,72.-2表示沒有對應的gpio(由系統硬體實現片選).

修改rt2880_spi_set_cs

staticvoid rt2880_spi_set_cs(struct spi_device *spi,int enable){struct rt2880_spi *rs = spidev_to_rt2880_spi(spi);int cs = spi->chip_select;// manfeel, deal cs_gpio firstif(spi->cs_gpio >=0){/* SPI is normally active-low */
        gpio_set_value_cansleep(spi->cs_gpio,(spi->mode & SPI_CS_HIGH)? enable :!enable);}else{if(enable)
            rt2880_spi_clrbits(rs, RAMIPS_SPI_CTL(cs), SPICTL_SPIENA);else
            rt2880_spi_setbits(rs, RAMIPS_SPI_CTL(cs), SPICTL_SPIENA);}}

以上是摘錄過來的,下面是我的修改

在dts檔案中共設定了3個spi-flash,使用快速模式

[email protected] {
compatible = "ralink,rt5350-spi";
status = "okay";
cs-gpios = <0>, <0>, <&gpio0 1 1>;

[email protected] {
#address-cells = <1>;
#size-cells = <1>;
compatible = "w25q128";
reg = <0 0>;
linux,modalias = "m25p80";
spi-max-frequency = <40000000>;
m25p,fast-read;


[email protected] {
label = "u-boot";
reg = <0x0 0x30000>;
read-only;
};


[email protected] {
label = "u-boot-env";
reg = <0x30000 0x10000>;
read-only;
};


factory: [email protected] {
label = "factory";
reg = <0x40000 0x10000>;
read-only;
};


[email protected] {
label = "firmware";
reg = <0x50000 0xfb0000>;
};
};
en25q128 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "w25q128";
reg = <1 0>;
linux,modalias = "m25p80";
spi-max-frequency = <40000000>;
m25p,fast-read;


[email protected] {
label = "extflash1";
reg = <0x0 0x100000>;
};
};
en25q128 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "w25q128";
reg = <2 0>;
linux,modalias = "m25p80";
spi-max-frequency = <40000000>;
m25p,fast-read;


[email protected] {
label = "extflash2";
reg = <0x0 0x100000>;
};
};
};

相關推薦

MT7620掛載SPI Flash方法

http://www.mamicode.com/info-detail-472955.html 整體思路借鑑上文 背景知識 總所周知,mt7620有兩個獨立的硬體spi介面,且對應的片選cs為cs0與cs1.如果讀者朋友對spi匯流排的通訊協議略懂的話,會發現:sp

Jlink使用技巧之燒寫SPI Flash存儲芯

支持 adf 行操作 .com 官方 尊重 rod 部分 標準 前言 大多數玩單片機的人都知道Jlink可以燒寫Hex文件,作為ARM仿真調試器,但是知道能燒寫SPI Flash的人應該不多,本篇文章將介紹如何使用JLink來燒寫或者讀取SPI Flash存儲器,JLink

linux 支援32M SPI Flash(W25Q256) — 兼談裝置驅動中的shutdown方法

前言 OpenWrt的最新kernel(3.14.28)已經能夠支援32M SPI Flash的讀寫以及擦除操作.然而,可能是系統考慮不周,亦或是MT7620系統的BUG,在配置了W25Q256的MT7620開發板系統上,無法soft reset!經過查閱相關資料,發現,M

目前最好用的芯低功耗方法-Multi-bits register

低功耗 寄存器 soc ic設計 目前芯片功耗的問題越來越突出,我們到底需要采用什麽樣的方法才能降低功耗,並且對我們的DUT改動最小呢?(人心貪婪啊,吃在碗裏,看著鍋裏)。 不過真的有這麽一種方法,不僅可以使的芯片功耗降低,而且對設計的改動幾乎為0。你一定問是什麽大招。不過了解之前稍微有點耐心

android-繼承BaseAdapter--自己定義適配器,getView運行次的解決方法

能夠 popu con data ssa baseadapt tracking you idt 定義的getView運行多次的ListView布局: <ListView android:id="@+id/lv_messages"

JavaScript 日期加一天 方法

ear str getdate ret sql語句 val div 總結 pan 今天查看項目發現有出bug,由於未了符合sql語句的要求,前臺網頁顯示的時候傳到後臺的時候要+1天, 網上查看了別人寫的,發現多多少少有點漏洞,經過我自己總結,寫出了達到了我要求的 1

什麽是態,態的實現方法是什麽?

。。 Language 語句 類的方法 new 對象的引用 text 使用 ont 作者:程序狗鏈接:https://www.zhihu.com/question/30082151/answer/120520568來源:知乎著作權歸作者所有。商業轉載請聯系作者獲得授權,非商

app測試更機型系統解決方法

使用 尋求 解決 img -s min 重要 ~~ com 手頭上測試機有限,不可能每個機型每個系統都 有一部手機,此時尋求一個什麽都有的測試平臺就顯得尤為重要了。 作為小白的我剛剛使用了一波騰訊優測,簡單粗暴有效給力,而且新註冊認證用戶還有60min免費使用時長~

Java線程同步方法

ase 上鎖 修改 阻塞 mic 每次 沖突 能力 fin 一、同步方法   即有synchronized關鍵字修飾的方法。 由於java的每個對象都有一個內置鎖,當用此關鍵字修飾方法時, 內置鎖會保護整個方法。在調用該方法前,需要獲得內置鎖,否則就處於阻塞狀態。 註

cmake安裝mysql及實例配置方法

end transacti per 企業 erro mysql con 初始 root 一、安裝mysql 1、 生產環境如何選擇MySQL版本 1. 選擇社區版的穩定GA版本2. 可以選擇5.1或5.5.互聯網公司主流5.5, 其次是5.1和5.63. 選擇發布後6個月以

php 連接oracle插入張圖片的方法

stat name tran eat def 錯誤 scrip res nec   php連接oracle數據庫的時候,其查詢、更新、刪除數據和MySQL類似,但是增加數據、特別是圖片的時候就很不一樣,這裏面涉及到要創建一個blob對象,用blod對象去保存php圖片,下面

jq防止ajax次提交的方法

console csdn min complete num href config 中斷 ring 1、第一種,對於onclick事件觸發的的ajax 可以采用如下方法: 即在beforeSend中使點擊按鈕不可用,ajax結果返回後置為可用 $.ajax( { type

線程-join()方法

mat 原理 監視 ron 運行 啟動 package stack rup 在很多情況下,主進程創建並啟動子線程,如果子線程中要進行大量的耗時運算,主線程往往將早於子線程結束之前結束。這時,如果主線程想等待子線程執行完成之後再結束,比如子線程處理一個數據,主線程要取得這個數

閱讀ARm芯手冊 閱讀方法

map track 每一個 putc core hold mil -m nandflash 一 overview 1 table of contents -*** 2 product overview -*** 芯片概述 3 feature *** 每一個功能

java 實現個接口 方法重名的解決辦法——內部類

nehe run .get tar extend pac 接口 內部 java package com.kk.innerClass; /** * 通過內部類實現接口 * 解決多個接口中方法重名問題 * */interface Machine { void run(

Selenium窗口切換方法快速入門

自動化測試 webdriver selenium 窗口切換 switchto 問題描述:執行腳本時遇到最多的一個問題就是Unable to find element in selenium...,除了排除頁面加載時間原因外,對於初學者常犯的一個錯誤是,點擊某個按鈕跳轉到新頁面的問題。若在當

Java 線程 sleep()方法與wait()方法的區別

程序 一段 exc 非靜態方法 not mil java程序 div 推薦   sleep()方法會使線程暫停執行一段時間,wait()方法會阻塞線程,直到被喚醒或等待時間超時。   兩者區別具體如下:   1 原理不同   sleep()方法是Thread類的靜態方法,使

Java 線程 sleep()方法與yield()方法的區別

就是 有關 方法 沒有 區別 sof interrupt 重新 線程   sleep()方法與yield()方法的區別如下:   1 是否考慮線程的優先級不同   sleep()方法給其他線程運行機會時不考慮線程的優先級,也就是說,它會給低優先級的線程運行的機會。而yiel

Vivado SPI Flash程序下載

ensure net ash and repr ras b2c int clas 由於Vivado下載程序步驟和ISE有較大差異,特此寫此文章,希望對大家有所幫助。 1,下載文件生成 在.bit文件生成後,在TCL中輸入 write_cfgmem -format mcs -

(電工基地筆記)Vivado固化至SPI Flash

load csdn 麻煩 manage QQ AD for generate 文件中 如果從頭開始做SPI Flash固化是有一些麻煩的,要在完成綜合之後,打開 synthesized Design (圖) (圖) 然後在synthesized Design打開