之前呢,我們講解了在內核中pinctrl子系統是怎么實現的,今天我們來嘗試一下自己去寫一個pinctrl子系統:
首先呢,我們來看看一個pinctrl子系統需要做的事情:
上面的話,我們看了一個pinctrl子系統需要的三大功能以及在驅動程序中對應的三大結構體
下面我們來看看編寫驅動程序時我們需要干什么:
我們是需要去搭建倆個驅動程序的,一個是pin controller設備節點的驅動程序,一個是client設備節點的驅動程序
設備樹文件已經給出了,下面我們來看看驅動程序應該怎么去寫:
下面我們來慢慢看:
我們先來把驅動程序的框架搭建出來:
接著就是去構建platform_deiver結構體了:
這樣子在驅動程序和設備樹節點通過compatible屬性匹配后,probe函數就會被調用,那么在這里面,我們就需要去解析設備樹,也就是需要去實現Pinctrl desc結構體:
首先就是分配pinctrl desc結構體了:
接著就是去設置了:
第一個作用就是去描述引腳了,單個引腳就只需要靠pins npins去描述就行,對于一組引腳,我們就需要去配置相應的結構體virtual_pctrl_ops去進行描述了:
接著就是實現這個結構體里面的函數指針了:第一個就是獲取一共有多少組,我們這里為了圖方便,這里一個引腳就代表一組吧:
所以我們這個函數只需要去返回引腳的數量就行了
接著就是獲取組的名字:
一樣的,我們只需要去返回pins結構體數組里面的名字就行
接著就是去獲取組的引腳:
那個把設備樹上面的信息轉換成mapping結構體我們后面再講,因為有點復雜,我們接著來看probe函數:
接著就是去設置pinctrl子系統的第二個功能,也就是引腳復用了,一樣的,我們只需要去配置好virtual_pmx_ops結構體就可以了:
先來看第一個函數,這個是用來查看一共有多少個功能的:這里面全是靜態的,是比較簡單的,其實還有一種動態的從設備樹里面去獲取的方法
第二個就是去獲取這個功能的名字了:
第三個就是獲取指定功能的引腳組:
最后一個也就是最重要的,也就是去把對應的組設置成指定的功能:但是因為沒有硬件寄存器去給我們操作,所以我們去打印信息就行了,畢竟只是虛擬的嘛,所以沒有必要去搞的那么復雜
那么pinctrl子系統的第二個功能,引腳復用就講完了,我們再回看probe函數:
第三個功能就是去配置引腳功能了:
這樣子就大概虛擬的把指定的引腳設置成相應的配置模式了
那么我們去設置pinctrl desc結構體就搞完了,最后去注冊就行了:
那么我們就只剩下怎么去從設備樹中去注冊一個Mapping結構體了,client驅動只需要去寫一個簡單的platform_driver就可以了
接著我們來看看怎么去注冊mapping結構體:
那么到這里,我們就徹底講完啦,完結,撒花(doge.)