设为首页 加入收藏

TOP

在f1c100s芯片上移植spi网卡enc28j60的linux驱动(二)
2023-09-09 10:25:37 】 浏览:175
Tags:f1c100s spi 网卡 enc28j60 linux 驱动
0的pinctrlssp2的不一样?
  • interrupt-parentinterrupts是什么鬼?在全志平台上这俩参数应该咋写?
  • 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有外部中断,所以在选取引脚时要特别注意,而且要关注这个引脚是否被开发板引出了。

    第一步:配置Menuconfig

    终端输入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
    首页 上一页 1 2 3 4 下一页 尾页 2/4/4
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇使用Yocto进行嵌入式Linux开发3 T.. 下一篇S905L3A(M401A)拆解, 运行EmuELEC..

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目