在PRU和beagle骨骼之间访问共享内存

时间:2018-11-22 12:28:25

标签: linux kernel beagleboneblack

我需要您的帮助

在访问Beaglebone端的PRU共享寄存器时遇到一些问题。

因此,我正在PRU端写入所需的内存地址(我可以使用此处提供的prudebug工具来验证它:https://markayoder.github.io/PRUCookbook/,可以用来检查PRU寄存器的内容)。但是,当我尝试从机械臂侧访问它时会遇到麻烦:在Pru中,我已经在寄存器0x10000中写入了值0xED,但是在机械臂侧却无法读取它。

我认为我必须使用内核的mmap函数来访问物理内存地址,但是我可能在使用函数本身时做错了什么。任何人都可以阐明这里可能发生的事情吗?

PRU端:

#include <stdint.h>
#include <pru_cfg.h>
#include "resource_table_empty.h"

#define PRU_SHARED_MEM_ADDR 0x00010000

void main(void)
{
    // enable OCP
    CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
    volatile int* buffer = (volatile int *) PRU_SHARED_MEM_ADDR;
    buffer[0] = 0xED;
    /* Clear SYSCFG[STANDBY_INIT] to enable OCP master port->Shared memory */
    CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
}

手臂侧:

#include <sys/mman.h>

#define DDR_BASEADDR   0x10000
#define OFFSET_DDR     0x00

int main(int argc, char **argv)
{
   int mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
   if (mem_fd == -1){
        printf("Err");
        return 0;
   }
   volatile void *ddrMapp = NULL;
   volatile void *DDR_regaddr1 = NULL;

   ddrMapp = mmap(0, 0x0FFFFFFF, PROT_WRITE | PROT_READ, MAP_SHARED, mem_fd, DDR_BASEADDR);

   DDR_regaddr1 = ddrMapp + OFFSET_DDR;
   printf("PRU address: %X\n", &DDR_regaddr1); // returns 0xBEFFFB00
   return(0);
 }

ps:这是mmap函数的文档:http://man7.org/linux/man-pages/man2/mmap.2.html

1 个答案:

答案 0 :(得分:0)

根据您的内核版本,我建议使用 PRU Linux应用程序加载器

http://processors.wiki.ti.com/index.php/PRU_Linux_Application_Loader_API_Guide

以便您可以

    /* Get pointers to PRU local memory */
    void *pruDataMem;
    prussdrv_map_prumem(PRUSS0_PRU0_DATARAM, &pruDataMem);
    unsigned int *pruData = (unsigned int *) pruDataMem;

并以pruData [0]等访问PRU RAM中的数据。