0的pinctrl
和ssp2
的不一样?
interrupt-parent
和interrupts
是什么鬼?在全志平台上这俩参数应该咋写?
enc28j60_pins
的意图是来一个GPIO的外部中断的引脚配置,这个在全志平台又得咋写?
当时怎么也无法思索出结果,随便瞎折腾了好几个星期,最后还是放弃了,又因为学业繁重,备战高考,一年多也没碰过这个荔枝派。高三后再试了一次,还是以失败告终。高一暑假买了荔枝派回来吃灰,高二暑假开始尝试却啥也不懂,高三暑假再次放弃,这一切成了我的一个心结,直到来到华子的一周年纪念日,我才琢磨出了这一切。
第二次移植过程
这几天突然发现可以在linux代码仓库里边用它的搜索功能全局搜索想要的代码,于是我就开始了递归学习。打开suniv-f1c100s.dtsi
,对这里边的compatible
等字符串一顿乱搜,终于发现了sunxi
做bsp驱动移植的秘密,但是这些太复杂了,说也说不完,让我们直接开始移植。前置条件是首先应该先准备好一个已经调通的uboot、内核与根文件系统。
第零步:接线
VCC ---> 3V3
CS ---> PE7 (SPI1_CS)
SI ---> PE8 (SPI1_MOSI)
SCK ---> PE9 (SPI1_CLK)
SO ---> PE10 (SPI1_MISO)
INT ---> PE11
GND ---> GND
需要注意的是,全志f1c系列芯片只有GPIOD GPIOE GPIOF有外部中断,所以在选取引脚时要特别注意,而且要关注这个引脚是否被开发板引出了。
终端输入make menuconfig
,使能以下config:
Device Drivers ---> Network device support ---> Ethernet driver support ---> Microchip devices ---> ENC28J60 support
Device Drivers ---> SPI support
ENC28J60可以编译为模块,也可以直接编译进内核。保存.config
。
第二步:修改设备树
接着让我们修改设备树。根据驱动开发者留给我们的文档,我们初步的设备树需要的改动如下:
suniv-f1c100s.dtsi
:在pinctrl下加入spi和enc28j60的中断引脚定义
pio: pinctrl@1c20800 {
compatible = "allwinner,suniv-f1c100s-pinctrl";
reg = <0x01c20800 0x400>;
interrupts = <38>, <39>, <40>;
clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&osc32k>;
clock-names = "apb", "hosc", "losc";
gpio-controller;
interrupt-controller;
#interrupt-cells = <3>;
#gpio-cells = <3>;
uart0_pe_pins: uart0-pe-pins {
pins = "PE0", "PE1";
function = "uart0";
};
uart1_pa_pins: uart1-pa-pins {
pins = "PA2", "PA3";
function = "uart1";
};
mmc0_pins: mmc0-pins {
pins = "PF0", "PF1", "PF2", "PF3", "PF4", "PF5";
function = "mmc0";
};
spi0_pins: spi0-pins{
pins = "PC0", "PC1", "PC2", "PC3";
function = "spi0";
};
spi1_pins: spi1-pins{
pins="PE9","PE7","PE10","PE8";
function = "spi1";
};
enc28j60_pins: enc28j60_pins{
pins="PE11";
function = "irq";
};
};
改变引脚基本就是对着手册和文档照猫画虎的事情,这个引脚的function应该如何选取呢?让我们打开内核代码中的pinctrl-suniv-f1c100s.c
:
SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7),
SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "csi"), /* D4 */
SUNXI_FUNCTION(0x3, "uart2"), /* TX */
SUNXI_FUNCTION(0x4, "spi1"), /* CS */
SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 7)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8),
SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "csi"), /* D5 */
SUNXI_FUNCTION(0x3, "uart2"), /* RX */
SUNXI_FUNCTION(0x4, "spi1"), /* MOSI */
SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 8)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9),
SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "csi"), /* D6 */
SUNXI_FUNCTION(0x3, "uart2"), /* RTS */
SUNXI_FUNCTION(0x4, "spi1"), /* CLK */
SUNXI_FUNCTION_IRQ_BANK(0x