enc28j60网卡驱动模块添加进linux内核,Kconfig,Makefile配置过程

这里是要把http://www.cnblogs.com/hackfun/p/6260396.html中的enc28j60网卡驱动模块,添加到2.6.22.6内核中,这个模块代码不需要任何修改。只需要在内核目录下的相关配置脚本文件,如Makefile,Kconfig,.config等,修改某些配置就行。

enc28j60网卡驱动模块使用到的几个文件:

enc28j60.c

enc28j60_hw.h

spi_bitbang.c

spi_s3c24xx.c

spi_platform_dev.c

实际上spi_bitbang.c,spi_s3c24xx.c为内核原生文件,也不需要任何改动。在http://www.cnblogs.com/hackfun/p/6260396.html这个例子中,我的内核没有把这两个文件编译进去。因此需要手动把这两个文件加载进去。

在这里,我们在内核添加

enc28j60.c

enc28j60_hw.h

spi_platform_dev.c

这3个文件即可。

enc28j60.c,enc28j60_hw.h这两个文件,是与平台无关的网络驱动,因此把他们放到linux-2.6.22.6/drivers/net目录下。

spi_platform_dev.c是与平台硬件有直接关系,因此把它放到linux-2.6.22.6/arch/arm/plat-s3c24xx目录下。

1. 把spi模块添加进内核

a. 进入到linux-2.6.22.6源码目录下

make makeconfig

这样,就会在中端显示图形界面的内核配置菜单,找到SPI相关的配置:

Device Drivers  --->

SPI support  --->

[*] SPI support

[*] SPI Master Support

<*>   Bitbanging SPI master

<*>   Samsung S3C24XX series SPI

<M>   Samsung S3C24XX series SPI by GPIO

在[]或<>的条目按空格键,*号表示把相关的模块文件添加进内核,M表示把相关的文件编译成模块,不添加到内核,空格表示不配置:如

[*] SPI support  设置把linux-2.6.22.6\drivers\spi目录添加到上层drivers目录

[*] SPI Master Support  设置把spi.c添加进内核

<*>   Bitbanging SPI master  设置把spi_bitbang.c添加进内核

<*>   Samsung S3C24XX series SPI 设置把spi_s3c24xx.c添加内核,硬件SPI

<M>   Samsung S3C24XX series SPI by GPIO  设置把spi_s3c24xx_gpio.c生成模块,模拟SPI

b. 退出配置菜单,保存,会在linux-2.6.22.6源码目录下生成.config文件。

vi .config

找到SPI的相关配置:

#
# SPI support
#
CONFIG_SPI=y
# CONFIG_SPI_DEBUG is not set
CONFIG_SPI_MASTER=y

#
# SPI Master Controller Drivers
#
CONFIG_SPI_BITBANG=y
# CONFIG_SPI_BUTTERFLY is not set
CONFIG_SPI_S3C24XX=y
CONFIG_SPI_S3C24XX_GPIO=m

#
# SPI Protocol Masters
#
# CONFIG_SPI_AT25 is not set
# CONFIG_SPI_SPIDEV is not set

对应关系:

[*] SPI support  对应生成配置CONFIG_SPI=y

[*] SPI Master Support 对应生成配置 CONFIG_SPI_MASTER=y

<*>   Bitbanging SPI master 对应生成配置 CONFIG_SPI_BITBANG=y

... ....

[]或<>里面是空格的,对应生成CONFIG_XXX is not set

也就是说如果不使用make menuconfig图形界面, 可以直接修改.config文件。

c. 在各层Kconfig和Makefile的配置关系

linux-2.6.22.6\drivers\Kconfig

... ...
source "drivers/spi/Kconfig"
... ...

linux-2.6.22.6\drivers\Makefile

... ...
obj-$(CONFIG_SPI)        += spi/
... ...

linux-2.6.22.6\drivers\spi\Kconfig,这个文件里的配置是用于make menuconfig里的菜单项显示,如make menuconfig之后。"config SPI"会在linux-2.6.22.6\.config生成CONFIG_SPI的宏,

make menuconfig中的[*] SPI support  对应生成配置CONFIG_SPI=y

