分类目录硬件

QSPI操作flash方法指导

本文主要介绍基于ft2000/4 D2000芯片 操作qspi接口的flash设备,用于指导读写flash,以及完成flash芯片写保护等功能开发。

一、flash寄存器简介

flash的常规操作为 读、写、擦除这三个基本动作,本文以GD25LQ128D型号为例。     首先我们熟悉一下flash芯片手册,flash芯片状态寄存器分为S15-S0 基本的flash操作命令对应的寄存器: 这些命令需要结合cpu软件编程手册,才可以发送出去, 二、CPU qspi寄存器简介 寄存器基址:0x28014000 在芯片端对于读操作,芯片层面做了直接映射,固件层面访问总线的0地址开始即可访问到flash里面的内容。在操作系统做了虚拟地址转换,无法直接访问0地址,需要通过rw或者busybox命令才可访问。

三、读flash   

 mm 0x0 -w 4         //从0x0地址开始读取flash,每次读取4字节数据,按下回车继续读取下四字节。

四、写flash   

结合芯片的软件编程手册,以及flash数据手册,可以执行如下命令
  • mm 28014010 -w 4 0x06400005   //发送写使能命令、数据有延时,使用32分频     mm 2801401c -w 4 0x1          //命令生效,操作该寄存器可以触发发送命令 mm 28014010 -w 4 0x0140200c   //发送flash写命令,发送两字节,有数据传输,0x00fc对应具体flash寄存器 mm 2801401c -w 4 0x00FC     //写入flash的具体数据,配置写保护模式(保护从0地址开始的16M数据) mm 2801401c -w 4 0x1         //命令生效 mm 28014010 -w 4 0x05002007  //读状态寄存器,具体读取(S7-S0) mm 2801401c -w 4 0x1         //命令生效 mm 2801401c -w 4          //读低位数据端口寄存器           0x000000002801401C : 0x000000FC      //读出来的状态寄存器配置 mm 28014010 -w 4 35002007  //读状态寄存器-1具体读取(S15-S8) mm 2801401c -w 4 0       //命令生效 mm 2801401c -w 4        //读低位数据端口寄存器          0x000000002801401C : 0x00000000    //读出来的状态寄存器配置

五、擦除flash   

    mm 28014010 -w 4 0x0240200c   //发送flash擦写命令,发送两字节,有数据传输     mm 2801401c -w 4 0xffff     //擦写具体flash地址段,根据实际情况确定 本章节就介绍到这里,各位还有疑问的话,可以共同探讨一下,主页邮件联系。

飞腾平台Can总线验证方法

介绍飞腾平台下如何验证与使用can总线的方法

验证环境:D2000平台、 CAN协议分析仪

1 安装can命令

apt-get update && apt-get install git   

cd /tmp   

git clone https://github.com/linux-can/can-utils.git   

cd can-utils/   

make   

make install

2 can 接口验证方法

1. 先配置复用寄存器为CAN0CAN1CAN2总线功能

 

2. 设置总线波特率,并开启CAN总线

 

3. 飞腾CAN0接收数据,CAN分析仪CAN1发送数据

系统下使用Canutils软件测试CAN总线,接收数据时执行./candump can0指令

4. 飞腾CAN0发送数据,CAN分析仪CAN1接收数据

系统下使用Canutils软件测试CAN总线,接收数据时执行./candump can0指令

 

 

1. 飞腾CAN0发送数据,CAN分析仪CAN1接收数据

系统下使用Canutils软件测试CAN总线,接收数据时执行./candump can0指令

飞腾平台下访问GMAC-PHY的方法

linux 系统下操作PHY读写方式

本文简单介绍使用源码编译,通过mdio方式操作PHY寄存器

1 获取源码

代码已经上传,可自行下载,另外可以下载我已经编译好的文件直接使用。

2 编译源码

编译命令:gcc mdio.c -o mdio

3赋予权限

chmod a+x mdio

4 查看网口

通过ifconfig -a命令查看你想要操作的网口,保存网口名,在后续会使用到

5读取phy ID示例

./mdio

mdio:

read operation: mdio reg_addr

write operation: mdio reg_addr value

For example:

mdio eth0 1

mdio eth0 0 0x12

例如要查看phy id 

 ./mdio enaphyt4i0 3

将会返回获取的值

 

介绍操作裕泰PHY的方法:

首先读取查看phy手册,可以指导PHY访问有多种方式

