我需要你的帮助
我有在访问在Beaglebone侧的PRU共享的寄存器一些问题。
所以,我在上PRU侧所需的内存地址写(我可以验证它使用此处提供的prudebug工具:https://markayoder.github.io/PRUCookbook/,我可以用它来检查的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
根据你的内核版本,我会建议使用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;
和在PRU RAM作为pruData [0]等访问数据