... ...
config SPI
    bool "SPI support"
    help
      The "Serial Peripheral Interface" is a low level synchronous
      protocol.  Chips that support SPI can have data transfer rates
      up to several tens of Mbit/sec.  Chips are addressed with a
      controller and a chipselect.  Most SPI slaves don‘t support
      dynamic device discovery; some are even write-only or read-only.

      SPI is widely used by microcontrollers to talk with sensors,
      eeprom and flash memory, codecs and various other controller
      chips, analog to digital (and d-to-a) converters, and more.
      MMC and SD cards can be accessed using SPI protocol; and for
      DataFlash cards used in MMC sockets, SPI must always be used.

      SPI is one of a family of similar protocols using a four wire
      interface (select, clock, data in, data out) including Microwire
      (half duplex), SSP, SSI, and PSP.  This driver framework should
      work with most such devices and controllers.

... ...
config SPI_MASTER
    boolean "SPI Master Support"
    help
      If your system has an master-capable SPI controller (which
      provides the clock and chipselect), you can enable that
      controller and the protocol drivers for the SPI slave chips
      that are connected.
... ...

config SPI_BITBANG
    tristate "Bitbanging SPI master"
    depends on SPI_MASTER && EXPERIMENTAL
    help
      With a few GPIO pins, your system can bitbang the SPI protocol.
      Select this to get SPI support through I/O pins (GPIO, parallel
      port, etc).  Or, some systems‘ SPI master controller drivers use
      this code to manage the per-word or per-transfer accesses to the
      hardware shift registers.

      This is library code, and is automatically selected by drivers that
      need it.  You only need to select this explicitly to support driver
      modules that aren‘t part of this kernel tree.

... ...

config SPI_S3C24XX
    tristate "Samsung S3C24XX series SPI"
    depends on SPI_MASTER && ARCH_S3C2410 && EXPERIMENTAL
    help
      SPI driver for Samsung S3C24XX series ARM SoCs

... ...

linux-2.6.22.6\drivers\spi\Makefile

... ...
obj-$(CONFIG_SPI_MASTER)        += spi.o
... ...
obj-$(CONFIG_SPI_BITBANG)        += spi_bitbang.o
... ...
obj-$(CONFIG_SPI_S3C24XX)        += spi_s3c24xx.o
... ...

d. 修改完以上配置之后,在linux-2.6.22.6目录下输入:

make uImage

进行编译,耐心等候。。。。。。。。。。。。。。

编译完之后,通过观察编译输出信息,验证一下到底有没有编译进内核,第一次编译输出的信息太多不好找。可以打开

spi_bitbang.c

spi_s3c24xx.c

这两个文件,分别在里面空白的地方输入一个空格,保存,再编译,会看到以下信息:

... ...
  CC      drivers/spi/spi_bitbang.o
  CC      drivers/spi/spi_s3c24xx.o
... ...

到这里,SPI的驱动就已经添加到内核了

2. enc28j60的驱动的添加方法也是类似的,这里只给出基于JZ2440自带内核的修改地方不再分析Kconfig和Makefile的配关系。

linux-2.6.22.6\drivers\net\Kconfig

... ...
config ENC28J60
    tristate "ENC28J60 support"
    depends on NET_ETHERNET
    ---help---
      Support for ENC28J60 chipset.

      To compile this driver as a module, choose M here and read
      <file:Documentation/networking/net-modules.txt>.  The module will be
      called enc28j60.
... ...

linux-2.6.22.6\drivers\net\Makefile

... ...
obj-$(CONFIG_ENC28J60) += enc28j60.o
... ...

make menuconfig

Device Drivers  --->
    Network device support  --->
        Ethernet (10 or 100Mbit)  --->
            <*> ENC28J60 support 

linux-2.6.22.6\arch\arm\plat-s3c24xx\Makefile

... ...
obj-$(CONFIG_CPU_S3C244X)    += s3c244x.o spi_platform_dev.o
... ... 

3. 重新编译

make uImage

4. 烧写

烧写uImage到开发板中

5. 启动

a. 启动起来后,看内核打印的信息:

查看驱动加载情况

b. 让系统挂载系统文件之后,配置eth1(enc28j60)

vi /etc/init.d/rcS

添加:

ifconfig eth1 192.168.1.12 netmask 255.255.255.0 up

重新启动,看网络配置情况

关闭eth0,自动切换到eth1挂载nfs

到这里,enc28j60已经可以正常工作了

时间: 2024-10-07 00:36:05

enc28j60网卡驱动模块添加进linux内核,Kconfig,Makefile配置过程的相关文章

【总结】嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World【转】

