⑴ 如何调bcm 芯片sdk初始化
SDK初始化前,需要对SDK的架构有所了解,具体如下图;可以看出SDK的代码结构是一个层次化分明的架构,这里对各层的作用和详细工作机制不阐述了,具体可以参见SDK的介绍文档。
SDK代码的结构图
SDK根据上述架构,BCM模式启动的时候进行的初始化包括以下几个步骤:
1. 根据操作系统(linux、vxworks或unix等)不同调用sal_core_init()和sal_appl_init()两个函数的对应版本,分别对Core SAL和Appl SAL两部分进行初始化;linux系统下的sal_core_init()函数的主要工作时调用了函数sal_dpc_init()创建DPC(Deferred Procere Call)的信号量和线程;sal_appl_init()函数的linux版本则直接返回,没有做任何工作;这两个函数虽然意义很大,但是值得我们研究的内容不多。
2. 然后调用sal_thread_create创建一个运行BCM模式的线程,并调用diag_shell()函数完成对BCM模式的数据进行初始化、命令行进行注册、设备探测和挂载、芯片初始化、客户命令注册、重启动和BCM模式退出等操作,主要通过调用diag_init()函数、sysconf_init()函数、diag_rc_set()函数、sysconf_probe()函数、sysconf_attach()函数、bcm_init()函数、custom_cmd()和sal_reboot()等函数实现,下面详细介绍下该函数的执行流程;
a. diag_init()调用cmdlist_init()函数、init_symtab()函数、sal_srand()函数、gvar_init()函数和sh_bg_init()函数等来完成命令行注册、芯片的寄存器和表项软件数据内存分配、随机数种子获取、全局变量初始化和所有设备可执行任务的内存分配(最多10条)和记录等工作;
b. sysconf_init()函数除了初始化管理接口的调式函数外还调用soc_cm_init()函数来完成SOC的配置的管理接口的初始化;
c. sysconf_probe()函数调用bde_create()函数和sysconf_chip_override()函数完成探测已经挂载的设备并建立对应的配置管理项,包括为每个设备的分配id等工作;
d. 然后对每个unit调用sysconf_attach()函数来对soc_cm_device_init ()初始的管理接口的设备挂载一些中断处理函数,注册PCI读写函数等,用管理接口的结构体的指针函数成员形式保存,以便可以删除和添加这些处理函数,并调用soc_cm_device_init()函数通过在里面再调用soc_attach()函数来对每一个unit建立并初始化芯片的soc_control_t structure信息及对其访问的互斥体;soc_attach()函数调用soc_feature_init函数、soc_intr_disable()函、soc_cmic_uc_msg_start函数、soc_info_config()函数(这个函数下面会继续调用)、soc_dcb_unit_init()函数和soc_counter_verify()函数分别进行支持特性赋值、关闭中断、开启对设备的CMIC的UC信息、soc信息初始化、CPU收发包缓存DCB初始化和各种counter寄存器软件记录特定初始化,并对SOC_CONTROL(unit)和SOC_PERSIST(unit)两个保存芯片设备信息的结构体一些成员进行赋值;
e. 调用diag_rc_set()函数来设置对每个芯片初始化配置的脚本文件名称和热启动的初始化配置脚本名称,如果没有指定全部用默认的配置;然后解析脚本中的配置项,运用脚本进行配置初始化(包括MMU的配置);
f. 然后对每个芯片调用bcm_init()函数开始芯片的初始化工作,其首先调用bcm_attach()函数对BCM_CONTROL(unit)信息的部分成员进行赋值,包括设备类型、设备名称和unit号等;然后调用_bcm_api_xlate_port_init()函数建立lport和bcm port的映射关系;并调用芯片各功能模块的初始化函数(trident是bcm_esw_init ()函数)来对各模块进行初始化;
g. 然后调用custom_cmd()函数加载BCM模式下用户配置的命令加载进去;
h. 这样整个SDK就初始化完毕,BCM模式就会提示BCM>等来等待用户输入命令;然后进入一个死循环一直调用sh_process()函数解析用户配置的命令,然后调用对应的SDK接口下发到驱动;
i. 如果用户输入退出命令,会调用sh_exit函数来处理,包括可选的是否回收已经分配的资源等任务;
j. 如果用户输入重启的命令则调用sal_reboot()函数linux版本是通过exit(0)实现。
另外,SDK为上层的初始化提供了调用接口system_init()函数对BCM交换芯片进行初始化,这部分是咱们应该重点关注的部分,当然该接口在BCM模式下用init命令也是可以被调用到的。下面详细讲解下:
a. 首先调用soc_reset_init()函数,ESW芯片里这个函数调用soc_do_init()函数来完事情;soc_do_init()函数会根据是否是重启动设备进行的配置不一样;
(1) 如果是热启动的设备则先调用soc_dma_abort()关闭所有DMA并调用soc_linkscan_config()函数设置CMIC(CPU Management InterfaceController)查询端口link状态,如果设置项为空则表示关闭端口link状态扫描;然后如果是初始化soc有失败标记的话调用soc_dma_abort()函数、soc_counter_stop()函数、soc_mem_scan_stop函数、soc_i2c_detach()函数和soc_l2x_stop()函数(有些其他芯片还调用soc_cmic_uc_msg_stop函数等)分别禁止所有的中断、禁止计数行为、禁止内存扫描动作、释放I2C
驱动内存、结束L2X(应该是用于mac地址学习和老化对CPU进行中断通知)相关线程和停止等;然后调用soc_info_config()函数来初始化芯片端口的各种信息,包括芯片型号、各种类型端口的位图、芯片称号、mod数目、端口数目、hg口的位置、堆叠口位置、CPU口队列数目、用于时间同步端口数目、端口最大支持速率、meter pools、入端口QOS支持的队列数目等信息,另外对trident芯片支持QOS三级调度,所以还会调用soc_trident_num_cosq_init()对各个端口支持的队列数做特殊初始化,最后调用soc_esw_dport_init()函数对User
to physical port map的映射及对user port的逆映射;总之soc_reset_init()函数偏重于对芯片信息、端口属性和QOS队列属性等初始化;然后调用soc_feature_init()函数和soc_dcb_unit_init()函数完成芯片特性支持添加和CPU收发包缓存DCB的初始化工作;然后调用soc_dma_attach()函数和soc_dma_init()函数对中断进行重新初始化,然后对通过PCI设置CMIC_CONFIG使能高级的DMA模式,包括Scatter/gather,
reload, annaligned transfers(这里具体含义不太明白),然后开启一些中断;然后是对MAC_CTRL寄存器读写配置一些MAC层的收发使能;然后是设置MAC表项、MPLS表项、vlan和egress vlan、 L3表项的一些hash冲突的级别,接着使能MAC地址学习和老化通知、 重新获取L3转发表项的长度和表项大小信息即可完成整个热启动的过程;
(2) 在不是热启动的情况下,会首先调用调用soc_info_config()函数、soc_feature_init()函数和soc_dcb_unit_init()函数来完成信么MMU、芯片特性支持和DCB初始化工作;然后调用soc_endian_config() 函数和soc_pci_burst_enable()函数来完成硬件大小端和支持PCI读写突发情形的使能;然后是调用soc_reset()函数来完成对芯片的一些配置,包括端口的phy配置和mac配置(比如寄存器有XLPORT_XMAC_CONTROL),及还会调用相应芯片的soc_reset_bcm56840_a0()函数完成对CPU口和出入方向属性的一些配置,如CMIC_XGXS1_PLL_CONTROL_*、CMIC_MISC_CONTROL、CMIC_SOFT_RESET_REG、ING_CONFIG_2、EGR_CONFIG_2、ING_Q_BEGIN和EGR_Q_BEGIN等寄存器;然后和热启动一样,通过PCI设置CMIC_CONFIG使能高级的DMA模式,对MAC_CTRL寄存器读写配置一些MAC层的收发使能就退出了soc_do_init()函数;
b. 然后调用soc_misc_init()函数对芯片的初始化信息进行核实判断,最终根据函数指针调用芯片相应的函数,trident调用的则是_soc_trident_misc_init()函数;_soc_trident_misc_init()函数首先_soc_trident_ser_init()函数对IFP、EFP、VFP和UDF等tcam表项的表项大小、起始地址等信息进行软件获取并记录,然后调用_soc_trident_clear_all_memory函数对CPU_COS_MAP_ONLY、FP_GLOBAL_MASK_TCAM、FP_GM_FIELDS、FP_TCAM、FP_UDF_TCAM、L2_USER_ENTRY_ONLY、L3_DEFIP_128_ONLY、L3_DEFIP_ONLY、L3_TUNNEL、MY_STATION_TCAM_ENTRY_ONLY、VFP_TCAM、VLAN_SUBNET_ONLY、EFP_TCAM、FP_GLOBAL_MASK_TCAM_Xm、FP_GLOBAL_MASK_TCAM_Ym、L3_ECMP_XM、L3_ECMP_YM、EGR_IPMC_CFG2、EGR_VLAN_CONTROL_1、_XLPORT_MIB_RESET等表项进行清空;然后_soc_trident_misc_init()函数继续对CPU_PBM、CPU_PBM_2m、ISBS_PORT_TO_PIPE_MAPPINGm、EGR_ING_PORTm、XLPORT_CONFIGr、XLPORT_MODE_REG、IARB_MAIN_TDMm、EGR_PERQ_XMT_COUNTERS_BASE_ADDR、MISCCONFIG、ING_BYPASS_CTRL、EGR_BYPASS_CTRL、EGR_ENABLE、EPC_LINK_BMAP、ING_CONFIG_64、EGR_CONFIG_1、EGR_VLAN_CONTROL_1、ING_EN_EFILTER_BITMAP、SW2_FP_DST_ACTION_CONTROL、RTAG7_FLOW_BASED_HASH、RTAG7_HASH_ECMP、CMIC_I2C_STAT、CMIC_RATE_ADJUST_I2C、CMIC_RATE_ADJUST_INT_MDIO等寄存器或表项进行初始化赋值操作,并调用_trident_lep_init对端口进行点灯操作,还调用_soc_trident_fcoe_config_init对芯片的FCOE功能进行初始化;
c. 然后调用soc_mmu_init()函数对MMU进行初始化,和soc_misc_init()函数一样,也是根据不同的芯片挂载不同的函数指针,这里会调用_soc_trident_mmu_init()函数对trident芯片的MMU进行初始化;包括GH、PG、SSP、SP、Port Min、PORT_MAX_SHARED_CELL、Queue Min等的划分,MMU port到phy port的映,及MCQ_CONFIG、OP_THR_CONFIG、OP_VOQ_PORT_CONFIG、OVQ_DROP_THRESHOLD0、OVQ_DROP_THRESHOLD_RESET_LIMIT、OVQ_FLOWCONTROL_THRESHOLD、OVQ_MCQ_CREDITS、MCQ_FIFO_BASE_REG、PORT_PAUSE_ENABLE0_64、INPUT_PORT_RX_ENABLE0_64、S3_CONFIG、S2_CONFIG、S2_S3_ROUTING等voq和Qos相关功能的MMU相关寄存器初始化;
d. 然后调用soc_l2x_start函数开启对MAC地址学习和老化的信息通知功能,主要是创建一个线程;
e. 然后调用bcm_init()函数对芯片进一步初始化,实际对trident芯片调用的是bcm_esw_init()函数,该函数再调用_bcm_esw_init()函数,该函数主要的是分别调用bcm_esw_linkscan_enable_set()函数、_bcm_moles_init()函数和bcm_esw_rcpu_init()函数,来实现关闭端口状态扫描、初始化芯片各个模块、初始化RCPU机制的主控模块:然后_bcm_esw_init()函数调用_bcm_esw_switch_init()函数来实现对CPU队列的初始化和对芯片的一些特殊控制信息,主要是通过调用bcm_esw_switch_rcpu_encap_priority_map_set()函数和bcm_esw_switch_control_set()函数来设置的。其中的_bcm_moles_init()函数调用芯片转发流程的各个模块的初始化函数,具体如下图:
此处内容较多但是非常重要,希望感兴趣的同学能查看对应代码实际学习下相关内容,只提一点,bcm_esw_l2_init函数会调用_bcm_l2_bp_init函数对l2_user_etry表项设置BPDU报文上CPU的规则;
f. 然后对unit的每个端口调用bcm_port_stp_set()函数、bcm_port_autoneg_set()函数和bcm_stat_clear()函数分别设置端口的STP的状态为转发、是否自动协商和清楚端口统计;
g. 然后调用bcm_linkscan_enable_set函数来定期查询端口的link状态;
h. 部分芯片还会调用bcm_linkscan_register注册trunk口的link状态查询回调函数;
⑵ linux内核编译完成后重启,出现mdio-gpio is already registered,怎么办
图片好小...
不过依稀看到了是加载一个内核模块(dm-region-hash)错误,这个模块应该是和文件系统相关的,然后后面mount 文件系统的时候就找不到磁盘...
你更新了的内核出了问题...加载模块的时候显示这个模块已经存在,所以就没法insmod这个模块,操作不成功了。大概是重复加载了...
然后给你搜索了下,这个问题好像比较常见,这里面有人给出了解决方案:
地址:
把有用的给你贴出来吧...
insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists
这一句是说你把dm-region-hash编译进内核,却没有生成dm-region-hash.ko文件,可能是有些需要的项没选上,我也是遇到这种问题,一直没解决 [/quote]
是因为重复加载了/lib/dm-region-hash.ko
可以解决的,步骤如下
1,解压initrd文件
[root@bogon ~]# cp /boot/initrd-2.6.30.4.img /tmp
[root@bogon ~]# cd /tmp/
[root@bogon tmp]# ls
initrd-2.6.30.4.img
[root@bogon tmp]# mkdir newinitrd
[root@bogon tmp]# cd newinitrd/
[root@bogon newinitrd]# zcat ../initrd-2.6.30.4.img |cpio -i
11537 blocks
释放之后看到如下内容
[root@bogon newinitrd]# ls
bin dev etc init lib proc sbin sys sysroot
2,ok,下边就是编辑init,删掉其中重复的四行中的两行
echo "Loading dm-region-hash.ko mole"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko mole"
insmod /lib/dm-region-hash.ko
3,重新打包initrd
[root@bogon newinitrd]# find .|cpio -c -o > ../initrd
11538 blocks
[root@bogon newinitrd]# cd ..
[root@bogon tmp]# gzip -9 < initrd > initrd.img
[root@bogon tmp]# ls
initrd-2.6.30.4.img initrd initrd.img newinitrd
好了,initrd.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot,更改grub.conf里边的initrd-2.6.30.4.img为initrd.img就可以了,
这样“insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists” 就不会有了
其实将init文件的第二行“setquiet” 去掉,你就知道initrd文件到底在做什么了
⑶ 如何使BeagleBone SD卡启动时不再分区
bbb板子上自带2G eMMC, 但是对很多应用来说, 容量还是远远不够, 于是我想用sd卡扩展空间, 但是发现一插入sd卡, 板子就启动不了啦, 去google了一下原因, 原来bbb的原生系统所带的uboot启动的时候如果发现有sd卡, 则sd卡会变成mmc0, eMMC则变成mmc1, 导致启动失败, 于是搜了很多资料, 努力了一个晚上终于搞定这个问题....
首先你需要一张microSD卡, 一个读卡器, 我用的是笔记本自带的, 启动ubuntu(或者别的linux系统, windows不行), 把sd卡插进读卡器里, 输入
fdisk -l
查看一下当前sd卡设备的名称, 我的是mmcblk0, 于是
fdisk /dev/mmcblk0
进行分区, 使用命令 d 删除sd卡上目前存在的所有分区, 使用n 命令分别创建2个分区, 第一个小一点的, 大概几十m就可以了, 用作启动区, 第二个分区就是剩下的所有空间, 最后输入w命令写入分区表, 如果不熟悉fdisk命令的话可以去找网络看一下.
接下来使用mkfs命令分别格式化两个分区:
mkfs -t vfat -F 16 -n boot /dev/mmcblk0p1
mkfs -V -t ext4 -j -L data /dev/mmcblk0p2
两个分区命名为boot 跟 data, 第一个是fat16格式的, 第二个是ext4格式的, 接下来挂载第一个分区到根目录下, 并在上面创建一个文件uEnv.txt , 将下面几行内容写进去:
mmcdev=1
bootpart=1:2
mmcroot=/dev/mmcblk1p2 ro
optargs=quiet
保存后umount, 把sd卡拿出来, 插到BBB板子上, 最后上电, 启动成功!!
我刚开始的时候只是google到uEnv.txt以及它的内容, 没有注意使用fdisk以及mkfs制作启动sd卡, 插进BBB板子后启动失败, 看串口调试信息显示:
Bad partition specification mmc 1:2
于是查了半天终于发现是sd卡的分区不对, 用以上方法制作成功后, 串口观察启动过程:
U-Boot SPL 2013.04-dirty (Jun 19 2013 - 09:57:14)
musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn)
musb-hdrc: MHDRC RTL version 2.0
musb-hdrc: setup fifo_mode 4
musb-hdrc: 28/31 max ep, 16384/16384 memory
USB Peripheral mode controller at 47401000 using PIO, IRQ 0
musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn)
musb-hdrc: MHDRC RTL version 2.0
musb-hdrc: setup fifo_mode 4
musb-hdrc: 28/31 max ep, 16384/16384 memory
USB Host mode controller at 47401800 using PIO, IRQ 0
OMAP SD/MMC: 0
mmc_send_cmd : timeout: No status update
reading u-boot.img
reading u-boot.img
U-Boot 2013.04-dirty (Jun 19 2013 - 09:57:14)
I2C: ready
DRAM: 512 MiB
WARNING: Caches not enabled
NAND: No NAND device found!!!
0 MiB
MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1
*** Warning - readenv() failed, using default environment
musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn)
musb-hdrc: MHDRC RTL version 2.0
musb-hdrc: setup fifo_mode 4
musb-hdrc: 28/31 max ep, 16384/16384 memory
USB Peripheral mode controller at 47401000 using PIO, IRQ 0
musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn)
musb-hdrc: MHDRC RTL version 2.0
musb-hdrc: setup fifo_mode 4
musb-hdrc: 28/31 max ep, 16384/16384 memory
USB Host mode controller at 47401800 using PIO, IRQ 0
Net: <ethaddr> not set. Validating first E-fuse MAC
cpsw, usb_ether
Hit any key to stop autoboot: 1 0
gpio: pin 53 (gpio 53) value is 1
mmc0 is current device
micro SD card found
mmc0 is current device
gpio: pin 54 (gpio 54) value is 1
SD/MMC found on device 0
reading uEnv.txt
62 bytes read in 2 ms (30.3 KiB/s)
Loaded environment from uEnv.txt
Importing environment from mmc ...
gpio: pin 55 (gpio 55) value is 1
mmc_send_cmd : timeout: No status update
4270840 bytes read in 746 ms (5.5 MiB/s)
gpio: pin 56 (gpio 56) value is 1
24129 bytes read in 51 ms (461.9 KiB/s)
Booting from mmc ...
## Booting kernel from Legacy Image at 80007fc0 ...
Image Name: Angstrom/3.8.13/beaglebone
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 4270776 Bytes = 4.1 MiB
Load Address: 80008000
Entry Point: 80008000
Verifying Checksum ... OK
## Flattened Device Tree blob at 80f80000
Booting using the fdt blob at 0x80f80000
XIP Kernel Image ... OK
OK
Using Device Tree in place at 80f80000, end 80f88e40
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
[ 0.194032] omap2_mbox_probe: platform not supported
[ 0.204621] tps65217-bl tps65217-bl: no platform data provided
[ 0.281250] bone-capemgr bone_capemgr.8: slot #0: No cape found
[ 0.318357] bone-capemgr bone_capemgr.8: slot #1: No cape found
[ 0.355465] bone-capemgr bone_capemgr.8: slot #2: No cape found
[ 0.392574] bone-capemgr bone_capemgr.8: slot #3: No cape found
[ 0.412614] bone-capemgr bone_capemgr.8: slot #6: BB-BONELT-HDMIN conflict P8.45 (#5:BB-BONELT-HDMI)
[ 0.422237] bone-capemgr bone_capemgr.8: slot #6: Failed verification
[ 0.429015] bone-capemgr bone_capemgr.8: loader: failed to load slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
[ 0.451672] omap_hsmmc mmc.4: of_parse_phandle_with_args of 'reset' failed
[ 0.516043] pinctrl-single 44e10800.pinmux: pin 44e10854 already requested by 44e10800.pinmux; cannot claim for gpio-leds.7
[ 0.527764] pinctrl-single 44e10800.pinmux: pin-21 (gpio-leds.7) status -22
[ 0.535082] pinctrl-single 44e10800.pinmux: could not request pin 21 on device pinctrl-single
[ 6.375621] libphy: PHY 4a101000.mdio:01 not found
[ 6.380726] net eth0: phy 4a101000.mdio:01 not found on slave 1
systemd-fsck[85]: Angstrom: clean, 50623/112672 files, 325594/449820 blocks
.---O---.
| | .-. o o
| | |-----.-----.-----.| | .----..-----.-----.
| | | __ | ---'| '--.| .-'| | |
| | | | | |--- || --'| | | ' | | | |
'---'---'--'--'--. |-----''----''--' '-----'-'-'-'
-' |
'---'
The Angstrom Distribution beaglebone ttyO0
Angstrom v2012.12 - Kernel 3.8.13
beaglebone login:
红字就是读sd卡配置环境文件uEnv.txt的过程, 因为插入sd卡后设备号有变动, 因此实际上这个方法是把root重新定义了回去, 使得系统能正确找到zImage的位置.
⑷ linux网络连接问题。因为写不下所以我删掉了一些,只留下了一些觉得重要的东西。
这里介绍学习Linux的一些建议。
一、从基础开始: 常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的。例如:为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用者的权限等问题,这些问题其实都不是很难的,只要了解了 Linux 的基础之后,应该就可以很轻易的解决掉这方面的问题。而有些朋友们常常一接触Linux 就是希望构架网站,根本没有想到要先了解一下Linux 的基础。这是相当困难的。
二、Linux命令是必须学习 虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命令行,无论图形界面发展到什么水平这个原理是不会变的,Linux命令有许多强大的功能:从简单的磁盘操作、文件存取、到进行复杂的多媒体图象和流媒体文件的制作。举一个例子:Linux的常用命令find,察看man文档,初学者一定会觉得太复杂而不原意用,但是你一旦学会就爱不释手.它的功能实在太强了,在配合exec参数或者通过管道重定向到xargs命令和grep命令,可以完成非常复杂的操作,如果同样的操作用图形界面的工具来完成,恐怕要多花十几陪的时间. 不同版本的Linux命令数量不一样,这里笔者把它们中比较重要的和使用频率最多的命令,按照它们在系统中的作用分成几个部分介绍给大家,通过这些基础命令的学习我们可以进一步理解Linux系统: 安装和登录命令:login、 shutdown、 halt、 reboot 、mount、umount 、chsh 文件处理命令:file、 mkdir、 grep、dd、 find、 mv 、ls 、diff、 cat、 ln 系统管理相关命令: df、 top、 free、 quota 、at、 lp、 adser、 groupadd kill、 crontab、 tar、 unzip、 gunzip 、last 网络操作命令:ifconfig、 ip 、ping 、 netstat 、telnet、 ftp、 route、 rlogin rcp 、finger 、mail 、nslookup 系统安全相关命令: passwd 、su、 umask 、chgrp、 chmod、chown、chattr、sudo、 pswho
三、选择一本好的工具书 工具书对于学习者而言是相当重要的。一本错误观念的工具书却会让新手整个误入歧途。目前国内关于Linux的书籍有很多不过精品的不多,笔者强烈建议阅读影印本的“O'Reilly原版Linux图书 ”,而且出版社还提供了一个非常好的路线图:。
四、选择一个适合你的Linux发行版本 目前全球有超过1百多个Linux发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,Redhat Linux 和Debian Linux是网络管理员的理想选择。对于英语不是很好的读者红旗Linux、中标Linux这些中文版本比较适合。现在一些Linux网站有一些Linux版本的免费下载,这里要说的是并不适合Linux初学者。
五、 养成在命令行下工作: 一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢,但是熟悉后,您未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。即使是通过一条缓慢的调制解调器线路,它也能操纵几千公里以外地远程系统。
六、 选择一个适合你的Linux社区; 随着Linux应用的扩展,出现了不少Linux社区。其中有一些非常优秀的社区:(国内最高水平GNU站点)、 (中国最大的Unix技术社区),但是这几个论坛往往是Linux高手的舞台,如果在探讨高级技巧的论坛张贴非常初级的问题经常会没有结果。
七、勤于实践: 要增加自己Linux 的技能,只有通过实践来实现了。所以,赶快找一部计算机,赶快安装一个 Linux 发行版本,然后进入精彩的Linux世界。相信对于你自己的 Linux 能力必然大有斩获。此外,人脑不像计算机的硬盘一样,除非硬盘坏掉了或者是资料被你抹掉了,否则储存的资料将永远而且立刻的记忆在硬盘中。在人类记忆的曲线中,你必须要不断的重复练习才会将一件事情记得比较熟。同样的,学习 Linux 也一样,如果你无法经常学习的话,学了后面的,前面的忘了。你对Linux命令熟悉后你可以开始搭建一个小的Linux网络,这是最好的实践方法。Linux是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web服务器、DNS服务器等都非常完善。当然你不需搭建所有服务,可以慢慢来。需要说明的是这个Linux网络对于初学者有两三台计算机即可,其中一台计算机最好安装Windows系统。自己多动手,不要非要等着别人帮你解决问题。
⑸ linux driver mdio-gpio is already registered
mdio-gpio 已经注册了,可以你却还要注册啊,注册重复啦。
⑹ 雄迈板子,3535芯片,网络芯片是AR8035,kernel驱动怎么弄
海思网络部分物理上看一般是MAC连接PHY(就是8035)再连接网络变压器再到RJ45
从数据通路上看, MAC是海思芯片内部的模块,通过MDIO来设置PHY(读写PHY的寄存器), 通过MII/RMII/RGMII接口(3535都支持)来和PHY交换网络数据
通常情况下, 海思的linux网络驱动基本都是好的,要修改的一般就是PHY地址和使用MII/RMII/RGMII接口中的哪一种,这个在linux config时应该都可以选
另外, 要注意一下管脚复用, 一般uboot配网络时应该都把复用关系改好了,只要后面不要再改变就好了
3535有两个MAC, 两套PHY接口, 一套MDIO接口(有点像I2C, 可以读写多个PHY)