YT PHY 内部有三种类型的寄存器:MII 寄存器(MII register,以下简写为 mii_reg),扩展寄存器(extended register,以下简写为 ext_reg)和 MMD 寄存器(简写为 mmd_reg
mii_reg: 寄存器地址为 0~0x1f,遵从 802.3 clause 22 的标准定义方式进行访问。其 MDC/MDIO 协议如下:

ext_reg: 由于 mii_reg 只有 0~0x1f,即 32 个。不能满足产品对寄存器数目的要求,就通过访问两个 mii_reg 0x1e, 0x1f 来扩展了更多的寄存器。访问方式为:
将要访问的 ext_reg 地址,写入 mii_reg 0x1e.
mii_reg 0x1f 得到值,即为 ext_reg 内的值. 写值到 mii_reg 0x1f,即将 ext_reg 寄存器内容改为写入的值.
例如:读取 ext_reg0x1000 的值:write mii_reg0x1e 0x1000;
read mii_reg0x1f;
ext_reg0x1000 的值为 0x3456
write mii_reg0x1e 0x1000;
write mii_reg0x1f 0x3456; 

mmd_reg: 为了扩展更多的寄存器,以适应更高速率的以太网。MMD 寄存器被创造出来。遵从 802.3 clause
45 的标准定义方式进行访问。MMD 寄存器有两种访问方式:间接访问和直接访问。
直接访问:其协议与 MII 访问不同,它是通过两条指令实现 MMD 寄存器的读或写,即先发 address 指令,
再发 Write Read 指令实现,具体协议如下:
间接访问:即通过 MII 寄存器(mii_reg 0xd, mii_reg 0xe,其具体含义见下表)来访问 MMD 寄存器。比如:
MMD 3 0x5 寄存器,其指令为:
write mii_reg 0xd 0x3; write mii_reg 0xe 0x5; write mii_reg 0xd 0x4003; read mii_reg 0xe
MMD 7 0x3c 寄存器值为 0x6,其指令为:
write mii_reg 0xd 0x7; write mii_reg 0xe 0x3c; write mii_reg 0xd 0x4007; write mii_reg 0xe 0x6
以上文档从官方手册中摘取
接下来要实现对PHY配置 主要验证phy Template(电口指标)配置
初始化:
Write_comm_ext_reg0xa000: 0x0 #选择 UTP 地址空间
write_utp_ext_reg0x41 to 0x4
write_utp_ext_reg0x42 to 0x8
write_utp_ext_reg0x43 to 0xc
write_utp_ext_reg0x44 to 0x10
write_utp_ext_reg0x45 to 0x10
write_utp_ext_reg0x46 to 0x10
write_utp_ext_reg0x47 to 0x10
write_utp_ext_reg0x4a to 0x1180
1000BT:
Write_comm_ext_reg0xa000: 0x0 #选择 UTP 地址空间
write_utp_ext_reg0x27: 0x2026
write_utp_mii_reg0x10: 0x2
write_utp_mii_ reg0x0: 0x8140
Test Mode 1Transmit waveform test
write_utp_mii_reg0x9: 0x2200
write_utp_mii_reg0x0: 0x8140
Test Mode 2Transmit Jitter test (master mode)
write_utp_mii_reg0x9: 0x5a00
write_utp_mii_reg0x0: 0x8140
Test Mode 3Transmit Jitter test (slave mode)
write_utp_mii_reg0x9: 0x7200
write_utp_mii_ reg0x0: 0x8140
Test Mode 4Transmit distortion test
write_utp_mii_reg0x9: 0x8200
write_utp_mii_ reg0x0: 0x8140 

将访问方式通过间接访问操作 ext寄存器。
写了一个脚本 

#!/bin/bash
#参考此处进行配置 举例配置了PHY 0x41 值为2 并再次把值都出来。
echo 初始化
./mdio enaphyt4i0 0x1e 0xa000
./mdio enaphyt4i0 0x1f 0x0
./mdio enaphyt4i0 0x1e 0x41
./mdio enaphyt4i0 0x1f 0x4
./mdio enaphyt4i0 0x1e 0x42
./mdio enaphyt4i0 0x1f 0x8
./mdio enaphyt4i0 0x1e 0x43
./mdio enaphyt4i0 0x1f 0xc
./mdio enaphyt4i0 0x1e 0x44
./mdio enaphyt4i0 0x1f 0x10
./mdio enaphyt4i0 0x1e 0x45
./mdio enaphyt4i0 0x1f 0x10
./mdio enaphyt4i0 0x1e 0x46
./mdio enaphyt4i0 0x1f 0x10
./mdio enaphyt4i0 0x1e 0x47
./mdio enaphyt4i0 0x1f 0x10
./mdio enaphyt4i0 0x1e 0x4a
./mdio enaphyt4i0 0x1f 0x1180
echo 1000bt
#1000BT
./mdio enaphyt4i0 0x1e 0x27
./mdio enaphyt4i0 0x1f 0x2026
echo test mode1
    #test mode1
./mdio enaphyt4i0 0x10 0x2
./mdio enaphyt4i0 0x0 0x8140
./mdio enaphyt4i0 0x9 0x2200
./mdio enaphyt4i0 0x0  0x8140
echo test end

内存SPD信息查看与翻译

内存SPD解析

背景:本文主要在于讲解linux系统下 通过I2C解析内存SPD信息,并举例通过内存SPD信息算出内存实际频率。

一、安装i2c-tools工具

  • sudo apt update
  • sudo apt install i2c-tools
  • 安装不了去网站下 地址https://www.kernel.org/pub/software/utils/i2c-tools/
  • tar -xvf i2c-tools-4.1.tar.xz ,  解压工具包
  • make    & make install   //编译和安装
  • cp lib/libi2c.so.0.1.1  /usr/lib/libi2c.so.0

二、通过i2c工具 dump出内存SPD信息

  • 命令 ls /dev/i2c*
  • 在root下使用以下命令
    i2cdetect -y 0:  扫描I2C总线0下挂的设备 SPD由硬件决定内存一般挂在50或51上,由下图可以看出 此次内存挂在50地址上。
    探测I2C设备:

三、dump I2C设备寄存器

root下使用以下命令

i2cdump -f -y 0 0x50  : dump设备地址0x50的芯片寄存器 SPD内容

四、根据SPD计算相应内存频率

通过0x11地址的字节 可得该内存的粗细精度 相应的周期还需要根据 0x12以及0x7d的数据进行计算。

 

下图 其他关于时间的位和粗细精度的时间转

根据上图byte18:0x07       byte125: 0xd6

则周期计算过程为(7*0.125)+(-42*0.001)=0.833ns(1s/0.833ns)*2为该内存相应频率

算出结果:1200,因ddr4 采用双边沿采样,实际频率也就是2400,即可与内存条上面频率进行对比,判定内存是否与标签纸上是否一致。