138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6529|回复: 1
打印 上一主题 下一主题

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 r5 R4 M# m  w' g2 g* ?

- \% ]# z6 J' x问题描述:
/ K3 d( R9 b/ ^9 ^在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:: ]+ ?9 E4 N) e* b

5 r/ P5 M2 v" z图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
7 m0 ?* W  D6 G( a0 m
% c9 y. S1 k$ ]; G5 A8 R* m测试结果如下:
$ O6 G4 a# `2 T. O138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 b- Z$ ^, n7 l. O" n* ?- Z

/ T3 o8 O+ P/ \' Q3 L' s" H- K% Q: M+ S9 _
备注:8 _3 V# e+ N( M9 J5 _) v
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?. n: X$ }5 a  P
2、相关代码如下:$ x4 A" q" ]% {. j1 n1 v
//UPP DMA缓冲大小512字节
6 k" v5 V, [" @  T6 j& t* w#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍! O$ u2 Y% K( u
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT! r. u, U. N& D
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" I0 [* b) G2 J0 R1 l7 O

3 T5 g; v5 ^0 L% |6 P. D* n. s5 [$ ]+ ^) A* e% W8 S- E0 Q
//upp接收、发送buffer/ r/ A5 ]' J8 S, g5 Q$ @, H% W" o
#pragma DATA_ALIGN(upp_buffer_a, 8)
7 L* D, k; `( ^& {' h9 j1 k  @#pragma DATA_ALIGN(upp_buffer_b, 8): W6 G" r# o8 J5 w

; a! `6 q# E+ ~' yunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
2 |2 \0 |: i8 Z) |1 x* funsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];4 X% R# [. v/ Z& a1 L0 \

- I/ M9 U$ v9 z% I% |8 g. a$ S  c" t' i3 \$ z. Z- S
static bool server_upp_data_recv(Server *server) ' A5 ?, @, S; W& |) W) a8 \2 l/ X
{
/ j! ]  L5 z: x# V  u! \    if(server->upp_channel_a_recv == false) {
8 M+ x7 V  L9 g4 v3 N        server_msg_send(server, APP_CMD_LOG, "upp recv: start");( H5 S2 b& z$ y! I9 ?9 a3 P, z
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
3 C& S8 V2 n) q8 d3 X6 \2 h) a1 A            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");8 w- {7 X) v3 O  M/ y9 M& x
7 t* C, i4 }* Z8 z
) U$ F7 J0 N) {
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
$ u7 E1 L3 D6 R6 ?  {; b: K' X6 q9 y4 a
            server->upp_channel_a_recv = true;//$ i4 A1 i" h8 i; H7 {# `
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);1 T" T5 L  u- y9 z) L& k
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
" I) V. b! O/ ~$ D$ k: @            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;( c" ~; v/ F# N  v  C; o7 }- U5 }5 C
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//: F$ E# v1 y( |1 B
( s( J3 p; w+ }1 R8 F
            upp_error_count = 0;
) b% s( N$ J( t+ p. J; U( M            upp_dmai_int_cut = 0;
$ ?! G' J& {% D  @9 B& R; k1 D0 G1 P. ?- f+ ~, J0 Y- Z
            // fill in data
6 ?9 i0 n8 ^) ~$ k            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
, y) ]+ n8 @  q7 F            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");( r. l# x& r2 B3 w; \$ {
        }
1 u  Y  q6 m) S- D) H/ l    }  i. Z& F/ A5 O
    else{8 @8 y8 |/ Q$ f8 _' T+ N) g' G
        if (upp_dmai_int_cut > 0){
" h# e: i4 P4 C$ ~" F# N$ E            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);% ?5 o$ G- w! i8 f  ]
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
6 x0 J& f8 V2 X' H7 A
  G) i6 \, Y$ _- q  n6 f0 z+ ^8 [3 s3 m; ], I2 o7 V/ Q/ Y7 \* n
            //copy data to upp_recv_list_busy5 ~- Y" u5 |* M/ k3 u9 G
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
2 R7 X! n3 I; V7 U! k* b
1 }5 Z) \+ H; j, ]% \. I            //$ z9 @8 C7 {( n$ Z5 V8 {0 u
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
' w: |9 }1 Q0 [" S
- l) A1 }% F0 ^' R            //; Q# B; C# V. j6 o5 b* ?
            server->upp_channel_a_recv = false;//" |9 w* u- I- c3 R7 B, x
