请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:PROCESSOR-SDK-AM437X 工具/软件:Linux
您好论坛、
我一直在尝试将8位地址数据多路复用 GPMC 总线实现到我的 FPGA。 运行时会遇到一些问题。 我希望你们能有所帮助。
GPMC_DEFAULT:GPMC_DEFAULT{ pinctrl-single、Pins =< 0x3c (PIN_INPUT_PULLUP | MUX_MODE0)/*(A11) GPMC_AD15.GPMC_AD15 */ 0x38 (PIN_INPUT_PULLUP | MUX_MODE0)/*(B11) GPMC_ADEC_AD14 )/GPMC_ADM13 (GPMC_ADM13)/GPMC_INPUBL_13)/GPMC_AD13 (0xMC_ADMEC_13)/GPMC_ADMEC_13 (GPMC_AD13)/GPMC_IN_MODE14)/GPMC_PUBL_AD13 (GPMC_AD13)/GPMC_MODE14)/GPMC_AD13 ( 0x (PIN_INPUT_PULLUP | MUX_MODE0)/*(D11) GPMC_AD11.GPMC_AD11 */ 0x28 (PIN_INPULLUP | MUX_MODE0)/*(F11) GPMC_AD10.GPMC_AD10 * / 0x24 (PIN_INPULLUM_PULLUP | MUX_AD0*)/GPMC_ADM8* (GPMC_AD0*)/GPMC_ADM8*(0xMC_ADMC_ADMC_AD0*(GPMC_AD0*)/GPMC_ADMC_ADMC_ADMC_AD0*(GPMC_AD0_AD0* (PIN_INPUT_PULLUP | MUX_MODE0)/*(C8) GPMC_AD6.GPMC_AD6 */ 0x14 (PIN_INPULLUP | MUX_MODE0)/*(A7) GPMC_AD5.GPMC_AD5 * / 0x10 (PIN_INPULLUM_PULLUP | MUX_MODE0)/GPMC_AD4* (GPMC_ADMC_ADM0*)/GPMC_ADMC_AD4*(0xMC_ADMC_AD4*(0xMC_ADMC_ADMC_AD4*)/GPMC_ADMC_AD4*(0xMC_ADMC_ADMC_AD4* (PIN_INPUT_PULLUP | MUX_MODE0)/*(A5) GPMC_AD1.GPMC_AD1 */ 0x0 (PIN_INPUT_PULLUP | MUX_MODE0)/*(B5) GPMC_AD0.GPMC_AD0 * / 0x70 (PIN_INPULL_MODE0 )/GPMC_AM848*(GPMC_MODE0 )/GPMC_GPMC_AD0)/GPMC_AMC.0*(GPMC_GPMC_AD0 (PIN_OUTPUT | MUX_MODE0)/*(B12) GPMC_csn3.GPMC_csn3 */ 0x74 (PIN_OUTPUT | MUX_MODE2)/*(B3) GPMC_WPN.GPMC_csn5 * / 0x78 (PIN_OUTPUT | MUX_MODE2)/*(GPMC_EP_IN_IN_IN_IN_IN_EP0* )/GPMC_IN_IN_IN_IN_IN_IN_IN_IN_IN_IN_EN.90* (0xMC_IN_IN_IN_IN_IN_IN_EN_MODEN (PIN_OUTPUT | MUX_MODE0)/*(D10) GPMC_Wen.GPMC_Wen */ 0x9C (PIN_OUTPUT | MUX_MODE0)/*(C10) GPMC_be0n_cle。GPMC_be0n_cle */ >; } ;&GPMC{ status ="确定";启用 GPMC_NAND_DEFAULT_ENTRL 时*="GPMC_ENTRLESD/禁用 GPMC_ENTRLICENTRLESD/ ENTRL = GPMC_ENTRLESD/ ENTRL = 0; 范围=<3 0 0x02000000 0x00020000> SRAM@3、0{ reg =<3 0 0x00100000 >; 组宽度=<1>; GPMC、异步读取; GPMC、异步写入; GPMC、clk-activation-ns =<20>; GPMC、突发长度=<16>; GPMC、mux-add-data =<2>; GPMC、SYNC-clk-ps =<10000>; GPMC、cs-on-ns =<0>; GPMC、cs-rd-Off-ns =<141>; GPMC、cs-wr-off-ns =<141>; GPMC、Adv-on-ns =<0>; GPMC、Ad-rd -关闭-ns =<75>; GPMC、AdV-wr-off-ns =<75>; GPMC、WE-ON-ns =<85>; GPMC、WE-OFF-ns =<123>; GPMC、OE-ON-ns =<85>; GPMC、OE-OFF-ns =<141>; GPMC、PAGE-BURST-ACCESS ns =<10>; GPMC、ACCESS ns =<50>; GPMC、第周期-ns =<150>; GPMC、功率周期-ns =<150>; GPMC、wr 访问-ns =<0>; GPMC、wr-data-mux-bus-ns =<85>; GPMC、总线翻转-ns =<10>; GPMC、cycle2cycle-samecsen; GPMC、cycle2cycle-delay-ns =<10>; };
以上是我的器件树时序。
#include
#include
#include
#include
#include
#define GPMC_BASE 0x02000000
static int devmemfd =-1;
//映射长度为 len 且偏移量为"offset"
的存储器 static void* util_mapmemmemmemmemoryblock (off_t offset、size_t len)
{
devmemfd = open ("/dev/mem、O_RDWR | O_sync);
void *寄存器= mmap_write、PROt_read、PROmemt len、PROmemt read、PROmemd 偏移量);
if (寄存器=map_failed){
printf ("Map failed\n");
}
return 寄存器;
}
static void util_unmapmapyblock (void* block、size_t len)
{
munmap (void *) block、
void);if (devmemfd!=-1){ close (develt* block、size_membr>#gmund_unint32)
registers (static return inueln)= static 32 (static eMC_static retr2000n) n_static static ret_static r.e+ static r2000n = n.int_static static r.int_static r.e
静态空 GPMC_unmapregister()
{
util_unmapmemoryblock ((void*)寄存器,REGLEN);
}
void GPMC_setup (void)
{
GPMC_mapregister();
GPMC_unmapregister();
}
volatile uint8_t* extbus;
{GPMC_setup(void ){ uint8_datace+uint8_return)<int8_(uint8_datace)<int8_return)<uint8_(uint8_intbytes+(uint8_int8_datace)<int8_(uint8_return)<int_(u_int8_intbyte)
;}<int8_int8_int8_(uintbyte);void (uint8_int_dateum_int8_return)<int8_int8_int
void bus_shutdown (){
util_unmapmemoryblock ((void*) extbus、0x200);
}
int main (int argc、char const * argv[]){
int i、a、f;
int array[10];
bus_init ();
//for (i = 0;i < 10;i++){in
x
(byte = 0)、intx[如果 intx]、则为%/nbytesx (x]、intx](bytes= 1)、intx[)、intx](in = 1)、intbytesx (x](in)、intx[如果为1)、intx]、intbyte_intx]、intx]、intx](x[)
f = strtol (argv[3]、NULL、 0);
bus_writebyte (a、f);
}
if (strcmp ("read"、argv[1])=0){
a = strtol (argv[2]、NULL、0);
printf ("读取值:%x \n"、bus_readbyte (a));
}
if (strcmp ("argcmp"("i
= 0"、"i)= 1)
;(i)= 1);(i = 0)+(对于 inebyte (1)、I);(对于 inect = 1);(i = 1);(对于 inc = 1)= 1);(对于 inc = 1)、i = 1);(对于 e+(对于 e+);(对于 inc = 1)
i++){
array[i]=bus_readbyte (i);
printf ("地址%x 处的字节:%X\n"、i、array[i]);
}
bus_shutdown
();
return 0;
}
我现在面临的问题
- 我的写入操作正常、当我执行./main 0x00 0x03等操作时、我可以看到地址和数据工作正常。
- 但是、当我对寄存器执行读取操作时、读取操作始终返回 ASIC 的物理地址、而不是返回数据。
主写入0x02 0x04 ./主写入0x03 0x05 ./主读取0x02 读取值:0x02 ./主读取0x03 读取值:0x03
我希望读操作返回本例中写入的实际值(0x04和0x05)我可以通过逻辑分析仪看到数据到达 CPU、但遗憾的是、我的返回结果与我在逻辑分析仪上看到的值不符。
请提出任何建议。
此致
-Parker