AT实现PCIE模式切换

本文介绍了一种在展锐平台上通过AT命令实现PCIe模式切换的方法,涉及AT指令设置、Uboot中miscdata分区读取以及内核驱动加载。通过在atrouter写标志、uboot读取并传递cmdline到内核以及设备树和驱动的配合,成功实现了PCIe EP和RC模式的切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

某展锐平台有这样一个PCIe的客户需求:
通过执行 AT+QCFG=“pcie/mode” 查询模块当前模式,0 表示PCIe EP 模式;1 表示PCIe RC 模式。
若模块处于RC 模式,执行AT+QCFG=“pcie/mode”,0 并重启模块将PCIe 模式切换至EP 模式;同样,也可以通过命令由EP模式切换到RC模式。

通过验证,设计方案如下实现:
1.在atrouter中写标志到miscdata分区
2.uboot中读取miscdata中的标志,并添加cmdline,传递到内核
3.在设备树中添加RC和EP节点,在对应的驱动中解析cmdline,来区分是否加载对应的驱动

详细步骤如下:
1.在atrouter中写miscdata分区
本来是计划写item项的,但是后面读取时发现在uboot中并没有对应的接口,太麻烦。考虑到uboot中有对应的miscdata读取接口,于是用写miscdata分区方式实现。
数据写到768 * 1024+1024的位置,如果是EP模式,写入EP_mode,如果是RC模式,写入RC_mode。
代码片段如下:

//#include "ATSWDUMPHandler.h"
#include <stdbool.h>
#include <errno.h>
#include <time.h>
#include <getopt.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
	
#ifndef  __packed
#define __packed __attribute__((packed))
#endif

#define  CONFIG_NAND
	
#ifdef CONFIG_NAND
#include <ubi-user.h>
#include <sys/ioctl.h>
#endif


#ifdef CONFIG_NAND
#define PATH_MISCDATA_PREFIX "/dev/ubi0_"
#else
#define PATH_MISCDATA_PREFIX "/dev/disk/by-partlabel/"
#define PATH_PROC_PREFIX "/etc/productinfo"
#endif

///source/unisoc/engpc/modules/libmiscdata/miscdata.c
#define NAND_MISCDATA_FILESIZE (1024 * 1024)
#define NAND_MISCDATA_CUSTOMER_START (768 * 1024)
#define NAND_MISCDATA_CUSTOMER_CAN_USR ((NAND_MISCDATA_FILESIZE) - (NAND_MISCDATA_CUSTOMER_START))
//下面这个宏定义为你要放的数据存在客户可用的区域的起始地址(至少为0),如果有多个量要存储,记住不要重叠,会覆盖
#define Nand_MISCDATA_INFO_OFFSET 1024 
#define NAND_MISCDATA_SWDUMP ((NAND_MISCDATA_CUSTOMER_START)+(Nand_MISCDATA_INFO_OFFSET))
static int swdumplength = 7;

unsigned long get_file_size(const char *path) {
   
  /*
   unsigned long filesize = -1;
   struct stat statbuff;
   if(stat(path, &statbuff) < 0){
   return filesize;
   }else{
   filesize = statbuff.st_size;
   }
   return filesize;
   */
  return NAND_MISCDATA_FILESIZE;
}


int read_miscdata(char *databuf, int data_len) {
   
  AT_LOGD("enter the function read_miscdata");
  AT_LOGD("data_len is %d",data_len);
  int ret = 0;
  int len;
  char prop[128] = {
    0 };
  char miscdata_path[128] = {
    0 };
  int fd = -1;

  sprintf(prop, "%s", PATH_MISCDATA_PREFIX);
  sprintf(miscdata_path, "%smiscdata", prop);
  fd = open(miscdata_path, O_RDONLY);
  if (fd >= 0) {
   
    AT_LOGD("%s open Ok miscdata_path = %s ", __FUNCTION__, miscdata_path);
    len = read(fd, databuf, data_len);
    AT_LOGD("databuf is %s",databuf);
    if (len <= 0) {
   
      ret = -2;
      AT_LOGD("%s read fail miscdata_path = %s ", __FUNCTION__, miscdata_path);
    }
    close(fd);
  } else {
   
    AT_LOGD("%s open fail miscdata_path = %s ", __FUNCTION__, miscdata_path);
    ret = -3;
  }
  return ret;
}


int write_mis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

归心2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值