存档2022年4月28日

飞腾平台linux调频指令介绍

一.简介

    现代的CPU和主板都有节电技术,在CPU低负荷工作的会自动降频。如果需要临时设置主频和工作模式,可使用cpufreq手动调整。这个模式将在重启后失效,如果需要长期调整请修改/etc/sysconfig/cpuspeed。在飞腾平台上同样实用。具体原理与直接调节文件配置文件一样,使用命令调节更快更方便。 阅读更多

基于飞腾uefi ,添加protocol实战

本文主要基于飞腾提供的开放uefi,在源码中添加一个DXE 驱动,并安装protocol,可供其余接口进行下查询。

具体uefi原理可以自行百度。

代码实现:

1 在dsc dec fdf中添加相关文件路径与guid

在edk2-for-support/PhytiumPkg/PhytiumD2000Pkg/PhytiumD2000Pkg.dec文件的[Protocols]中添加guid

 gCsdnGoodProtocolGuid   = {0xf8dec080, 0x22a3, 0x4d51, {0x90, 0x1a, 0x81, 0x2a, 0xae, 0x79, 0x59, 0xf8}}

2 在PhytiumD2000Pkg.dsc与PhytiumD2000Pkg.fdf中分别添加自己写的DXE驱动路径

  $(PLATFORM_PACKAGE)/Drivers/CsdnDxe/CsdnDxe.inf

3 添加在PhytiumPkg/PhytiumD2000Pkg/Include/Protocol/文件中新建一个头文件CsdnGood.h

在头文件内部添加

#ifndef _CSDN_GOOD_
#define  _CSDN_GOOD_
#include
typedef struct _CSDN_GOOD_PROTOCOL  CSDN_GOOD_PROTOCOL;
extern EFI_GUID         gCsdnGoodProtocolGuid;
struct _CSDN_GOOD_PROTOCOL {
  UINT8             version;
  UINT8             number;
};
#endif
4 在对应Drivers文件夹下面添加一个CsdnDxe文件夹中添加inf文件与C文件

inf文件

[Defines]
  INF_VERSION                    = 0x00010005
  BASE_NAME                      = CsdnDxe
  FILE_GUID                      = 4fcc8ea6-9b61-11ec-bea6-8bff64d45a7a
  MODULE_TYPE                    = DXE_DRIVER
  VERSION_STRING                 = 1.0
  ENTRY_POINT                    = UefiMain
[Sources]
  CsdnDxe.c
[Packages]
  MdePkg/MdePkg.dec
  MdeModulePkg/MdeModulePkg.dec
  PhytiumPkg/PhytiumD2000Pkg/PhytiumD2000Pkg.dec
[LibraryClasses]
  BaseLib
  IoLib
  BaseMemoryLib
  UefiDriverEntryPoint
  UefiBootServicesTableLib
  UefiRuntimeServicesTableLib
  DebugLib
  MemoryAllocationLib
  DxeServicesLib
  ArmSmcLib
  ArmLib
  DevicePathLib
  UefiLib
[Pcd]
[FixedPcd]
[Guids]
[Protocols]
gCsdnGoodProtocolGuid
[Depex]
TRUE

C文件:

#include <Protocol/CsdnGood.h>
#include <Library/DebugLib.h>
#include <Library/IoLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
EFI_STATUS
EFIAPI
UefiMain (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
    EFI_STATUS    Status;
    CSDN_GOOD_PROTOCOL  *mCsdnGoodProtocol;
    mCsdnGoodProtocol = AllocatePool (sizeof (CSDN_GOOD_PROTOCOL));
    DEBUG ((EFI_D_INFO, “ly_test_csdn \n));
    mCsdnGoodProtocol->version = 0;
    mCsdnGoodProtocol->number =1;
    Status = gBS->InstallProtocolInterface(
                &ImageHandle,
                &gCsdnGoodProtocolGuid,
                EFI_NATIVE_INTERFACE,
                &mCsdnGoodProtocol
                );
    ASSERT_EFI_ERROR (Status);
    DEBUG ((EFI_D_INFO, \
“ly_test_csdn mCsdnGoodProtocol->version:%d \n,mCsdnGoodProtocol->version));
    CSDN_GOOD_PROTOCOL *gCsdnGoodProtocol;
    Status = gBS->LocateProtocol (&gCsdnGoodProtocolGuid,
                                       NULL,
                             (VOID **) &gCsdnGoodProtocol);
    if (!EFI_ERROR (Status)){
         if(gCsdnGoodProtocol != NULL)
       {
        gCsdnGoodProtocol->version = 1;
       }
  }
 DEBUG ((EFI_D_INFO, \
“ly_test_csdn gCsdnGoodProtocol->version:%d \n,gCsdnGoodProtocol->version));
}
 
6 最终实现效果:

麒麟SP1系统ltp编译安装指导

