移植IXP驱动到uClinux2008
移植IXP驱动到uClinux2008
早年写的笔记,压箱底了,翻出来晒晒
目录
移植IXP驱动到uClinux2008. 1
实验环境... 1
配置,编译uClinux2.4(20080808)... 2
配置编译IXP驱动... 5
编译Intel_IXP400_Access_Library. 5
给Intel_IXP400_Access_Library打补丁... 5
修改OemMake.mk文件... 6
修改makefile文件... 6
修改IxEthDBSymbols.c. 7
加入autoconf.h. 7
加入.config. 9
执行编译... 11
编译IXP以太网驱动... 11
集成IXP驱动到ramdisk. 13
在IXP425上启动IXP网卡... 14
配置,编译uClinux2.6(20080808)... 14
配置编译IXP驱动... 17
编译Intel_IXP400_Access_Library. 17
修改makefile. 17
修改IxOsal.h. 24
修改IxLinuxInit.c. 24
修改/IxOsalOs.h. 24
执行编译... 26
编译IXP以太网驱动... 27
集成IXP驱动到ramdisk. 29
在IXP425上启动IXP网卡... 29
实验环境
u IXDP425 266Mhz 64M ram16M flash
u FC4: kernel 2.6.11-1.1369_FC4smp(FC6 也行),安装在虚拟机上
u arm-linux-tools-20051123.tar.gz: gcc 3.4.4编译器
u uClinux-dist-20080808.tar.bz2
u snapgear-modules-20071004.sh: snapgear 发布的uClinux 包补丁
u Kernel files in /home/linuxuser/snapgear
u GPL_ixp400LinuxEthernetDriverPatch-1_7.zip
u BSD_ixp400AccessLibrary-2_4.zip
u IPL_ixp400NpeLibrary-2_4.zip
配置,编译uClinux2.4(20080808)
#cd /home/linuxuser/uClinux-dist
因为是首次执行make menuconfig,可能会提示没有默认的config文件,那么按crtl-c退出。这时候会产生一个默认.config。第二次执行make menuconfig就能进入菜单。
2. 选择Vendor/Product Selection--> Vendor (Intel)/ Intel Products(IXDP425)
3. 在Kernel/Library/Defaults Selection选中如下几项
4. 选择general setup--> Default kernel command string,原始语句是
ttyS0,115200root=/dev/ram0 initrd=0x00800000,8Mmem=64M@0x00000000
ttyS1,115200root=/dev/ram0 initrd=0x00800000,8Mmem=64M@0x00000000
选中Force default kernel command string
4. 在Main Menu->Networking options选中QoS and/or fair queueing。
配置编译IXP驱动
编译Intel_IXP400_Access_Library
给Intel_IXP400_Access_Library打补丁
#cd /home/linuxuser/ixp/ixp_lib24
#unzip BSD_ixp400AccessLibrary-2_4.zip
#unzip IPL_ixp400NpeLibrary-2_4.zip
#patch -p1 < modules-csr2.4-20071004.patch
修改OemMake.mk文件
打开\ixp_osal\platforms\ixp42X\os\linux\make\OemMake.mk,将
CFLAGS_ETC =-mapcs-32 -mshort-load-bytes
修改makefile文件
打开/home/linuxuser/ixp/ixp_lib24/Makefile
KERNELDIR=/home/linuxuser/uClinux-dist/linux-2.4.x
CFLAGS +=-DEXPORT_SYMTAB -DIX_OSAL_OEM_FAST_MUTEX
2. 将-include $(ROOTDIR)/modules/.config改为
ixobj :=$(ROOTDIR)/modules/ixp425/ixp400-2.4
#ixobj :=$(ROOTDIR)/modules/ixp425/ixp400-2.4
3.删除IXCFLAGS += -I$(ROOTDIR),在IXCFLAGS +=-I$(ixobj)/ixp_osal/platforms/$(IX_DEVICE)/os/linux/include
IXCFLAGS += -I/home/linuxuser/uClinux-dist/include
IXCFLAGS += -I/home/linuxuser/uClinux-dist/linux-2.4.x/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/featureCtrl/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/npeDl/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/npeMh/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/ethAcc/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/ethDB/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/ethMii/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/featureCtrl/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/npeDl/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/npeMh/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/oslinux/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/osServices/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/ossl/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/qmgr/include
$(LD) -EB -r-o $@ $(ixp400-objs)
修改IxEthDBSymbols.c
打开ixp400_xscale_sw\src\ethDB\IxEthDBSymbols.c,将
加入autoconf.h
新建autoconf.h文件,将其复制到/home/linuxuser/ixp/ixp_lib24/ixp_osal/common/include/modules, 内容如下:
* Automatically generated by make menuconfig:don't edit
#undef CONFIG_OCF_RANDOMHARVEST
#undef CONFIG_OCF_IXP4XX_SHA1_MD5
#defineCONFIG_IXP400_LIB_MODULE 1
#defineCONFIG_IXP400_LIB_2_4 1
#defineCONFIG_IXP400_ETH_MODULE 1
#undef CONFIG_IXP425_IXP_AS_ETH
#defineCONFIG_IXP400_ETH_2_4 1
#defineCONFIG_IXP400_ETH_ALL 1
#undef CONFIG_IXP400_ETH_NPEB_ONLY
#undef CONFIG_IXP400_ETH_NPEC_ONLY
#undef CONFIG_IXP400_ETH_SKB_RECYCLE
#undef CONFIG_IXP400_ETH_QDISC_ENABLED
#undef CONFIG_IXP425_COMPONENT_ADSL
#undef CONFIG_IXP425_COMPONENT_ATMDACC
#undef CONFIG_IXP425_COMPONENT_ATMM
#undef CONFIG_IXP425_COMPONENT_ATMSCH
#defineCONFIG_IXP425_COMPONENT_QMGR 1
#defineCONFIG_IXP425_COMPONENT_NPEMH 1
#defineCONFIG_IXP425_COMPONENT_NPEDL 1
#undef CONFIG_IXP425_COMPONENT_CODEC
#defineCONFIG_IXP425_COMPONENT_ETHACC 1
#defineCONFIG_IXP425_COMPONENT_ETHDB 1
#defineCONFIG_IXP425_COMPONENT_ETHMII 1
#undef CONFIG_IXP425_COMPONENT_HSSACC
#defineCONFIG_IXP425_COMPONENT_TIMERCTRL 1
#undef CONFIG_IXP425_COMPONENT_USB
#undef CONFIG_IXP425_COMPONENT_UARTACC
#defineCONFIG_IXP425_COMPONENT_OSSL 1
#defineCONFIG_IXP425_COMPONENT_OSSERVICES 1
#defineCONFIG_IXP425_COMPONENT_FEATURECTRL 1
#undef CONFIG_IXP425_COMPONENT_PERFPROFACC
#undef CONFIG_IXP425_COMPONENT_CRYPTOACC
#undef CONFIG_IXP425_COMPONENT_DMAACC
#undef CONFIG_IXP425_CODELET_ETHAAL5APP
#undef CONFIG_IXP425_CODELET_HSSACC
#undef CONFIG_IXP425_CODELET_ETHACC
#undef CONFIG_IXP425_CODELET_USB
#undef CONFIG_IXP425_CODELET_TIMERS
#undef CONFIG_IXP425_CODELET_PERFPROFACC
#undef CONFIG_IXP425_CODELET_ATM
#undef CONFIG_IXP425_CODELET_DSPENG
#undef CONFIG_IXP425_CODELET_CRYPTOACC
#undef CONFIG_IXP425_CODELET_DMAACC
加入.config
在/home/linuxuser/ixp/ixp_lib24/下新建.config文件,内容如下:
# Automaticallygenerated by make menuconfig: don't edit
#CONFIG_OCF_RANDOMHARVEST is not set
#CONFIG_OCF_CRYPTODEV is not set
#CONFIG_OCF_CRYPTOSOFT is not set
#CONFIG_OCF_IXP4XX_SHA1_MD5 is not set
#CONFIG_OCF_TALITOS is not set
#CONFIG_OCF_OCFNULL is not set
#CONFIG_IXP400_LIB_1_4 is not set
#CONFIG_IXP400_LIB_2_1 is not set
#CONFIG_IXP425_IXP_AS_ETH is not set
#CONFIG_IXP400_NAPI is not set
#CONFIG_IXP400_ETH_NPEB_ONLY is not set
#CONFIG_IXP400_ETH_NPEC_ONLY is not set
#CONFIG_IXP400_ETH_SKB_RECYCLE is not set
#CONFIG_IXP400_ETH_QDISC_ENABLED is not set
#CONFIG_IXP425_COMPONENT_ADSL is not set
#CONFIG_IXP425_COMPONENT_ATMDACC is not set
#CONFIG_IXP425_COMPONENT_ATMM is not set
#CONFIG_IXP425_COMPONENT_ATMSCH is not set
CONFIG_IXP425_COMPONENT_QMGR=y
CONFIG_IXP425_COMPONENT_NPEMH=y
CONFIG_IXP425_COMPONENT_NPEDL=y
#CONFIG_IXP425_COMPONENT_CODEC is not set
CONFIG_IXP425_COMPONENT_ETHACC=y
CONFIG_IXP425_COMPONENT_ETHDB=y
CONFIG_IXP425_COMPONENT_ETHMII=y
#CONFIG_IXP425_COMPONENT_HSSACC is not set
CONFIG_IXP425_COMPONENT_TIMERCTRL=y
#CONFIG_IXP425_COMPONENT_USB is not set
#CONFIG_IXP425_COMPONENT_UARTACC is not set
CONFIG_IXP425_COMPONENT_OSSL=y
CONFIG_IXP425_COMPONENT_OSSERVICES=y
CONFIG_IXP425_COMPONENT_FEATURECTRL=y
#CONFIG_IXP425_COMPONENT_PERFPROFACC is not set
#CONFIG_IXP425_COMPONENT_CRYPTOACC is not set
#CONFIG_IXP425_COMPONENT_DMAACC is not set
#CONFIG_IXP425_CODELET_ETHAAL5APP is not set
#CONFIG_IXP425_CODELET_HSSACC is not set
#CONFIG_IXP425_CODELET_ETHACC is not set
#CONFIG_IXP425_CODELET_USB is not set
#CONFIG_IXP425_CODELET_TIMERS is not set
#CONFIG_IXP425_CODELET_PERFPROFACC is not set
#CONFIG_IXP425_CODELET_ATM is not set
#CONFIG_IXP425_CODELET_DSPENG is not set
#CONFIG_IXP425_CODELET_CRYPTOACC is not set
#CONFIG_IXP425_CODELET_DMAACC is not set
执行编译
#cd ./ixp400_xscale_sw/src/npeDl ;./ixp400_xscale_sw/src/npeDl/ixNpeDlImageConverter
cp./ixp400_xscale_sw/src/npeDl/IxNpeMicrocode.dat ./
cp: cannot stat`./ixp400_xscale_sw/src/npeDl/IxNpeMicrocode.dat': No such file or directory
make: *** [IxNpeMicrocode.dat] Error 1。
再次执行make。就会得到/home/linuxuser/ixp/ixp_lib24/ixp400.o文件。
编译IXP以太网驱动
KERNELDIR=/home/linuxuser/uClinux-dist/linux-2.4.x
IXCFLAGS +=-DIX_MPHYSINGLEPORT=0
IXCFLAGS +=-DIX_ACC_DRAM_PHYS_OFFSET=0
IXCFLAGS +=-DIX_OSAL_OEM_FAST_MUTEX
IXCFLAGS +=-DIX_OSAL_THREAD_EXIT_GRACEFULLY
ifeq($(CONFIG_IXP425_IXP_AS_ETH),y)
IXCFLAGS += -DCONFIG_IXP425_IXP_AS_ETH=1
CSRDIR :=/home/linuxuser/ixp/ixp_lib24
IXCFLAGS +=-I/home/linuxuser/uClinux-dist/include
IXCFLAGS +=-I$(CSRDIR)/ixp400_xscale_sw/src/include
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/include
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/include/modules
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/include/modules/ddk
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/include/modules/bufferMgt
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/include/modules/ioMem
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include
IXCFLAGS += -I$(CSRDIR)/ixp_osal/common/os/linux/include/core
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include/modules
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include/modules/ddk
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include/modules/bufferMgt
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include/modules/ioMem
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/platforms/$(IXPLATFORM)/include
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/platforms/$(IXPLATFORM)/os/linux/include
obj-$(CONFIG_IXP400_ETH)+= ixp400_eth.o
.PHONY: cleanmrproper distclean
rm -f .*o.cmd .*.o.flags *.mod.c *.ko *.o
集成IXP驱动到ramdisk
cp -f/tftpboot/ramdisk.gz ramdisk.gz
cp -rf./ixp400.o ./tmp/lib/modules/ixp425
cp -rf./ixp400_eth.o ./tmp/lib/modules/ixp425
cp -rf./IxNpeMicrocode.dat ./tmp/etc/
cp -rframdisk.gz /tftpboot/ramdisktest.gz
这个时候,应该内核和ramdisk都编译好了,并且在/tftpboot下有一份。那么在/home/linuxuser/ixp/ixp_test下执行
在IXP425上启动IXP网卡
将zImage和ramdisktest.gz下载到板子上,板子启动后执行下面指令。
#cat/etc/IxNpeMicrocode.dat > /dev/ixNpe
这个时候应该就可以ping通192.168.1.0/255网段的地址了
配置,编译uClinux2.6(20080808)
集成补丁的方法和前面的非常类似。内核配置也很相似,只不过位置换了一下。
#cd /home/linuxuser/uClinux-dist
因为是首次执行make menuconfig,可能会提示没有默认的config文件,那么按crtl-c退出。这时候会产生一个默认.config。第二次执行make menuconfig就能进入菜单。
2. 选择Vendor/Product Selection--> Vendor (Intel)/ Intel Products(IXDP425)
3. 在Kernel/Library/Defaults Selection选中如下几项
console=ttyS0,115200root=/dev/ram0 initrd=0x00800000,8Mmem=64M@0x00000000
console=ttyS1,115200root=/dev/ram0 initrd=0x00800000,8Mmem=64M@0x00000000
另外选中Force defaultkernel command string。
5. 选择Networking ---> Networkingoptions ---> QoS and/or fair queueing.选中一个queue的方法。
配置编译IXP驱动
编译Intel_IXP400_Access_Library
在uclinux2.4的修改Intel_IXP400_Access_Library的基础上,加入以下改变。
修改makefile
打开/home/linuxuser/ixp/ixp_lib24/Makefile,修改完的makefile内容如下:
KERNEL_SOURCE_PATH=uClinux-dist
KERNELDIR=/home/linuxuser/$(KERNEL_SOURCE_PATH)/linux-2.6.x
CFLAGS += -DEXPORT_SYMTAB-DIX_OSAL_OEM_FAST_MUTEX
#-include$(ROOTDIR)/modules/.config
#ixobj :=$(ROOTDIR)/modules/ixp425/ixp400-2.4
# Figure outwhich platform we are building for. We need to know this up
# front, sincewe traverse certain directories based on it, and set
# certaindefines for it. This name reflects the directory names used in
# Construct thelist of components that we are going to build into
COMPONENTS-$(CONFIG_IXP425_COMPONENT_ATMDACC)+= atmdAcc
COMPONENTS-$(CONFIG_IXP425_COMPONENT_ATMM)+= atmm
COMPONENTS-$(CONFIG_IXP425_COMPONENT_ATMSCH)+= atmsch
COMPONENTS-$(CONFIG_IXP425_COMPONENT_QMGR)+= qmgr
COMPONENTS-$(CONFIG_IXP425_COMPONENT_NPEDL)+= npeDl
COMPONENTS-$(CONFIG_IXP425_COMPONENT_NPEMH)+= npeMh
COMPONENTS-$(CONFIG_IXP425_COMPONENT_CODEC)+= codec
COMPONENTS-$(CONFIG_IXP425_COMPONENT_ETHACC)+= ethAcc
COMPONENTS-$(CONFIG_IXP425_COMPONENT_ETHDB)+= ethDB
COMPONENTS-$(CONFIG_IXP425_COMPONENT_ETHMII)+= ethMii
COMPONENTS-$(CONFIG_IXP425_COMPONENT_HSSACC)+= hssAcc
COMPONENTS-$(CONFIG_IXP425_COMPONENT_USB)+= usb
COMPONENTS-$(CONFIG_IXP425_COMPONENT_UARTACC)+= uartAcc
COMPONENTS-$(CONFIG_IXP425_COMPONENT_OSSL)+= ossl
COMPONENTS-$(CONFIG_IXP425_COMPONENT_OSSERVICES)+= osServices
COMPONENTS-$(CONFIG_IXP425_COMPONENT_FEATURECTRL)+= featureCtrl
COMPONENTS-$(CONFIG_IXP425_COMPONENT_PERFPROFACC)+= perfProfAcc
COMPONENTS-$(CONFIG_IXP425_COMPONENT_CRYPTOACC)+= cryptoAcc
COMPONENTS-$(CONFIG_IXP425_COMPONENT_DMAACC)+= dmaAcc
COMPONENTS-$(CONFIG_IXP425_COMPONENT_TIMESYNCACC)+= timeSyncAcc
COMPONENTS-$(CONFIG_IXP425_COMPONENT_PARITYENACC)+= parityENAcc
COMPONENTS-$(CONFIG_IXP425_COMPONENT_I2C) += i2c
COMPONENTS-$(CONFIG_IXP425_COMPONENT_SSPACC)+= sspAcc
CODELETS_COMPONENTS-$(CONFIG_IXP425_CODELET_ETHAAL5APP)+= ethAal5App
CODELETS_COMPONENTS-$(CONFIG_IXP425_CODELET_HSSACC)+= hssAcc
CODELETS_COMPONENTS-$(CONFIG_IXP425_CODELET_ETHACC)+= ethAcc
CODELETS_COMPONENTS-$(CONFIG_IXP425_CODELET_USB)+= usb
CODELETS_COMPONENTS-$(CONFIG_IXP425_CODELET_TIMERS)+= timers
CODELETS_COMPONENTS-$(CONFIG_IXP425_CODELET_PERFPROFACC)+= perfProfAcc
CODELETS_COMPONENTS-$(CONFIG_IXP425_CODELET_ATM)+= atm
CODELETS_COMPONENTS-$(CONFIG_IXP425_CODELET_dspEng)+= dspEng
CODELETS_COMPONENTS-$(CONFIG_IXP425_CODELET_CRYPTOACC)+= cryptoAcc
CODELETS_COMPONENTS-$(CONFIG_IXP425_CODELET_DMAACC)+= dmaAcc
# Construct thelist of osal pieces of the ixp_osal lib code we need.
# The setup is alittle more convoluted through the ixp_osal code,
# we need toseparate out the os specific part for processing.
OSAL_CORE-y :=ixp_osal/common/src/core
OSAL_CORE-y +=ixp_osal/common/src/modules/ddk
OSAL_CORE-y +=ixp_osal/common/src/modules/ioMem
OSAL_CORE-y +=ixp_osal/common/src/modules/bufferMgt
OSAL_OS-y :=ixp_osal/common/os/linux/src/core
OSAL_OS-y +=ixp_osal/common/os/linux/src/modules/ddk
OSAL_OS-y +=ixp_osal/common/os/linux/src/modules/ioMem
OSAL_OS-y +=ixp_osal/common/os/linux/src/modules/bufferMgt
OSAL_PLATFORM-y:= ixp_osal/platforms/$(IX_DEVICE)/os/linux/src
OSAL_COMPONENTS-y:= $(OSAL_CORE-y) $(OSAL_OS-y) $(OSAL_PLATFORM-y)
# Local flagsrequired for building.
IXCFLAGS +=-DCPU=XSCALE -DXSCALE=33 -DSIMSPARCSOLARIS=34 -DSIMLINUX=35
IXCFLAGS +=-DIX_NPEDL_READ_MICROCODE_FROM_FILE
IXCFLAGS +=-DIX_UTOPIAMODE=0 -DIX_MPHYSINGLEPORT=0 -DIX_ACC_DRAM_PHYS_OFFSET=0
#IXCFLAGS +=-DIX_HW_COHERENT_MEMORY
IXCFLAGS +=-I/home/linuxuser/$(KERNEL_SOURCE_PATH)/include
IXCFLAGS +=-I$(ixobj)/ixp400_xscale_sw/src/include
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/include
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/include/modules
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/include/modules/ddk
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/include/modules/bufferMgt
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/include/modules/ioMem
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/os/linux/include
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/os/linux/include/core
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/os/linux/include/modules
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/os/linux/include/modules/ddk
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/os/linux/include/modules/bufferMgt
IXCFLAGS +=-I$(ixobj)/ixp_osal/common/os/linux/include/modules/ioMem
IXCFLAGS +=-I$(ixobj)/ixp_osal/platforms/$(IX_DEVICE)/include
IXCFLAGS +=-I$(ixobj)/ixp_osal/platforms/$(IX_DEVICE)/os/linux/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/featureCtrl/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/npeDl/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/npeMh/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/ethAcc/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/ethDB/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/ethMii/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/featureCtrl/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/npeDl/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/npeMh/include
IXCFLAGS += -I./ixp400_xscale_sw/src/oslinux/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/osServices/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/ossl/include
IXCFLAGS +=-I./ixp400_xscale_sw/src/qmgr/include
# Include thesub component code makefiles. We use this to get at
# the objectlist for each component.
include$(COMPONENTS-y:%=$(ixobj)/ixp400_xscale_sw/src/%/component.mk)
include$(OSAL_COMPONENTS-y:%=$(ixobj)/%/component.mk)
include$(ixobj)/ixp_osal/platforms/$(IX_DEVICE)/os/$(IX_TARGET_OS)/make/OsalConfig.mk
# Construct thelist of objects that need to be built. They need to be
# listed withthe relative path, so the top level rules can find the
# source code topass to the compiler.
ixp400-component-objs:= $(foreach c, $(COMPONENTS-y), $($(c)_OBJ:%=ixp400_xscale_sw/src/$(c)/%))
ixp400-osal-objs:= $(foreach c, $(OSAL_CORE-y), $($(notdir $(c))_OBJ:%=$(c)/%))
ixp400-osal-objs+= $(foreach c, $(OSAL_OS-y), $($(notdir $(c))_os_OBJ:%=$(c)/%))
ixp400-osal-objs+= $(foreach c, $(OSAL_PLATFORM-y), $(platform_OBJ:%=$(c)/%))
ixp400-objs :=$(ixp400-component-objs) $(ixp400-osal-objs) stub.dat
# Setup thespecific CFLAGS for each object. These are already defined in
# thecomponent.mk files of the Access Library, so we just need to convert
# them to theright kernel notation for use. This rule is a little tricky,
# you may needto read it a couple of times to understand what it is doing :-)
# Complicatingall this is that the setup is slightly different for 2.4 and
# 2.6 kernels,thus similar rules, generating slightly different define
export-objs +=$(foreach c, $(COMPONENTS-y), $($(c)_EXPORT_OBJ:%=ixp400_xscale_sw/src/$(c)/%))
export-objs +=$(ixp400-osal-objs)
EXTRA_CFLAGS +=$(IXCFLAGS) $(OSAL_CFLAGS)
# Finally tellthe kernel what objects need to be built for the ixp400
echo "CONFIG_CPU_BIG_ENDIAN =$(CONFIG_CPU_BIG_ENDIAN)"
$(MAKE) -C $(KERNELDIR) ARCH=armCROSS_COMPILE=arm-linux- M=$(PWD)
$(LD) -EB -r -o $@ $(ixp400-objs)
# The CSR codehas some files that end in .s that really need to be
# C-preprocessedfirst (they should be .S files). This rule caters for
# that, on both2.4 and 2.6 kernels.
ASMOBJS +=$(ixbase)/ixp400_xscale_sw/src/qmgr/IxQMgrAsmRoutines.o
ASMOBJS +=$(ixbase)/ixp400_xscale_sw/src/cryptoAcc/IxCryptoAccXScaleWep.o
echo "ln201 export-objs :$(export-objs)"
$(CC) $(CPPFLAGS) $(CFLAGS) $(IXCFLAGS) -xassembler-with-cpp -o $@ -c $<
# Build theMicrocode downloader app. We "attach" it to building
# the npeDl code(trick is to not link it into the module on 2.6
DLDIR :=$(ixobj)/ixp400_xscale_sw/src/npeDl
CVBIN :=$(DLDIR)/ixNpeDlImageConverter
$(ixbase)/stub.dat:$(ixbase)/stub.c $(ixobj)/IxNpeMicrocode.dat
$(CC) $(CPPFLAGS) $(CFLAGS) -o$(ixbase)/stub.o -c $(ixbase)/stub.c
cp $(ixbase)/stub.o $(ixbase)/stub.dat
$(HOSTCC) -o $(CVBIN)-I$(ixobj)/ixp400_xscale_sw/src/include $(CVSRC)
cp $(DLDIR)/IxNpeMicrocode.dat $(ixobj)/
.PHONY: cleanmrproper distclean
find -name "*.[od]" | grep -vdsr.o | xargs rm -f
find -name ".*o.cmd" | xargs rm -f
find -name ".*.o.flags" | xargs rm-f
rm -f $(CVBIN) $(DLDIR)/IxNpeMicrocode.dat
修改IxOsal.h
打开/home/linuxuser/ixp/ixp_lib24/ixp_osal/common/include,在
修改IxLinuxInit.c
打开/home/linuxuser/ixp/ixp_lib24/ixp400_xscale_sw/src/oslinux/IxLinuxInit.c
if (unregister_chrdev(DEV_IXNPE_MAJOR_NUMBER,"ixNpe"))
printk (KERN_ERR "Failed to unregisterdriver for /dev/ixNpe\n");
unregister_chrdev(DEV_IXNPE_MAJOR_NUMBER,"ixNpe");
修改/IxOsalOs.h
打开/home/linuxuser/ixp/ixp_lib24/ixp_osal/common/os/linux/include/core/IxOsalOs.h
#ifKERNEL_VERSION(2,6,0) <= LINUX_VERSION_CODE
#defineIX_OSAL_OS_CACHE_INVALIDATE(addr, size) \
(consistent_sync((void*)addr, (size_t)size, DMA_FROM_DEVICE))
#defineIX_OSAL_OS_CACHE_FLUSH(addr, size) \
(consistent_sync((void*)addr, (size_t)size, DMA_TO_DEVICE))
#else /*!KERNEL_VERSION 2.6 */
#defineIX_OSAL_OS_CACHE_INVALIDATE(addr, size) \
(invalidate_dcache_range((__u32)addr,(__u32)addr + size ))
#defineIX_OSAL_OS_CACHE_FLUSH(addr, size) \
(clean_dcache_range((__u32)addr,(__u32)addr + size))
#else /*IX_HW_COHERENT_MEMORY */
* The non-coherent memory region is exposed asuncacheable memory.
* So there is no need for cache invalidation orcache flushing
#defineIX_OSAL_OS_CACHE_INVALIDATE(addr, size) do { } while(0);
#defineIX_OSAL_OS_CACHE_FLUSH(addr, size) do { }while(0);
#endif /*IX_HW_COHERENT_MEMORY */
#if LINUX_VERSION_CODE<= KERNEL_VERSION(2,6,19)
#define CONSISTENT_FUNC consistent_sync
#define CONSISTENT_FUNC dma_cache_maint
#ifKERNEL_VERSION(2,6,0) <= LINUX_VERSION_CODE
#defineIX_OSAL_OS_CACHE_INVALIDATE(addr, size) \
(CONSISTENT_FUNC((void*)addr, (size_t)size, DMA_FROM_DEVICE))
#defineIX_OSAL_OS_CACHE_FLUSH(addr, size) \
(CONSISTENT_FUNC((void*)addr, (size_t)size, DMA_TO_DEVICE))
#else /*!KERNEL_VERSION 2.6 */
#defineIX_OSAL_OS_CACHE_INVALIDATE(addr, size) \
(invalidate_dcache_range((__u32)addr,(__u32)addr + size ))
#defineIX_OSAL_OS_CACHE_FLUSH(addr, size) \
(clean_dcache_range((__u32)addr,(__u32)addr + size))
#else /*IX_HW_COHERENT_MEMORY */
* The non-coherent memory region is exposed asuncacheable memory.
* So there is no need for cache invalidationor cache flushing
#defineIX_OSAL_OS_CACHE_INVALIDATE(addr, size) do { } while(0);
#defineIX_OSAL_OS_CACHE_FLUSH(addr, size) do { }while(0);
#endif /*IX_HW_COHERENT_MEMORY */
执行编译
#cd ./ixp400_xscale_sw/src/npeDl ;./ixp400_xscale_sw/src/npeDl/ixNpeDlImageConverter
cp./ixp400_xscale_sw/src/npeDl/IxNpeMicrocode.dat ./
cp: cannot stat`./ixp400_xscale_sw/src/npeDl/IxNpeMicrocode.dat': No such file or directory
make: *** [IxNpeMicrocode.dat] Error 1。
再次执行make。就会得到/home/linuxuser/ixp/ixp_lib24/ixp400.ko文件。
编译IXP以太网驱动
在2.4 kernel修改的基础上,需要修改makefile。修改完的makefile文件如下:
KERNELDIR=/home/linuxuser/uClinux-dist/linux-2.6.x
IXCFLAGS +=-DIX_MPHYSINGLEPORT=0
IXCFLAGS +=-DIX_ACC_DRAM_PHYS_OFFSET=0
IXCFLAGS +=-DIX_OSAL_OEM_FAST_MUTEX
IXCFLAGS +=-DIX_OSAL_THREAD_EXIT_GRACEFULLY
#IXCFLAGS +=-DIX_HW_COHERENT_MEMORY
ifeq($(CONFIG_IXP425_IXP_AS_ETH),y)
IXCFLAGS +=-DCONFIG_IXP425_IXP_AS_ETH=1
CSRDIR := /home/linuxuser/ixp/ixp_lib24
IXCFLAGS +=-I/home/linuxuser/uClinux-dist/include
IXCFLAGS +=-I$(CSRDIR)/ixp400_xscale_sw/src/include
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/include
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/include/modules
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/include/modules/ddk
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/include/modules/bufferMgt
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/include/modules/ioMem
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include/core
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include/modules
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include/modules/ddk
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include/modules/bufferMgt
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/common/os/linux/include/modules/ioMem
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/platforms/$(IXPLATFORM)/include
IXCFLAGS +=-I$(CSRDIR)/ixp_osal/platforms/$(IXPLATFORM)/os/linux/include
#obj-$(CONFIG_IXP400_ETH)+= ixp400_eth.o
$(MAKE) -C $(KERNELDIR) ARCH=armCROSS_COMPILE=arm-linux- M=$(PWD)
.PHONY: cleanmrproper distclean
rm -f .*o.cmd .*.o.flags *.mod.c *.ko *.o
另外.config文件已经准备好了,执行make得到ixp400_eth.ko文件。
集成IXP驱动到ramdisk
cp -f/tftpboot/ramdisk.gz ramdisk.gz
cp -rf ./ixp400.ko./tmp/lib/modules/ixp425
cp -rf./ixp400_eth.ko ./tmp/lib/modules/ixp425
cp -rf./IxNpeMicrocode.dat ./tmp/etc/
cp -rf ramdisk.gz/tftpboot/ramdisktest.gz
这个时候,应该内核和ramdisk都编译好了,并且在/tftpboot下有一份。那么在/home/linuxuser/ixp/ixp_test下执行
在IXP425上启动IXP网卡
将zImage和ramdisktest.gz下载到板子上,板子启动后执行下面指令。
#cat /etc/IxNpeMicrocode.dat> /dev/ixNpe
#echo 0 >/proc/sys/kernel/hung_task_timeout_secs
这个时候应该就可以ping通192.168.1.0/255网段的地址了
移植IXP驱动的摸索
尝试编译2.4原版驱动
在实际的尝试过程中,原版code编译出现很多错误,无法一一纠正。而且有的竟然是语法错误,比如在原版code当中出现:
thread_data.entryPoint= entryPoint;
而thread_data是结构体而不是一个结构体变量,参照snapgear下的代码,会发现被修改为:
IxOsalOsThreadData.entryPoint = entryPoint;
下面从头开始,先解压uClinux-dist-20080808,将uClinux-dist-20080808-20090302.patch.gz补丁打上,然后开始编译驱动。
使用source命令用脚本设定环境变量
# -- End ofCopyright Notice --
# Change thefollowing line to your linux kernel source tree
linuxbe_KERNEL_DIR=/home/linuxuser/uClinux-dist/linux-2.4.x
# Change thefollowing line to your toolchain bin directory
CROSSCOMPILER_DIR=/home/linuxuser/usr/local/bin
# Change thebelow to specify the prefix of your cross compiler
# E.g: ifarmv5b-linux-gcc is your C cross compiler, then the prefix is
IX_LINUX_CROSSCOMPILER=arm-linux-
# You may wantto edit the following to point to your ixp400_xscale_sw
# directory.Otherwise you must source this file from that directory.
IX_XSCALE_SW=/home/linuxuser/ixp/ixp_lib24/ixp400_xscale_sw
PATH=/usr/bin:$CROSSCOMPILER_DIR:$PATH
#NOTE: All flagdefinitions below are case sensitive
# For IXDP425platform, set IX_DEVICE to ixp42X
# For KIXRP435platform, set IX_DEVICE to ixp43X
# For IXDP465platform, set IX_DEVICE to ixp46X
# For IXDP425platform, set IX_PLATFORM to ixdp42x
# For KIXRP435platform, set IX_PLATFORM to kixrp43x
# For IXDP465platform, set IX_PLATFORM to ixdp46x
# For Bigendian, set IX_TARGET to linuxbe (this version only support big-endian)
exportlinuxbe_KERNEL_DIR HARDHAT_BASE IX_XSCALE_SW PATH IX_DEVICE IX_PLATFORMIX_TARGET
exportIX_KBUILD_CROSSCOMPILE="ARCH=armCROSS_COMPILE=${IX_LINUX_CROSSCOMPILER}"
编译ixp_osal的大量错误
按照要求,应该是先编译ixp_osal文件夹。直接make不行,于是查看osal/Makefile中说明部分如下:
osal/Makefileusage (for linux)
--------------------------------------------
- IX_TARGET : [linuxle | linuxbe]
- LINUX_SRC : <Path of Linux kernel src>
- IX_OSAL_OS_LEVEL: [kernel_space |user_space]
- IX_OSAL_PLATFORM: platform_name
- source the same environment.tcsh asixp400_xscale
--------------------------------------------
osal/Makefileusage (for vxworks)
--------------------------------------------
- Source env_scripts/env_vxworksXY_xscale.batin ixp_osal/
--------------------------------------------
make lkm: to build osal as a loadable module
make libosal: to build osal library
make clean: to remove library and dependency files.
进入/home/linuxuser/ixp/ixp24/BSD_ixp400AccessLibrary-2_4/ixp_osal,输入
cc1: error:invalid option `short-load-bytes'
1. /home/linuxuser/snapgear/linux-2.4.x/arch/arm/makefile
首先查找ixp_osal/makefile,找到CFLAGS += $(IX_OSAL_MK_CFLAGS),而CFLAGS通常是编译选项的来源。
includeplatforms/$(IX_OSAL_MK_TGT_DEVICE)/os/$(IX_OSAL_MK_TARGET_OS)/make/OemMake.mk
includecommon/os/${IX_OSAL_MK_TARGET_OS}/make/macros.mk
# include anyadditional flags set by the user
LDFLAGS +=$(IX_OSAL_MK_LDFLAGS)
查找ixp_osal/platforms/ixp42X/os/linux/make/OemMake.mk,果然找到
LINUX_MACH_CFLAGS := -D__LINUX_ARM_ARCH__=5-march=armv5te -Wa,-mcpu=xscale -mtune=xscale
# Commented outto remove a warning
LINUX_MACH_CFLAGS := -D__LINUX_ARM_ARCH__=5-mcpu=xscale -mtune=xscale
CFLAGS_ETC = -mapcs-32 -mshort-load-bytes
而目前编译的目标kernel是2.4,显然-mshort-load-bytes就是这么来的。删除掉重新编译。还是出错。
platforms/ixp42X/os/linux/src/IxOsalOsOem.c:In function `ixOsalMemMapInit':
platforms/ixp42X/os/linux/src/IxOsalOsOem.c:118:error: for each function it appears in.)
platforms/ixp42X/os/linux/src/IxOsalOsOem.c:In function `ixOsalOemInit':
make: *** [lib/ixp42X/linux/linuxbe/platforms/ixp42X/os/linux/src/IxOsalOsOem.o]Error 1
/* compatabilitydefines for 2.4.x kernels */
#ifndefIXP4XX_PCI_CFG_BASE_PHYS
#define IXP4XX_PCI_CFG_BASE_PHYS IXP425_PCI_CFG_BASE_PHYS
#define IXP4XX_PCI_CFG_BASE_VIRT IXP425_PCI_CFG_BASE_VIRT
#define IXP4XX_PCI_CFG_REGION_SIZE IXP425_PCI_CFG_REGION_SIZE
#ifndefIXP4XX_EXP_CFG_BASE_PHYS
#define IXP4XX_EXP_CFG_BASE_PHYS IXP425_EXP_CFG_BASE_PHYS
#define IXP4XX_EXP_CFG_BASE_VIRT IXP425_EXP_CFG_BASE_VIRT
#define IXP4XX_EXP_CFG_REGION_SIZE IXP425_EXP_CFG_REGION_SIZE
#ifndefIXP4XX_EXP_BUS_BASE_PHYS
#define IXP4XX_EXP_BUS_BASE_PHYS IXP425_EXP_BUS_BASE_PHYS
#define IXP4XX_EXP_BUS_BASE_VIRT IXP425_EXP_BUS_BASE_VIRT
#define IXP4XX_EXP_BUS_REGION_SIZE IXP425_EXP_BUS_REGION_SIZE
#define IXP4XX_QMGR_BASE_PHYS IXP425_QMGR_BASE_PHYS
#define IXP4XX_QMGR_BASE_VIRT IXP425_QMGR_BASE_VIRT
#define IXP4XX_QMGR_REGION_SIZE IXP425_QMGR_REGION_SIZE
#ifndef IXP4XX_PERIPHERAL_BASE_PHYS
#define IXP4XX_PERIPHERAL_BASE_PHYS IXP425_PERIPHERAL_BASE_PHYS
#define IXP4XX_PERIPHERAL_BASE_VIRT IXP425_PERIPHERAL_BASE_VIRT
#define IXP4XX_PERIPHERAL_REGION_SIZE IXP425_PERIPHERAL_REGION_SIZE
#ifndef IXP4XX_TIMER_BASE_PHYS
#define IXP4XX_TIMER_BASE_PHYS IXP425_TIMER_BASE_PHYS
#define IXP4XX_EthA_BASE_PHYS (IXP425_PERIPHERAL_BASE_PHYS + 0xC000)
#define IXP4XX_EthB_BASE_PHYS (IXP425_PERIPHERAL_BASE_PHYS + 0x9000)
#define IXP4XX_EthC_BASE_PHYS (IXP425_PERIPHERAL_BASE_PHYS + 0xA000)
#define IRQ_IXP4XX_NPEA IRQ_IXP425_NPEA
#define IRQ_IXP4XX_NPEB IRQ_IXP425_NPEB
#define IRQ_IXP4XX_NPEC IRQ_IXP425_NPEC
#define IRQ_IXP4XX_QM1 IRQ_IXP425_QM1
#define IRQ_IXP4XX_QM2 IRQ_IXP425_QM2
#define IRQ_IXP4XX_PCI_INT IRQ_IXP425_PCI_INT
#define IRQ_IXP4XX_SWCP_PE IRQ_IXP46X_SWCP
#define IRQ_IXP4XX_QM_PE IRQ_IXP46X_AQM
#define IRQ_IXP4XX_MCU_ECC IRQ_IXP46X_MCU
#define IRQ_IXP4XX_EXP_PE IRQ_IXP46X_EBC
#define IRQ_IXP4XX_XSCALE_PMU IRQ_IXP425_XSCALE_PMU
#defineIXP4XX_EXP_BUS_CSX_REGION_SIZE (0x01000000) /**< Expansionbus map size */
将snapgear的\ixp_osal\platforms\ixp42X\os\linux\include\IxOsalOsOem.h的内容全部复制过来。重新编译,出现如下错误。
common/src/core/IxOsalTime.c:In function `timerInit':
common/src/core/IxOsalTime.c:370:error: `MAX_RT_PRIO' undeclared (first use in this function)
common/src/core/IxOsalTime.c:370:error: (Each undeclared identifier is reported only once
common/src/core/IxOsalTime.c:370:error: for each function it appears in.)
make: ***[lib/ixp42X/linux/linuxbe/common/src/core/IxOsalTime.o] Error 1
MAX_RT_PRIO本来应该是/home/linuxuser/snapgear/linux-2.4.x/include/linux/sched.h里定义的,但是uc里面没有找到。
对比snapgear的ixp_osal\common\os\linux\include\core\IxOsalOsTypes.h,有如下定义:
#defineIX_OSAL_OS_DEFAULT_THREAD_PRIORITY (MAX_RT_PRIO)
#defineIX_OSAL_OS_DEFAULT_THREAD_PRIORITY (90)
common/os/linux/src/core/IxOsalOsThread.c:In function `ixOsalThreadCreate':
common/os/linux/src/core/IxOsalOsThread.c:354:error: for each function it appears in.)
make: ***[lib/ixp42X/linux/linuxbe/common/os/linux/src/core/IxOsalOsThread.o] Error 1.
thread_data.entryPoint = entryPoint;
后面的错误估计非常的多。就不一一列举了,如果发现错误,就和snapgear对比。另外发现snapgear打了补丁以后确实有很多的不同,不管是makefile,h和c文件也有不同。
编译打过补丁的2.4驱动
打过补丁之后,多出来一个顶层的makefile和stub.c文件。
EXPORT_SYMTAB的问题
利用snapgear的config文件
make:[IxNpeMicrocode.dat] Error 127 (ignored)
cd ./ixp400_xscale_sw/src/npeDl; ./ixp400_xscale_sw/src/npeDl/ixNpeDlImageConverter
/bin/sh:./ixp400_xscale_sw/src/npeDl/ixNpeDlImageConverter: No such file or directory
make: ***[IxNpeMicrocode.dat] Error 127
对比在snapgear编译的时候,是gcc来编译这个的.估计是什么变量配置错误了,gcc都没了。手工输入
利用echo发现HOSTCC没有定义,在makefile前面加上定义,解决了这个问题。
arm-linux-ld:failed to merge target specific data of file ixp400_xscale_sw/src/oslinux/IxLinuxInit.o
这个比较简单,是-EB没有加的原因。终于编译成功得到ixp400.o。
编译ixp400_eth
将ixp400.o, ixp400_eth.o, IxNpeMicrocode.dat提取出来,按照集成到ramdisk里,然后按照以前的方法启动网卡,结果成功。
为snapgear编译2.6下的驱动
先将kernel的source path定义到snapgear,试试能不能编译过,修改makefile的里的path定义。很容易就能够编译通过。只不过insmod的时候提示:
ixp400: module license 'unspecified' taintskernel.
ixp400: please compile with -fno-common
ixp400: please compile with -fno-common.
为打了09补丁的uClinux2008编译2.6下的驱动
还是刚才在snapgear下独立编译过的code,修改makefile的path,编译出现如下错误:
make[1]:Entering directory `/home/linuxuser/uClinux-dist/linux-2.6.x'
make[1]: ***[_module_/home/linuxuser/driver/test/hello_mod_single26] Error 2
make[1]: Leavingdirectory `/home/linuxuser/uClinux-dist/linux-2.6.x'
这个是因为系统指定编译使用EXTRA_CFLAGS而不是CFLAGS,在makefile里面修改一下就行。再编译出现如下错误:
make[1]: Entering directory`/home/linuxuser/uClinux-dist/linux-2.6.x'
CC [M] /home/linuxuser/ixp/ixplib24_uc26/ixp400_xscale_sw/src/oslinux/IxLinuxInit.o
arm-linux-gcc: -mbig-endian and -mlittle-endian maynot be used together
make[2]: ***[/home/linuxuser/ixp/ixplib24_uc26/ixp400_xscale_sw/src/oslinux/IxLinuxInit.o]Error 1
make[1]: ***[_module_/home/linuxuser/ixp/ixplib24_uc26] Error 2
make[1]: Leaving directory`/home/linuxuser/uClinux-dist/linux-2.6.x'
ifeq ($(CONFIG_CPU_BIG_ENDIAN),y)
KBUILD_CPPFLAGS +=-mbig-endian
KBUILD_CPPFLAGS +=-mlittle-endian
在/home/linuxuser/ixp/ixplib24_uc26/makefile里面加上CONFIG_CPU_BIG_ENDIAN = y就行了。
make[1]:Entering directory `/home/linuxuser/uClinux-dist/linux-2.6.x'
CC [M] /home/linuxuser/ixp/ixplib24_uc26/ixp400_xscale_sw/src/oslinux/IxLinuxInit.o
/home/linuxuser/ixp/ixplib24_uc26/ixp400_xscale_sw/src/oslinux/IxLinuxInit.c:At top level:
make[2]: ***[/home/linuxuser/ixp/ixplib24_uc26/ixp400_xscale_sw/src/oslinux/IxLinuxInit.o]Error 1
make[1]: ***[_module_/home/linuxuser/ixp/ixplib24_uc26] Error 2
make[1]: Leavingdirectory `/home/linuxuser/uClinux-dist/linux-2.6.x'
检查了一下这个是因为struct file_operations没有定义的原因,而定义在<linux/fs.h>里,在IxOsal.h里加入#include <linux/fs.h>就行了。再编译:
make[1]:Entering directory `/home/linuxuser/uClinux-dist/linux-2.6.x'
CC [M] /home/linuxuser/ixp/ixplib24_uc26/ixp400_xscale_sw/src/oslinux/IxLinuxInit.o
make[2]: ***[/home/linuxuser/ixp/ixplib24_uc26/ixp400_xscale_sw/src/oslinux/IxLinuxInit.o]Error 1
make[1]: ***[_module_/home/linuxuser/ixp/ixplib24_uc26] Error 2
make[1]: Leavingdirectory `/home/linuxuser/uClinux-dist/linux-2.6.x'
找到IxLinuxInit.c:154,是unregister_chrdev的问题,语句如下:
if(unregister_chrdev(DEV_IXNPE_MAJOR_NUMBER, "ixNpe"))
printk (KERN_ERR "Failed to unregisterdriver for /dev/ixNpe\n");
intunregister_chrdev(unsigned int major, const char *name)
struct char_device_struct *cd;
cd = __unregister_chrdev_region(major, 0,256);
voidunregister_chrdev(unsigned int major, const char *name)
struct char_device_struct *cd;
cd = __unregister_chrdev_region(major, 0,256);
unregister_chrdev(DEV_IXNPE_MAJOR_NUMBER,"ixNpe")
为原始uClinux2008编译2.6下的驱动
搜索consistent_sync,来源于<asm/dma-mapping.h>,在snapgear的引用如下:
/home/linuxuser/snapgear/linux-2.6.x/include/asm/dma-mapping.h
* DMA-consistent mapping functions. These allocate/free a region of
* uncached, unwrite-buffered mapped memoryspace for use with DMA
* devices. This is the "generic" version. The PCI specific version
* Note: Drivers should NOT use this functiondirectly, as it will break
* platforms with CONFIG_DMABOUNCE.
* Use the driver DMA support - seedma-mapping.h (dma_sync_*)
extern voidconsistent_sync(void *kaddr, size_t size, int rw);
在uClinux2008里asm/dma-mapping.h的没有发现consistent_sync,但是发现相同的位置有如下的引用:
/home/linuxuser/uClinux-dist/linux-2.6.x/include/asm/dma-mapping.h
* DMA-consistent mapping functions. These allocate/free a region of
* uncached, unwrite-buffered mapped memoryspace for use with DMA
* devices. This is the "generic" version. The PCI specific version
* Note: Drivers should NOT use this functiondirectly, as it will break
* platforms with CONFIG_DMABOUNCE.
* Use the driver DMA support - see dma-mapping.h(dma_sync_*)
extern voiddma_cache_maint(const void *kaddr, size_t size, int rw);
#defineIX_OSAL_OS_CACHE_INVALIDATE(addr, size) \
(consistent_sync((void*)addr, (size_t) size,DMA_FROM_DEVICE))
#defineIX_OSAL_OS_CACHE_FLUSH(addr, size) \
(consistent_sync((void*)addr, (size_t)size, DMA_TO_DEVICE))
#defineIX_OSAL_OS_CACHE_INVALIDATE(addr, size) \
(dma_cache_maint ((void*)addr, (size_t)size, DMA_FROM_DEVICE))
#defineIX_OSAL_OS_CACHE_FLUSH(addr, size) \
(dma_cache_maint ((void*)addr, (size_t)size, DMA_TO_DEVICE))
保存编译成功。再编译ixp400_eth,只需要修改makefile中的path就行了。下载到板子上运行成功。
IXP打印提示信息的问题
INFO: task EthDBevent thr:33 blocked for more than 120 seconds.
"echo 0> /proc/sys/kernel/hung_task_timeout_secs" disables this message.
EthDB event t Dc01e9fa4 0 33 2
[<c01e9d60>](schedule+0x0/0x294) from [<c01e9ba4>] (__down+0xb4/0x110)
[<c01e9af0>](__down+0x0/0x110) from [<c01e9a8c>] (__down_failed+0xc/0x20)
r8:60000013 r7:bf05b48c r6:c3247f64r5:bf05b488 r4:00000000
这个解决的办法就是在盒子的命令行下输入echo 0 > /proc/sys/kernel/hung_task_timeout_secs就行了
几个小问题
必须先编译内核
没有先编译内核就先去编译模块,肯定是编译不过的。提示错误也很奇怪。
ucfront-gcc的path问题
不能将uc的path放到bash.rc里面,会导致不同版本的uc编译错误.
/dev/ixNpe的问题
执行cat/etc/IxNpeMicrocode.dat > /dev/ixNpe。
必须先insmod ixp400.o之后才有/dev/ixNpe,如果一开始执行这个命令,会提示没有/dev/ixNpe
Argument list too long
make[1]:Entering directory `/home/linuxuser/snapgear/linux-2.6.x'
LD /home/linuxuser/ixp/ixp400-1_7_good/built-in.o
make[2]: execvp:/bin/sh: Argument list too long
这个是因为编译选项太长造成的。适当的减少就行了。编译module的时候,系统也加上很多include和编译选项之类的东西,才会导致过长。
移植IXP驱动到uClinux2008相关推荐
- 【Linux高级驱动】如何分析并移植网卡驱动
dm9000的驱动分析 m9000_init platform_driver_register(&dm9000_driver); dm9000_probe /*获取平台数据*/ stru ...
- LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解
在之前的项目中,一直使用 LoRa 通信.很早之前就想写写文章记录一下学习过程.怎奈一直是一知半解的状态,想写不敢写!LoRa 这个东西在国内用的貌似不是太多. 对于无线通信,各个国家或者地区 ...
- Android系统移植与驱动开发概述
1.Android系统架构分为四层:linux内核,Android是基于linux内核的. c/c++代码库,包括C/C++编写的代码库,包括dalivk虚拟机的运行时. Android SDK AP ...
- 1Android系统移植与驱动开发概述
1.Android系统架构分为四层,从下至上依次为Linux内核层,C/C++代码库.Android SDK API.应用程序,要熟悉每一层的内容以及功能: 2.Android移植分为应用移植和系统移 ...
- 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- linux内核epub,Android底层开发技术实战详解——内核、移植和驱动(第2版)[EPUB][MOBI][AZW3][42.33MB]...
内容简介 本书从底层原理开始讲起,结合真实的案例向读者详细介绍了Android内核.移植和驱动开发的整个流程.全书分为21章,依次讲解驱动移植的必要性, Goldfish.OMAP内核和驱动解析,显示 ...
- 【华为云技术分享】小熊派华为物联网操作系统LiteOS裸机驱动移植02-LCD驱动移植及使用
1. LCD裸机驱动 小熊派开发板使用的LCD屏幕为1.3寸的TFT彩屏,色彩深度16bit,分辨率240*240,使用 SPI 接口与 MCU 之间通信. 如果你对裸机玩转LCD屏幕还不熟悉,请先阅 ...
- 【ARM】新唐NUC977移植WK2124驱动
移植WK2124 一.实验目的 二.WK2124简介 三.驱动源代码下载 四.板级配置 五.Makefile 六.驱动代码修改 总结 一.实验目的 将两路SPI接口扩展为8路UART接口 二.WK21 ...
- 香橙派内核编译/移植 和 驱动编译
OrangeZero2 内核编译/移植 和 驱动编译 为什么要选它?(买不起树莓派 : /(ㄒoㄒ)/~~) 当然是学习下内核编译 , 内核移植,驱动的编译啦. 1. 准备工作 工具 Ubuntu18 ...
最新文章
- 【剑指offer】找出数组中出现一次的两个数
- python会不会出4_无极4网人生苦短,Python会不会被取代?国外网友
- 百度地图demo基础组件演示
- Java 失宠于 Oracle?
- vim中设置tab的长度的方法
- 安装docker环境
- 五轮面试,阿里offer到手!!
- 书籍-Linux运维之道
- 【洛谷P1801】黑匣子_NOI导刊2010提高(06)(权值线段树裸题+模拟)
- 【解决】关于sscom不能保存当前窗口到文本文件的问题
- Docker-----Cgroup资源配置详细教程,图文并茂
- 2022年双十一有哪些电子产品值得入手、超值电子产品推荐清单
- 亿阳信通南宁 java笔试_亿阳信通面试笔试题及答案
- 虚拟机vm介绍及虚拟机常见操作
- php jwt token刷新方案,laravel JWT自动刷新 自定义验证器
- Unknown host 'dl.google.com'. You may need to adjust the proxy settings in Gradle.
- 简约卡通双十一营销策划PPT模版
- mac下 Github添加SSH keys
- Mac下彻底卸载node和npm
- Huffman编码/译码问题