# R3 Q, v; o7 ]
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 ?& g1 [- Y9 W% d. A. p' U        }
  p9 v$ Y: D. y1 B' ]: P    }9 ]: u2 ^5 P# f6 |
# ]% R) U9 p5 E3 I2 X; j+ u  U1 z* F
$ y- D$ _  h9 y
    return true;) B/ }- s& d1 E* ^8 M: O
}  z8 s4 F: k% B0 |
6 ]+ B5 B" Q. f# O, r
static bool server_upp_data_send(Server *server)
1 c& ^+ T% J, p3 {{/ _# |/ c, W9 d: H) H2 u
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
+ c$ Q! T- e% x& f8 L$ `        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);$ k- X  j; H5 \) s/ I
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ T  Y$ d# C, c. `9 O8 s        char tmp[128] ={0};
+ r, |* J; Q" Y+ L/ Q/ S* H- I$ E
& q! u/ T5 x1 O, p9 }' P        server_msg_send(server, APP_CMD_LOG, "upp send: start");/ ?7 q% F7 v  E: K
        print_log(server, data, 64);
" l& e* d8 e5 ]- C+ |# Z- B3 \8 B# x* s+ V- N# m
        //
8 P6 Q/ q* K( |8 E4 Z  C        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
6 @9 q8 m8 u% d  v5 v, s: R0 r8 d        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
4 k; ~; B$ Z/ e: T" n        print_log(server, upp_buffer_b, 64);
% y: }; ~# Q9 ?/ h' u$ C" D% F+ L. @% z. {' f
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
: e9 c  H3 x1 v- P5 Z* d, l        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 3 D0 w1 t3 H+ }) \5 k  j
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
6 z0 b+ T/ k  r4 X; o2 |9 T        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
& {5 Z  r/ W, Q- v% H5 v& L- r$ S& V& P6 z* J7 C/ f; Z0 ^
        memset(tmp, 0, sizeof(tmp));
  O, [; ]4 a# L% [8 ?        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", % k! U" }2 s! ~7 |" T& A4 m
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
) |6 v4 r- N+ Y% H% H        server_msg_send(server, APP_CMD_LOG, tmp);6 g* k. T" R2 f: K

' l1 Y+ k5 E; M% y6 o6 }        upp_error_count = 0;
9 d0 z0 R- S. v3 e        upp_dmaq_int_cut = 0;& |# V& _: U; B2 g6 X/ A  n
        // fill in data
! U' B2 H0 @: |$ t7 R        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); , G" v/ w0 b1 e  e5 V
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");. g& ^; t1 e8 [3 U

, h' x9 I- C* b. D- |: P1 g+ D+ }        // wait send success8 V  Z9 _: P3 q) ^
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); # T3 J$ R7 T" h3 g
- P# b$ ^* N) @% o* V% k- p
        // make data node in free list
9 ?5 u" ]2 P; J- `+ R& J! F# _        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
( u. i9 P2 y5 C        server_msg_send(server, APP_CMD_LOG, "upp send: success");9 [  W% D8 j$ e& G2 a/ K" Z
    }0 u- c/ S: u+ {8 G
    return true;
$ I2 K# A+ Q+ O" Z}
% a' m. l" [4 X' }" A" `
* u8 E1 ^) U: _+ \0 @0 d

7 U1 ?1 W2 Y/ ?9 J5 O, x+ }* C) W. V0 C

3 q) y6 X( o- C& t" Y  W
* g) ~. u' t) `" S

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐9 w! k1 b4 ^3 ]" a  T$ R* [+ x9 F
& C3 ]# v5 A# I6 q3 u' _

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-2-2 16:50 , Processed in 0.047178 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表