1. 程式人生 > >無限可能!為MT7620新增N個SPI介面

無限可能!為MT7620新增N個SPI介面

前言

我的上一篇文章中談到,如何使能mt7620的第二個spi介面.既然第二個spi介面已經開放成功,那麼,可否接著新增第三個、第四個spi介面呢?熟悉mt7620硬體的朋友一定會第一時間站出來反對我:怎麼可能!?mt7620總共才兩個spi介面,怎麼可能新增更多呢?除非在硬體上想辦法.然而我總是善於將不可能變為可能_,今天我就要和大家分享一下,如何不改動任何硬體,通過修改驅動的方法,實現多個spi介面.注意,我這裡實現的spi,並非用gpio口模擬的bitbang偽spi,而是基於硬體spi的真實介面.

背景知識

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

實現過程

dts檔案的奧祕

dts檔案中有很多隱藏關卡,通過簡單的改動,就可以讓spi憑空多出cs片選來.

// 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

static void 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 first
    if (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);
    }
}

總共新增不到20行程式碼,就實現了N個spi介面!

實驗

將三個不同的spi flash同時連線到開發板上:
cs0連線w25q256
cs1連線s25sl032p
cs2(gpio72,亦即WLED_GPIO)連線en25p64
上電開機,觀察TTL輸出,能夠看到如下內容:

[    0.570000] m25p80 spi32766.0: r=0, sreg3=0
[    0.570000] m25p80 spi32766.0: w25q256 (32768 Kbytes)
[    0.580000] 4 ofpart partitions found on MTD device spi32766.0
[    0.600000] Creating 4 MTD partitions on "spi32766.0":
[    0.600000] 0x000000000000-0x000000030000 : "u-boot"
[    0.620000] 0x000000030000-0x000000040000 : "u-boot-env"
[    0.620000] 0x000000040000-0x000000050000 : "factory"
[    0.640000] 0x000000050000-0x000002000000 : "firmware"
[    0.740000] 2 uimage-fw partitions found on MTD device firmware
[    0.760000] 0x000000050000-0x0000001de092 : "kernel"
[    0.760000] mtd: partition "kernel" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[    0.760000] 0x0000001de092-0x000002000000 : "rootfs"
[    0.760000] mtd: partition "rootfs" must either start or end on erase block boundary or be smaller than an erase block -- forcing read-only
[    0.760000] mtd: device 5 (rootfs) set to be root filesystem
[    0.760000] 1 squashfs-split partitions found on MTD device rootfs
[    0.760000] 0x000000470000-0x000002000000 : "rootfs_data"
[    0.760000] m25p80 spi32766.1: r=0, sreg3=0
[    0.760000] m25p80 spi32766.1: found s25sl032p, expected w25q256
[    0.760000] m25p80 spi32766.1: s25sl032p (4096 Kbytes)
[    0.760000] 1 ofpart partitions found on MTD device spi32766.1
[    0.760000] Creating 1 MTD partitions on "spi32766.1":
[    0.760000] 0x000000000000-0x000002000000 : "edisk1"
[    0.760000] mtd: partition "edisk1" extends beyond the end of device "spi32766.1" -- size truncated to 0x400000
[    0.760000] spi-rt2880 10000b00.spi: in rt2880_spi_setup, cs_gpio = 72, status = 0
[    0.760000] m25p80 spi32766.2: r=0, sreg3=0
[    0.760000] m25p80 spi32766.2: found en25p64, expected w25q256
[    0.760000] m25p80 spi32766.2: en25p64 (8192 Kbytes)
[    0.760000] 1 ofpart partitions found on MTD device spi32766.2
[    0.760000] Creating 1 MTD partitions on "spi32766.2":
[    0.760000] 0x000000000000-0x000002000000 : "edisk2"
[    0.760000] mtd: partition "edisk2" extends beyond the end of device "spi32766.2" -- size truncated to 0x800000

