This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMDSCSK8127:TMS320DM8127存储器映射寄存器读/写操作

Guru**** 633810 points
Other Parts Discussed in Thread: IPNC-RDK-CSK, TMS320DM8127
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/844216/tmdscsk8127-tms320dm8127-memory-mapped-registers-read-write-operation

器件型号:TMDSCSK8127
主题中讨论的其他器件: IPNC-RDK-CSKTMS320DM8127

我使用 TMDSCSK8127板并使用 IPNC-RDK-CSK (3_9_1)

我需要从终端更改和读取 PLLSS (以及任何其他)寄存器值

据我所知、Linux_prcm_ipcam 使用 WR_MEM_32 (addr、data)寄存器直接写入寄存器

和 RD_MEM_32 (addr)直接 从寄存器读取

我添加了下一个代码、允许我选择用于读/写寄存器操作的地址
到/IPNC_RDK-3.9.1/Sources/IPNC_RDK/IPNC_APP/utils/prcm_app/linux_prcm_ipcam

------------------------------


if (0=strcmp (argv[1]、"rd"))   //read reg value 操作
   {
   if (argc>2)
      {

      RD_MEM_32 (((int) strtol (argv[2]、NULL、16));
      
      }
   
   }
   
   
   其他
   if (0=strcmp (argv[1]、"wr"))   //写入寄存器值操作
   {
      if (argc>3)
         {
      int reg=(int) strtol (argv[2]、NULL、16);
      int val=(int) strtol (argv[3]、NULL、16);
      printf ("写入 reg %p val %p \n"、reg、val);
      WR_MEM_32 (reg、  val);
      RD_MEM_32 (reg);   //查看写入 reg 操作的结果
         }
      
   }
   其他
   开关(argv[1][0]){

------------------

我从终端在目标上运行它。
我在0x48180D10 RM_ISP_RSTCTRL 寄存器上对其进行测试:
读取寄存器值、然后将其他值写入寄存器地址、
再次读取 reg 值并找到它
此寄存器的写入操作成功:

------------------------------------------------------
root@ti81xx:/opt/ipnc #./linux_prcm_ipcam rd 0x48180D10
/dev/mem 已打开。
            PHY 地址:0x48180d10数据:0x00000007
root@ti81xx:/opt/ipnc #./linux_prcm_ipcam 电源0x48180D10 3.
/dev/mem 已打开。
写入寄存器0x48180d10 val 0x3  
            PHY 地址:0x48180d10数据:0x00000003
------------------------------------------------------

然后、在重新启动后、我尝试执行步骤来重新配置 VIDEO1PLL

e2e.ti.com/.../1161204

使用终端的"/linux_prcm_ipcam wer":

1.将 VIDEO1PLL_CLKCTRL[23] IDLE = 1 //这样您就开始从锁定/有效模式转换到旁路/空闲模式

PLLSS 外设寄存器基址:0x481C_5000 (TMS320DM8127 DaVinci 视频处理器数据表(修订版 C)的表3-6)
VIDEO1PLL_CLKCTRL 偏移: 1D4h   (表2-42 MS320DM814x DaVinci 数字媒体处理器技术参考手册(SPRUGZ8))           
------------------------------------------------------
root@ti81xx:/opt/ipnc #./linux_prcm_ipcam rd 0x481C51D4
            PHY 地址:0x481c51d4数据:0x08910811
------------------------------------------------------
因此、VIDEO1PLL_CLKCTRL[23] IDLE = 1

等待 VIDEO1PLL_STATUS[8] BYPASSCK =1和 VIDEO1PLL_STATUS[0] BYPASS =1
VIDEO1PLL_CLKCTRL 偏移: 1F4h
------------------------------------------------------
root@ti81xx:/opt/ipnc #./linux_prcm_ipcam rd 0x481C51F4
            PHY 地址:0x481c51f4数据:0xe0000161
------------------------------------------------------
因此、IDEO1PLL_STATUS[8] BYPASSCK == 1和 VIDEO1PLL_STATUS[0] BYPASS == 1

3、清零位 VIDEO1PLL_CLKCTRL[0] TINITZ = 0
------------------------------------------------------
root@ti81xx:/opt/ipnc。#./linux_prcm_ipcam 功率0x481C51D4 0x08910810                                      
/dev/mem 已打开。
写入寄存器0x481c51d4 val 0x8910810  
            PHY 地址:0x481c51d4数据:0x08910811
------------------------------------------------------
因此、我尝试更改 IDEO1PLL_STATUS 寄存器的值、但它失败、值不变。

我应该如何使用 PLLSS 存储器映射寄存器来更改它们的值?

我能否从 linux_prcm_ipcam 使用任何存储器映射寄存器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Gl88、

    是的、Linux_prcm_ipcam 可用于从用户空间访问(读取/写入) DM8127存储器映射寄存器。 您还可以使用 devmem2/或 omapconf 工具。


    有关更改 PLL 设置的正确顺序、请参阅以下 e2e 文章:

    此致、
    帕维尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我根据 ti_tools/hdvpss_01_00_01_37/docs/ti814x/TI814x_ES_2x_EVM_A8_DDR3.gel 中的代码测试下一个代码

    ----------------------------------------
    VIDCmdEO1PLL (内部 CLKIN、内部 N、内部 M、内部 M2)

           DCOCLK_COMP (CLKIN、N、M);
           if (HSMODE = 2){   
               PLL_Clocks_Config (VIDOO_1_PLL_base、CLKIN、N、M、M2、ADPLLJ_CLKCRTL_HS2);  
            //   GEL_TextOut ("\t VIDEO_1 ADPLLJ CLKOUT 值 =%d \n"、、、、 CLKOUT);
           }
           如果(HSMODE = 1){
               PLL_Clocks_Config (VIDOO_1_PLL_base、CLKIN、N、M、M2、ADPLLJ_CLKCRTL_HS1);  
           //    GEL_TextOut ("\t VIDEO_1 ADPLLJ CLKOUT 值 =%d \n"、、、、 CLKOUT);
           }
           否则{
            //        GEL_TextOut ("\t VIDEO_1 PLL 未配置。DCOCLK 输出错误\n"\});
           }
     


    DCOCLK_COMP (int CLKIN、int N、int M)
     {
            INT DCOCLK;
           DCOCLK =(CLKIN/(N+1))*M;
           
           if (DCOCLK >= 500 && DCOCLK < 1000){
                   HSMODE = 2; //HS2模式  
           }
           否则、如果(DCOCLK >= 1000 && DCOCLK < 2000){
                   HSMODE = 1; //HS1模式
           }
           否则 HSMODE = 0; //配置错误
           
           //返回 HSMODE;
     }

    PLL_Clocks_Config (UWORD32 Base_Address、UWORD32 CLKIN、UWORD32 N、UWORD32 M、UWORD32 M2、UWORD32 CLKCTRL_VAL)

       打印("[1]\n");
       UWORD32 m2nval、mn2val、read_clkctrl、clk_out、ref_clk、clkout_DCO = 0;
       m2nval =(M2<16)| N;
       mn2val = M;
       Ref_clk    = CLKIN/(N+1);
       clkout_DCO = ref_clk*M;
       CLK_OUT    = clkout_DCO/M2;

       unsigned int val;

       RD_MEM_32 (Base_Address+CLKCTRL);
       Val = RD_MEM_32 (Base_Address+CLKCTRL)& 0xfffffffe;
       打印("val 0x%X"、val);       
       WR_MEM_32 (Base_Address+CLKCTRL、val);
       RD_MEM_32 (Base_Address+CLKCTRL);    

       打印("[2]\n");
       while ((((RD_MEM_32 (Base_Address+STATUS))和0x00000101)!= 0x00000101);


    打印("[3]\n");
       RD_MEM_32 (Base_Address+CLKCTRL);
       Val = RD_MEM_32 (Base_Address+CLKCTRL)& 0xfffffffe;
       打印("val 0x%X\n"val);
       WR_MEM_32 (Base_Address+CLKCTRL、val);//TINITZ=0
       RD_MEM_32 (Base_Address+CLKCTRL);

       WAIT_DELAY (3);
    打印("[4]\n");
       RD_MEM_32 (Base_Address+M2NDIV);
       Val=m2nval;
       打印("val 0x%X\n"val);
       WR_MEM_32 ((Base_Address+M2NDIV   ),val);//写入 N 值
       RD_MEM_32 (Base_Address+M2NDIV);

    打印("[5]\n");
       RD_MEM_32 (Base_Address+M2NDIV);
       Val=mn2val;
       打印("val 0x%X\n"val);
       WR_MEM_32 ((Base_Address+MN2DIV   ),val);
       RD_MEM_32 (Base_Address+M2NDIV);

       WAIT_DELAY (3);

    打印("[6]\n");
       RD_MEM_32 (Base_Address+TENABLEDIV);
       Val = 0x1;
       打印("val 0x%X\n"val);
       WR_MEM_32 ((Base_Address+TENABLEDIV)、val);
       RD_MEM_32 (Base_Address+TENABLEDIV);

       WAIT_DELAY (3);

    打印("[7]\n");
       RD_MEM_32 (Base_Address+TENABLEDIV);
       Val = 0x0;
       打印("val 0x%X\n"val);
       WR_MEM_32 ((Base_Address+TENABLEDIV)、val);
       RD_MEM_32 (Base_Address+TENABLEDIV);

       WAIT_DELAY (3);

    打印("[8]\n");
       RD_MEM_32 (Base-Address+Tenable);
       Val = 0x1;
       打印("val 0x%X\n"val);
       WR_MEM_32 ((Base_Address+Tenable  ),val);
       RD_MEM_32 (Base-Address+Tenable);

       WAIT_DELAY (3);

    打印("[9]\n");
       RD_MEM_32 (Base-Address+Tenable);
       Val = 0x0;
       打印("val 0x%X\n"val);
       WR_MEM_32 ((Base_Address+Tenable  ),val);
       RD_MEM_32 (Base-Address+Tenable);

       WAIT_DELAY (3);

       Read_clkctrl = RD_MEM_32 (Base_Address+CLKCTRL);

       //根据需要配置 TINITZ (bit0)和 CLKDCO 位

    打印("[10]\n");
       RD_MEM_32 (Base-Address+Tenable);
       Val=(read_clkctrl 和0x87fe3ff)| CLKCTRL_VAL;
       打印("val 0x%X\n"val);
       WR_MEM_32 (Base_Address+CLKCTRL、val);//TINITZ = 1
       RD_MEM_32 (Base-Address+Tenable);

       Read_clkctrl = RD_MEM_32 (Base_Address+CLKCTRL);

       //轮询频率、相位锁定的发生

    打印("[11]\n");

       while ((((RD_MEM_32 (Base_Address+STATUS))和0x00000600)!= 0x00000600);

       //等待时钟稳定下来
       WAIT_DELAY (10);
    打印("[12]\n");
       CLKOUT   = clk_out;

       

    int main (int argc、char ** argv)

       unsigned int addr、data;

       if (argc < 2){
         打印("GZ 5用法:%s [a|p|s|c|t|r|l]\n"、 argv[0]);
         /* A -全部
          * p -打印
          * s -设置
          * c -比较
          *
         退出(1);
       }

       if (((us_fd = open ("/dev/mem、O_RDWR | O_sync))=-1){
         打印("无法打开内存文件\n");//致命;
       }

       
       if (0=strcmp (argv[1]、"change_VIDEO1PLL"))   //写入寄存器值操作
       {
       //print ("change_VIDEO1PLL\n");
       VIDCmdEO1PLL (CLKIN、19、600、4);
       }

    ------------------------------------------------------

    并获得下一个结果:

    ------------------------------------------------------

    root@ti81xx:/opt/ipnc。#./linux_prcm_ipcam change_VIDEO1PLL
    [1]
                PHY 地址:0x481c51d4数据:0x08910811
                PHY 地址:0x481c51d4数据:0x08910811
    Val 0x8910810            PHY 地址:0x481c51d4数据:0x08910811

    在这里、我从 reg 中读取并打印它、

    然后打印要写入的值、

    向寄存器写入值

    并再次从寄存器读取

    我看到我无法对寄存器进行写入-寄存器值没有改变 ufter 写入操作


    [2]
                PHY 地址:0x481c51f4数据:0xe0000161
    [3]
                PHY 地址:0x481c51d4数据:0x08910811
                PHY 地址:0x481c51d4数据:0x08910811
    Val 0x8910810            PHY 地址:0x481c51d4数据:0x08910811
    [4]
                PHY 地址:0x481c51e0数据:0x00050013
    Val 0x40013            PHY 地址:0x481c51e0数据:0x00050013
    [5]
                PHY 地址:0x481c51e0数据:0x00050013
    Val 0x258            PHY 地址:0x481c51e0数据:0x00050013
    [6]
                PHY 地址:0x481c51dc 数据:0x00000000
    Val 0x1            PHY 地址:0x481c51dc 数据:0x00000000
    [7]
                PHY 地址:0x481c51dc 数据:0x00000000
    Val 0x0            PHY 地址:0x481c51dc 数据:0x00000000
    [8]
                PHY 地址:0x481c51d8数据:0x00000000
    Val 0x1            PHY 地址:0x481c51d8数据:0x00000000
    [9]
                PHY 地址:0x481c51d8数据:0x00000000
    Val 0x0            PHY 地址:0x481c51d8数据:0x00000000
                PHY 地址:0x481c51d4数据:0x08910811
    [10]
                PHY 地址:0x481c51d8数据:0x00000000
    Val 0x8110811            PHY 地址:0x481c51d8数据:0x00000000
                PHY 地址:0x481c51d4数据:0x08910811
    [11]
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161
                PHY 地址:0x481c51f4数据:0xe0000161

    ----------------------------------------------------

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    WR_MEM_32可与 PM_ISP_PWRSTCTRL 寄存器及其他一些寄存器成功配合使用。

    为什么 WR_MEM_32不适用于 PLLSS 存储器映射寄存器?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    格拉88、

    我可以向您提供以下建议:

    1.尝试使用基于 devmem2源代码的 devmem2工具或应用程序

    2.检查 PLLSS_MMR_LOCK 寄存器中的值是否正确。 有关更多信息、请参阅 DM8127 TRM 表2-42。 PLLSS 寄存器、第2.10.1.4节 PLLSS_MMR_LOCK 寄存器和以下 e2e 文章:

    3.尝试从 u-boot 或内核空间访问这些寄存器。 某些器件寄存器需要 Cortex-A8 ARM 处于 Supervisor 特权模式、这对 u-boot/内核有效、但不在用户空间中

    此致、
    帕维尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Pavel、感谢您的支持。

    是的、我发现我可以从 u-boot 使用此寄存器、并且无法从用户空间执行此操作。

    如何从内核空间访问器件寄存器?

    我是否需要编写任何内核模块或驱动程序才能实现这一点?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    可以、您可以从内核源或通过外部可加载内核模块修改这些寄存器。 查看以下指针以了解更多信息:

    对于内核空间中的读/写寄存器、应将物理地址转换为虚拟地址。 查看以下 e2e 主题以了解详情:

    e2e.ti.com/.../1202037

    此致、
    帕维尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    从用户模式进入监控器模式的方法是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我唯一能想到的方法是加载外部内核模块。 这是 Linux 通用问题、不是 TI 特有的问题、我建议您访问 Linux 通用论坛。

    此致、
    帕维尔