一:uboot的启动过程的基本知识

uboot的基本移植过程:分为步奏1 ,步奏2;

代码入口:u-boot/arch/arm/cpu/u-boot.lds连接文件。ENTRY(_start):代码的入口函数。

\board\ti\am335x\u-boot.lds保存了U-boot数据代码段在内存中的存放情况

启动步奏:_start标号:arch\arm\cpu\armv7\start.s复位;

bl cpu_init_cp15:主要对cp15协处理器进行初始化,关闭MMU和tlb(处理器访问内存时做地址转换),和cache。

然后调用:cpu_init_crit。:跳转到开发板的相关的初始化代码,初始化相关寄存器

arch\arm\cpu\armv7\lowlevel_init.S:特定开发板的设置代码。

核心代码:lowlevel_init。跳转到:s_init(void)(板卡级别c的程序)\arch\arm\cpu\armv7\am33xx\board.c-s_init

_main()  ENTRY(_main)

1:arch/arm/lib/crt0.s中跳转到ldr    pc, =board_init_r。(\arch\arm\lib\board.c中)

进入到板卡的运行程序中。

函数调用流程:(am3352 的网口cpsw网卡驱动只能驱动两个网口)

eth_initialize(gd->bd)->phy_init()->(phy驱动初始化,用来配置phy)

phy_smsc_init();用来注册phy的驱动初始化的接口

对phy的初始化操作:static struct phy_driver lan8710_driver = { //驱动程序 (用来定义phy 的行为)
    .name = "SMSC LAN8710/LAN8720",
    .uid = 0x0007c0f0,
    .mask = 0xffff0,
    .features = PHY_BASIC_FEATURES,
    .config = &genphy_config_aneg,  //驱动配置
    .startup = &genphy_startup,     //驱动开始
    .shutdown = &genphy_shutdown,
};

//用来初始化335x的网卡驱动芯片。

board_eth_init:读mac地址

writel(MII_MODE_ENABLE, &cdev->miisel):mii操作寄存器

->board_eth_init(\board\ti\am335x\board.c)->cpsw_register(&cpsw_data)->cpsw_phy_init->phy_connect

根据寄存器得到存放的mac地址,

->phy_find_by_mask(确保phy已经启动复位)

网卡配置的slave的配置(也就是网卡对phy的配置参数)

网卡对于phy寄存器的基址。

static struct cpsw_slave_data cpsw_slaves[] = {
    {
        .slave_reg_ofs    = 0x208,   //从设备寄存器的偏移地址
        .sliver_reg_ofs    = 0xd80,
        .phy_addr    = 0,
    },
    {
        .slave_reg_ofs    = 0x308,
        .sliver_reg_ofs    = 0xdc0,
        .phy_addr    = 1,
    },
};

rv = cpsw_register(&cpsw_data);:注册cpsw网卡驱动

网卡对主的cpsw的配置的默认参数:static struct cpsw_platform_data cpsw_data = {

.mdio_base        = CPSW_MDIO_BASE, 0x4A100800  mdio基地址
    .cpsw_base        = CPSW_BASE,  cpsw基地址
    .mdio_div        = 0xff,
    .channels        = 8, dma通道号
    .cpdma_reg_ofs        = 0x800,   dma寄存器偏移值
    .slaves            = 1,
    .slave_data        = cpsw_slaves,
    .ale_reg_ofs        = 0xd00,   地址搜寻寄存器偏移值
    .ale_entries        = 1024, 地址表大小
    .host_port_reg_ofs    = 0x108,  port寄存器偏移值
    .hw_stats_reg_ofs    = 0x900,  硬件状态寄存器偏移值
    .bd_ram_ofs        = 0x2000, buffer 描述ram偏移值
    .mac_control        = (1 << 5),
    .control        = cpsw_control,
    .host_port_num        = 0,
    .version        = CPSW_CTRL_VERSION_2,};

for_each_slave(slave, priv) {
        cpsw_slave_setup(slave, idx, priv);
        printf("slave->slave_num=%d,\n",slave->slave_num);
        idx = idx + 1;
    }判断搜寻phy驱动

dev->init    = cpsw_init;网卡驱动初始化,网卡驱动发送,网卡驱动接收
    dev->halt    = cpsw_halt;停止
    dev->send    = cpsw_send;
    dev->recv    = cpsw_recv;

eth_register(dev);注册网卡

cpsw_mdio_init:注册mdio总线驱动。根据mdio寄存器控住总线。mdio总线初始化,初始化phy设备的读写操作接口函数注册mii_dev总线设备:主要参数名称,读操作,写操作。

priv->bus = miiphy_get_dev_by_name(dev->name);根据总线名称得到总线。

cpsw_phy_init:phy设备初始化接口

phy_find_by_mask->create_phy_by_mask->phy_device_create(创建phy设备)->get_phy_driver查询得到phy的设备。->phy_probe使能phy设备。

for_active_slave(slave, priv)搜寻实际的从设备,确定设备参数。