總結

通過新增cs-gpios的方式實現了N個spi介面,鑑於spi介面的簡單高效與靈活,大大加強了mt7620晶片的戰鬥力.以後,可以在mt7620上新增spi介面的各種裝置,而不需要有spi介面不夠的顧慮了.

相關推薦

無限可能MT7620新增NSPI介面

前言 我的上一篇文章中談到,如何使能mt7620的第二個spi介面.既然第二個spi介面已經開放成功,那麼,可否接著新增第三個、第四個spi介面呢?熟悉mt7620硬體的朋友一定會第一時間站出來反對我:怎麼可能!?mt7620總共才兩個spi介面,怎麼可能新增更多呢?除

[面試] C++ STL(一)—— 向一個vector中新增N元素,平均的新增的效能是?

考慮如下的程式碼輸出: int N = 100; vector<int> v; set<int> s; for (int i = 0; i < N; ++i) { s.insert(v.capacity());

在K3s上使用Kong閘道器外掛,開啟K3s的無限可能

我的工作中很重要的一部分是參加各種各樣的技術會議。最近參加的是去年11月的北美KubeCon,在會議的最後一天,所有人都焦頭爛額,我也一直機械地向不同的人重複我的自我介紹。後來,我已經十分煩躁,決定逃離人群好好聽一場演講。無意間,我碰上了Darren Shepherd的演講,他是Rancher的CTO,他的演

Bellman-Ford算法——什麽要循環V-1次?圖有n點,又不能有回路,所以最短路徑最多n-1邊。又因為每次循環,至少relax一邊所以最多n-1次就行了

bold source 頂點 路由 偽代碼 font 端點 -a 自底向上 單源最短路徑 給定一個圖,和一個源頂點src,找到從src到其它所有所有頂點的最短路徑,圖中可能含有負權值的邊。 Dijksra的算法是一個貪婪算法,時間復雜度是O(VLogV)(使用最小堆)。但是

n括號對的所有可能情況

括號 main color 思路 出棧 gin col r+ div 所有可能情況的數量為卡特蘭數。故求所有可能的出棧情況與此類似。 思路: 若左括號沒全插入,則插入左括號; 若已插入左括號數比已插入右括號數多,則插入右括號; 1 #include<st

在0~N數字中,取指定個數的不重復數字,要求這些數字的和指定值,求所有結果

readline tco write span count string rgs logs index 1 using System; 2 using System.Collections.Generic; 3 using System.Linq;

n臺階,每次都可以走一步,走兩步,走三步,走到頂部一共有多少種可能

bsp return 頂部 htm pri 每次 lan href com 分析 第一個臺階 1第二個臺階 11 2 //走兩次1步或者走1次兩步第三個臺階 111 12 21 3 第四個臺階 1111 112 121 211 22 13 31 思想:4階臺階

使用shell腳本新增20用戶密碼隨機5字符

shell腳本新增用戶#!/bin/bashfor ((i=1;i<=20;i++))doa=$(cat /dev/urandom | head -n 10 | md5sum | head -c 5)useradd user$i &> /dev/nullecho user$i 用戶創建成

不能再忽視了寶寶不肯吃粥的N原因,你避免了幾

time 模仿 tle 很多 con AI ref avatar ava 輔食不懂怎麽添加? 寶寶吃飯愛挑食? 營養均衡和多樣化的輔食 在這裏你都能找到 寶寶輔食微課堂 不能再忽視了!寶寶不肯吃粥的N個原因,你避免了幾個? 2017-10-09 09:35

可能也罵過這兩面試題

基本 ges term 功能 cto 外包 shadow RoCE 隨著 不知不覺,搞Java開發有7年了,經歷過不少的面試,也面試過不少人.這中間遇到過各種問題,今天就來聊聊其中爭議最大的兩個問題,第一個是大學學歷的問題,我們戲稱為科班與非科班的出身問題;第二個呢就是項目

現有n 亂序數,都大於 1000 ,讓取排行榜前十,時間復雜度o(n), top10, 或者 topK,應用場景榜單Top:10

刪除 有序列表 urn 排行榜 i+1 shuffle pytho 一個 .sh 一、topK python實現 def topk(k, lst): top = [0 for i in range(k)] #生成一個長度為K 的有序列表 for item i

深入淺出maven系列(三)---maven構建ssh工程(父工程與子模組的拆分與耦合) 前一節我們初識了maven並且掌握了maven的常規使用,這一節就來講講它的一個重要的場景,也就是通過maven將一個ssh專案分隔不同的幾部門獨立開發,很重要,加油!!!

        前一節我們初識了maven並且掌握了maven的常規使用,這一節就來講講它的一個重要的場景,也就是通過maven將一個ssh專案分隔為不同的幾個部門獨立開發,很重要,加油!!! 一、maven父工

C語言,有N硬幣面值a[1]...a[N],給一個非負數m,用這些硬幣湊成m,求有多少種方法?

#include <stdio.h> #include <memory.h> #define N 1000 #define M 100000 int a[N]; int DP[M]; int dpItUnlimited(int m, i

計算一個N選項中和X的所有組合數

 下面就是一個最近微信上流傳的一個測試: 假如5塊錢可以買一個女朋友,你會買什麼樣的?下面是每項的價格 有錢-4元, 長得好看-3元, 會做飯-3元, 忠誠-3元, 處女-2元, 溫柔-2元, 活潑可愛-2元, 大長腿-1元, 聰明-1元, 胸大-1元 --計算從

設任意n整數存放於陣列A[1..n]中,試編寫演算法,將所有正數排在所有負數前面(要求:演算法時間複雜度O(n))。

注意陣列的實際長度 #include <iostream> using namespace std; void sort(int A[],int n) { int i=0;//陣列的頭下標 int j,x; j=n-1;//陣列的尾下標 while

n球放入m盒子是否空”的方案數

如題:n個小球放到m個盒子裡的方案數 1、球相同,盒子不同,不允許空 分成m段,n-1個空選m-1個放隔板 , C

CF E. Vasya and a Tree】 dfs+樹狀陣列(給你一棵n個節點的樹,每個點有一個權值,初始全0,m次操作,每次三個數(v, d, x)表示只考慮以v根的子樹,將所有與v點距離小於等於d的點權值全部加上x,求所有操作完畢後,所有節點的值)

題意: 給你一棵n個節點的樹,每個點有一個權值,初始全為0,m次操作,每次三個數(v, d, x)表示只考慮以v為根的子樹,將所有與v點距離小於等於d的點權值全部加上x,求所有操作完畢後,所有節點的值   首先要明確兩件事情性質1.每個人的操作只會影響到他的子孫(包括自己) 性質1.每個人的操

從鍵盤任意輸入n實數,分別計算並輸出其中正數的平均值和負數的平均值,需要考慮可能出現的異常,並給出異常處理

異常一共也就幾種,陣列越界,分母為0異常     第一種交給jvm處理 package chuki; import java.util.*; public class Two { public static void main(String[] args)

設有n正整數,將他們連線成一排,組成一個最大的多位整數。 如:n=3時,3整數13,312,343,連成的最大整數34331213。

題目描述 設有n個正整數,將他們連線成一排,組成一個最大的多位整數。 如:n=3時,3個整數13,312,343,連成的最大整數為34331213。 如:n=4時,4個整數7,13,4,246連線成的最大整數為7424613。 輸入描述: 有多組測試樣例,每組測試樣例包含兩行,第一行為一

輸入n整數,輸出其中最小的k/華機試(C/C++)

題目描述 輸入n個整數,輸出其中最小的k個。 詳細描述: 介面說明 原型: bool GetMinK(unsignedint uiInputNum, int * pInputArray, un