本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/73772109 为了弄清内核的组织结构,我们先来实现下面这个简单的例子. 一.增加内核启动Hello World 任务: 内核启动的时候加载Hello驱动,并打印出Hello World 步骤: (1)在drivers目录下新建hello文件夹,在里面实现相应的hello.c.Makefile.Kconfig (2)修改上一级(Linux-3.4.2/drivers下)的Make

linux内核结构和启动过程

(以下内容来自教学课件) 一.Linux内核结构 arch 与体系结构相关的代码.对应于每个支持的体系结构,有一个相应的子目录如x86.arm等与之对应,相应目录下有对应的芯片与之对应 drivers 设备驱动代码,占整个内核代码量的一半以上,里面的每个子目录对应一类驱动程序,如:char:字符设备.block:块设备.net:网络设备等 fs 文件系统代码,每个支持的文件系统有相应的子目录,如cramfs,yaffs,jffs2等 include 这里包括编译内核所需的大部分头文件 与平台无关

Linux内核,文件系统移植过程中出现的一些问题与解决办法

1.bootm地址和load address一样 此种情况下,bootm不会对uImage header后的zImage进行memory move的动作,而会直接go到entry point开始执行.因此此时的entry point必须设置为load address + 0x40.如果kernel boot过程没有到uncompressing the kernel,就可能是这里设置不对. boom address == load address == entry point - 0x40 2.

Linux LVM逻辑卷配置过程详解

Linux LVM逻辑卷配置过程详解 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据,甚至被迫重新规划分区并重装操作系统,以满足应用系统的需要. LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上.文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性.RHEL5默认安装的分区格式就是LVM逻辑卷的格式,需要注意的是/boot分区不能基于LVM创建,必须独立出

记录一则Linux SSH的互信配置过程

需求:四台Linux主机,IP地址为192.168.10.10/11/12/13,配置root用户的等价性1.各节点ssh-keygen生成RSA密钥和公钥 ? 1 ssh-keygen -q -t rsa  -N "" -f  ~/.ssh/id_rsa 2.将所有的公钥文件汇总到一个总的授权key文件中在10执行汇总: ? 1 2 3 4 ssh 192.168.10.10 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

linux内核编译,配置本机驱动

1.前言  编译linux内核失败的原因很多时候就是驱动选错,适合自己本机的驱动没编译进去.面对特殊平台(或者有些洁癖者,我就是^_^),要编译精简内核,只要本机驱动,其他都不需要.面对内核里面这么多驱动,不懂硬件的我们,看到都头大.本人第一次安装gentoo的时候,内核编译了5次,前4次主要失败原因是以太网卡驱动.无线网卡驱动.显卡驱动.声卡驱动都没一次性配置正确.虽然gentoo提供了genkernel命令,可以自动帮你编译内核,但还是想自己手工尝试下. 2.获取本机驱动信息 既然跟内核挂钩

linux内核关于uart2配置为RTS引脚时,串口无法使用的问题

前言: 在linux中,当gpio被配置为串口或者其他作用功能时,是无法再文件系统中再将该gpio进行导出(echo xx > /sys/class/gpio/export)的,内核不允许,因为你的该引脚已经作为其他功能使用. 在对linux内核进行配置时,make menuconfig 配置串口uart2为带有RTS引脚的情况.然后make编译内核,结果运行到板子上,在文件系统下确实能够导出该串口对应的gpio引脚的,这肯定是不正确的,经过测试,确实发现,此时的串口确实无法工作,像是失去了串口

安卓驱动开发(四)----安卓内核与linux内核的安装配置

安卓中的源代码包括安卓系统中的应用程序的源代码,SDK带的各种工具的源代码,NDK的源代码以及HAL源代码. 安卓源代码可以全部下载,也可以下载一部分.之后要对安卓的源代码进行编译,在编译后,会在安卓源代码根目录下生成一个out目录,所有编译的目标文件都在这个目录中,在out目录中有两个直接子目录,分别是host和target.前者表示在主机(x86)生成的工具,后者表示目标机(模认为ARMv5)运行的内容.在target中,包含两个直接子目录,分别是common和product.common包

linux 内核驱动加载过程中 向文件系统中的文件进行读写操作

utils.h 文件: #ifndef __UTILS_H__ #define __UTILS_H__ void a2f(char *s); #endif utils.c 文件: #include <linux/fs.h> #include <asm/segment.h> #include <asm/uaccess.h> #include <linux/buffer_head.h> #include <linux/string.h> #inclu