使用麒麟系统编译LTP,会出现不同版本编译时候会有报错的情况,解决办法:
1) ltp的安装文件默认安装在/opt
2) ltp-full-20160510版本编译报错
报错截图
解决方法
1.下载安装ltp测试工具以及补丁(changed_bykylin.patch)
    $sudo tar -xvf ltp-full-20160510.tar.bz2 
    $cd ltp-full-20160510
    arm版本执行:$sudo ./configure –build=arm-linux或sudo ./configure –host=aarch64
2.拷贝changed_bykylin.patch至ltp-full-20160510,然后执行:
   $ cd ..
   $ patch -p0 < ./ltp-full-20160510/changed_bykylin.patch
   $ cd ltp-full-20160510
3.$ sudo make
   $ sudo make install
4.$sed -i ‘s/$(free/$(LC_ALL=C free/’ /opt/ltp/testscripts/ltpstress.sh
5.$cd /opt/ltp/testscripts && ./ltpstress.sh -l ~/ltpstress.log -t 48 -n-t 48表示测试时间48小时。

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地址段,根据实际情况确定 本章节就介绍到这里,各位还有疑问的话,可以共同探讨一下,主页邮件联系。

飞腾平台下各类常见问题排查指导

1 查看内核开机日志

当前麒麟 统信的操作系统,默认关闭内核日志信息,排查问题时候,打开系统开机打印,提供更多日志信息,便于排查问题。开启日志方法:在开机引导选项 grub中,添加标红命令 :linux   /vmlinuz-4.19.0-arm64-desktop root=UUID=ro  splash console=tty plymouth.ignore-serial-consoles DEEPIN_GFXMODE=$DEEPIN_GFXMODE console=ttyAMA0,115200n8 loglevel=7 systemd.log-level=debug systemd.log-target=kmsg  no_console_suspend initcall_debug

查看更多系统信息可以输入echo 7      4       1      7 > /proc/sys/kernel/printk

2 使用EC键盘发现系统下按键卡顿

出现该问题可能原因在于EC配置寄存器有误,导致系统下中断上报太多。

查看中断是否正常

cat /proc/interrupts   图片可以看到中断明显异常

 

解决办法:

 

PBTEE环境搭建

系统环境 ubuntu20.04  使用18.04 会存在glibc 版本太低,最低要求glibc 2.28,而18.04 的glibc 2.27.更换glibc难度太大,稍不注意会导致命令没有,启动失败,

watchdog使用方法介绍

watchdog简介与使用方法介绍

本文介绍飞腾平台(简称FT)watchdog相关知识,以及如何在uefi固件下和操作系统下配置使用watchdog的方法。

实验环境:D2000+FT uefi +kylin

FT watchdog符合 ARM规范的watchdog 参考链接: SBSA (Arm Server Base System Architecture)      因此在寄存器配置上,是兼容的。小编对比过相关寄存器,也就是基址不一样,所以在使用方法上和标准linux  uefi是一样的。

linux上源码 在上文链接中有详细介绍,我在这里阐述一下自己的理解, watchdog中的操作主要涉及到初始化寄存器、是指超时时间、使能看门狗、第一次超时 ws0寄存器被置1,上报中断,第二次超时 ws1寄存器置1,芯片将会进入热复位,芯片内部重新上电相当于重新开机。在看门狗计时器件,可以重新填入超时时间,此时将重新计数。参考文档 腾锐D2000软件编程手册》

UEFI watchdog介绍

在ft uefi中,已经添加了watchdot相关的支持

其中dsc中已经描述了飞腾通用寄存器与中断寄存器基址与偏移,

#
#  SBSA Watchdog
#  
   gArmTokenSpaceGuid.PcdGenericWatchdogControlBase|0x2800B000
   gArmTokenSpaceGuid.PcdGenericWatchdogRefreshBase|0x2800A000
   gArmTokenSpaceGuid.PcdGenericWatchdogEl2IntrNum|48
#
# ARM General Interrupt Controller
#
  gArmTokenSpaceGuid.PcdGicDistributorBase|0x29900000
  gArmTokenSpaceGuid.PcdGicRedistributorsBase|0x29980000
  gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0x29c00000

且开源uefi中已经集成arm watchdog驱动路径:ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.c

因此在整个uefi DXE阶段之后,都是可以直接使用watchdog功能的。

具体使用方法:第一个参数为设置秒数 ,设置为0将会主动关闭看门狗功能。

gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);

uefi中,将watchdog驱动注册,提供了中断支持,关闭、重设时间等功能。整个uefi代码中也多次使用了watchdog。在标准驱动中,进入uefishell 进入gurb代码都会主动关闭看门狗功能。


kernen watchdog 介绍

内核想要使用watchdog功能,固件提供相应支持

在ACPI表的GTDT中需要有看门狗的相关描述,汇报给操作系统PhytiumPkg/Phytium2004Pkg/Drivers/AcpiTables/Gtdt.aslc

操作系统会在开机过程中匹配相关字符串,若成功匹配,则会在系统中有watchdog的字符设备:/dev/watchdog0,1,2,若成功出现该字符设备,说明系统下看门狗功能就可以使用了。

系统下测试看门狗方法:

(没想好该不该介绍,毕竟用到了别人开发的程序)