phydev = phy_connect(priv->bus, slave->data->phy_addr,dev,slave->data->phy_if);->phy_reset将网卡设备与phy设备连接

phy_config->board_phy_config->  .config = &genphy_config_aneg,

以上就是phy驱动基于cpsw的基本流程。

小知识点:ffs用来查找整数中第一个bit为1的数。

uboot调试过程:用来调试phy不通的过程(am3352)相关推荐

  1. linux如何调试elf程序,Linux下ELF的执行过程

    我们考虑从shell中执行一个Linux应用程序,并且该应用程序链接的是动态库,而不是静态库 1. 加载二进制文件 shell会执行evecve()进行系统调用,如下所示 execve() -> ...

  2. 【Flutter】Flutter 调试 ( 调试回退功能 | Debug 调试中查看变量的方式 | 控制台信息 )

    文章目录 一.调试回退功能 二.Debug 调试中查看变量的方式 三.Debug 控制台信息 四.相关资源 一.调试回退功能 在调试过程中 , 经常错过关键位置的调试 , 如没有进入关键方法进行调试 ...

  3. 调试笔记--keil 断点调试小技巧

    调试笔记–keil 断点调试小技巧 给变量打断点 调试不熟悉的项目时,卧槽!怎么这么多全局变量?这玩意又在那修改了??这个时候会给变量打断点就能省好多事. 将要监视的全局变量添加到watch窗口 选中 ...

  4. tensorflow 调试_如何开始调试TensorFlow

    tensorflow 调试 by Daniel Deutsch 由Daniel Deutsch 如何开始调试TensorFlow (How to get started debugging Tenso ...

  5. vscode调试html文件,vscode调试html文件

    1. vscode调试html文件 主要说明使用使用Debugger for Chrome插件如何配置,以及Nodejs的方式调试. 本文的配置方式是基于deepin系统的,适用于所有debian系的 ...

  6. as的断点调试与高级断点调试

    <div class="markdown_views"><blockquote> 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说A ...

  7. 借WS2812 PWM DMA驱动调试浅谈STM32调试思路

    借WS2812 PWM DMA驱动调试浅谈STM32调试思路 ​ 接触STM32差不多有4年了,在学校参加比赛时也需要进行各种调试工作,团队的配合也需要个人具有领域内快速定位与解决BUG的能力,前些日 ...

  8. GDB调试命令以及GDB调试段错误

    一.GDB的调试命令. C语言是:cc -g tst.c -o tst;C++是g++  -g -o (生成的文件) file.cpp C++调试程序命令:gdb  file 启动,罗列代码行数ist ...

  9. UVM交互式调试库:缩短调试周转时间

    摘要: 与其他硬件验证语言(Hadware Verfication Languages,HVL)(例如Specman e)不同,在System Verilog(SV)模拟中是不原生支持交互式调试功能的 ...

  10. 联芯 1860平台 icn6211 mipi to RGB 转换芯片 调试 和 st7789 LCD调试spi 9bit 模式

    关键字:联芯科技,LC1860,LC186x,Chipone Technology,icn6211,mipi bridge,mipi to RGB,mipi转换芯片,RGB666,st7789,st7 ...

最新文章

  1. Centos 7 docker 拉取镜像慢
  2. android 创建文件夹_Android安全(四)数据库 之 SQLite数据库
  3. IOS之Masonry约束的使用
  4. div无法触发blur事件解决的方法
  5. mysql三表where查询_mysql三表查询sql语句
  6. 蒙特卡罗模拟法 —— matlab
  7. 微信公众号开发之微信服务器配置
  8. 修改vCenter client无法连接
  9. BZOJ3235 [Ahoi2013]好方的蛇 【单调栈 + dp】
  10. MacOS如何修复磁盘权限
  11. 集成电路布图设计独创性判断标准
  12. access简述报表的功能_报表的主要功能_access标签报表有什么作用
  13. 使用prewitt算子分割白纸黑字图像(Matlab)
  14. fluent的udf在windows可以编译 linux错误,fluent中udf环境变量设置,简单可行!已试过!...
  15. Bootstrap broker localhost9092 (id -1 rack null) disconnected
  16. FlashPaper组件——api
  17. 来自Facebook的KTLS(Kernel SSL/TLS)原理和实例
  18. Zotero+OneDrive多平台在线同步完美解决方案(一):安装配置、云端同步文献数据
  19. 智能家居2.0 - Matter 1.0 标准和受益者
  20. 达观杯数据竞赛 -- LR+SVM处理词向量特征

热门文章

  1. D盘下的 msdia80.dll 怎么处理?
  2. CentOS 7 安装Dukto(局域网通信工具)
  3. delphi过时了吗?王者归来!从Pascal到Embarcadero Delphi 10.4.1的发展历史回顾
  4. 利用NSA方程式工具—“永恒之蓝”攻陷一台计算(MS17-010)
  5. 流程图制作规范与原则
  6. QT 操作 QLabel
  7. java利用poi为excel添加图片水印
  8. SpringSocial整合QQ授权登录
  9. 无人车传感器 IMU
  10. 省市县三级联动的实现方案