kevin_me 发表于 2013-4-21 23:22:36

Linux下移植ENC424J600网卡驱动,SPI接口初始化的相关问题

本帖最后由 kevin_me 于 2013-4-21 23:23 编辑

刚刚接触linux,需要通过SPI接口扩展一个以太网口出来,选的ENC424J600网卡芯片。

准备工作期间,看了套接字编程、LDD3及相关书籍,看的过程中很是痛苦,很多概念都没有,理解起来更是困难,不过反复看之后还是有点认识。最近开始动手了,网上整合了一个该芯片的驱动程序,menuconfig将该芯片下的网卡作为buit in配置进去了,然后在ARM芯片的C文件中,注册了相关IO资源。

折腾一番编译通过,发现ENC424J600倒是能在系统内核初始化的过程中被执行,可是搞了几天,连enc的probe初始化函数都跑不过去,返回信息是“enc424j600 chip not found,probe of spi1.0 faild with error -5”

发现是enc424j600_hw_init(priv);这个函数没跑对,并且返回了-1。

我用的CPU是AT91SAM9M10G45,基于该芯片的官方开发板做的一个板子。
这个CPU有2路SPI接口,原来的开发板使用SPI0去做了个dataflash,我另外使用的SPI1做的网卡扩展。

因此在board-sam9m10g45ek.c中,对于SPI设备,我新增了一个结构体来描述网卡。
/*
* SPI devices.
*/
static struct spi_board_info ek_spi_devices[] = {
        {       
               
                // DataFlash chip 这是开发板本身使用的
                .modalias        = "mtd_dataflash",
                .chip_select        = 0,
                .max_speed_hz        = 15 * 1000 * 1000,
                .bus_num        = 0,
        },
        {       
                // enc424j600 chip 这是我自己扩展的
                .modalias        = "enc424j600",
                .chip_select        = 0,
                .max_speed_hz        = 10 * 1000 * 1000,
                .bus_num        = 1,
                .mode                = 0,
                .irq                 = AT91_PIN_PD18,
        },
};

而且我板子的走线,也是按照CPU的SPI1那4根线走的,也不需要我另外写代码分配,在at91sam9g45_devices.c里面有相关 字段描述:
在函数void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)中

以下是初始化CS线
        /* Choose SPI chip-selects */
        for (i = 0; i < nr_devices; i++) {
                if (devices.controller_data)
                        cs_pin = (unsigned long) devices.controller_data;
                else if (devices.bus_num == 0)
                        cs_pin = spi0_standard_cs.chip_select];
                else
                        cs_pin = spi1_standard_cs.chip_select];

                if (devices.bus_num == 0)
                        enable_spi0 = 1;
                else
                        enable_spi1 = 1;

以下是初始化通讯接口
if (enable_spi1) {
                at91_set_A_periph(AT91_PIN_PB14, 0);        /* SPI1_MISO */
                at91_set_A_periph(AT91_PIN_PB15, 0);        /* SPI1_MOSI */
                at91_set_A_periph(AT91_PIN_PB16, 0);        /* SPI1_SPCK */

最后在board-sam9m10g45ek.c中,static void __init ek_board_init(void)会把各类硬件资源添加到内核
包括SPI:
        /* SPI */
        at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));

最近几天的成果就是这些了,也不知道需不需要再另外单独设置CS口为输出方向,然后用SPI操作ENC芯片的时候,需要将CS线拉低,用完之后再拉高,但是我追踪代码,并未看见这样的操作,或许是linux的封装太精巧了,我实在是看不到那些底层的操作,搞单片机习惯了,总想看程序怎么走的。
然后ENC的中断引脚连至CPU的PD18,因此在上面我写了.irq = AT91_PIN_PD18,也不知道还需不需要有额外的声明什么的

Linux水太深了,我已经快淹死了。
请教谁搞过硬件驱动开发或移植的,指点一下,非常感谢。

驱动程序移植来源,猛击我

这老外这对这个芯片写了几版程序,我用的是最新的,应该不会有什么严重问题,而我现在需要做的,仅仅是将它注册到内核中去。

kevin_me 发表于 2013-4-21 23:24:48

好奇怪啊,编辑了2次,怎么我后半段的文字成了斜体?

kevin_me 发表于 2013-4-22 21:51:41

单机版吗,求回复

cuilikun 发表于 2013-4-23 10:59:16

我也在用ENC424J600做以太网通信,调了快2个月了,也没啥进展,请问你用这款芯片要实现什么功能呀

cuilikun 发表于 2013-4-23 11:12:42

可以把你的驱动该芯片的程序分享一下吗

kevin_me 发表于 2013-4-23 11:47:34

cuilikun 发表于 2013-4-23 11:12 static/image/common/back.gif
可以把你的驱动该芯片的程序分享一下吗

你是在linux下做驱动吗?
我之前单片机裸奔用这款芯片倒是可以,现在刚刚接触linux,在硬件接口初始化这块遇到了问题。
驱动程序在我楼主位里面有链接。

cuilikun 发表于 2013-4-23 15:43:34

我只是做简单的跟PC机进行收发数据即可,请问楼主用的是什么类型的单片机呀,可以把代码跟我共享一下吗?我看了MICROCHIP官网提供的例程,看不懂,希望得到你的帮助

kevin_me 发表于 2013-4-23 16:11:25

cuilikun 发表于 2013-4-23 15:43 static/image/common/back.gif
我只是做简单的跟PC机进行收发数据即可,请问楼主用的是什么类型的单片机呀,可以把代码跟我共享一下吗?我 ...

现在用的是AT的ARM9,之前用过的是MCHP的dspic30f6014A,也是移植官网的协议栈,你现在是要实现什么功能?TCPIP,应用层准备跑什么协议?
你可以看看AN833这个文档,官方的

cuilikun 发表于 2013-4-23 16:14:34

可以把AN833这个文档发给我

cuilikun 发表于 2013-4-23 16:17:28

我要实现的功能就是替代CAN总线发送数据,能与PC机进行简单的数据通信即可

mysunmax 发表于 2013-4-23 16:20:32

Linux水太深了,我已经快淹死了。

youdianchedan 发表于 2013-5-3 14:32:21

呵呵, 这个东西应该不难吧,内核都有的代码, 注意下 平台下SPI DEVICES 注册的东西应该就可以了

maoxue121225 发表于 2013-5-12 10:58:10

首先你要弄清楚的是你所做的这些都是注册添加了一些AT的芯片的SPI控制器片内外设的驱动跟实际的芯片还没有沾边
或者说你要操作那个网卡芯片可以直接操作这个SPI控制器。但是网卡直接本身的时序及传送消息的过程及方法你并没有在这里体现出来
linux里面已经帮你做好了这些你可以去看看、include/linux/spi.h里面说的比较详细
另外就是AT的片子都有MAC控制器为什么不用MAC+PHY呀?仅是个人意见linux的东西是很复杂没有人指导或者是参考代码很难搞定的
页: [1]
查看完整版本: Linux下移植ENC424J600网卡驱动,SPI接口初始化的相关问题