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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 + ~' R( `0 a* _5 Q+ ?* v- g$ M

: c; v. F7 J8 d& \# n问题描述:; ?9 _& f* P1 l: D4 v0 K: u. h
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& H- v% M8 z2 M  \2 H8 j( w$ C0 J

- l9 o& w  f: f  ~7 N图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
+ A. _1 A) y  X/ X6 B, ^: _2 x3 M1 C
测试结果如下:( F; h# ^0 ]  ]/ n% r+ U
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?& ]/ {. m# q  E7 a1 Q% _
' D( \+ Q! C' \% c

/ T$ v# l6 r6 G8 s( d# Q备注:% |( j( c' a! Z' s6 `
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?2 y! Q" d* u5 z3 o5 X
2、相关代码如下:: D/ F  k9 k: Q
//UPP DMA缓冲大小512字节
) u: ?0 ?1 W7 p6 ?' h7 r#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍; r  C( J' [9 V* y) B
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
) l1 z' r# u0 e' X' x#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" U: z9 z% s' Z6 Y' U' k% M
1 C* Z- w# [1 C( \/ Y3 H( u0 j" y- x9 G2 K3 R& Z9 h) h
//upp接收、发送buffer
. B1 R7 k/ N9 {! c3 r4 G  x1 O#pragma DATA_ALIGN(upp_buffer_a, 8)5 E' E' n; m- L1 n
#pragma DATA_ALIGN(upp_buffer_b, 8)
$ B- L9 f3 [- b! ]: t: e: [* I4 {) c6 p0 o- {3 X; H* n- M
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
) C3 m+ W) s3 x, gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 O& C( f0 k+ t- G9 b/ D8 d
) C/ p3 Y2 I9 w8 W1 u- W- }
, x4 {& Q5 l0 L9 O* o8 {& \2 H' y! ^
static bool server_upp_data_recv(Server *server)
! w; g; n- @4 ]1 I. G{3 M" u" R! D1 q( e! X! {
    if(server->upp_channel_a_recv == false) {
1 U# N: ^4 [8 r) o. C! r        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
% d* s  ]' f  B        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
9 z2 U$ {$ g% t, H6 E: R3 c            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");1 q  m. U1 [1 z) j  D, k

, ^* ]5 z) a0 Y" i2 O/ I4 U& W% x2 p1 s/ Z& m/ e2 [5 v, i
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
& P/ i8 W" t* t0 A& M) `
8 z; h+ k4 u# F. G) t9 p2 v            server->upp_channel_a_recv = true;//5 K5 [0 P; C) O
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);: F9 M6 @* X7 y
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
% w' e9 m4 W7 Y0 J            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
; `1 ]4 c" |+ Q! Z            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 k& e* h# `) [! L

7 M! h& X6 d6 m) @) [. @            upp_error_count = 0;- J* P7 w- T) U  n: R/ d
            upp_dmai_int_cut = 0;) a1 g3 Q2 l, \  @$ x

; D4 Y% t6 F* S( f5 I            // fill in data
# [- Q  V% U/ n# |2 n            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
& {/ V) m" j& }# Q% o            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
% C; U, _9 c9 b! a: f: i1 M4 ]        }
* T3 I& j* g' F- U    }
3 H1 {; @; _% ]" n  c4 W    else{" |/ D3 F& `/ W7 Z% u
        if (upp_dmai_int_cut > 0){
1 k. U, m7 `8 w; x* F8 p            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
) U- }7 ?" F7 \+ w, k. f            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);& R+ B9 L) p' g- i. V" }- J
5 b3 ~2 s' h. U! Z

7 q/ `3 M) Z6 o# j* Y            //copy data to upp_recv_list_busy8 v! v8 \) A8 j9 F: b6 M  C7 z
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* U! w. r8 v% F
2 w/ {  S: |3 D3 w$ d8 P            //  J8 Z! S1 g5 Z
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);; `; M/ O4 |: \/ y. {
0 ]2 S" N) d2 s. s# z$ F) f7 ]
            //6 ^6 |$ ]4 q+ V$ z; B2 ?
            server->upp_channel_a_recv = false;//
* {) K9 q! v7 m& O6 R+ ]. {! x  _" q: ]
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
7 M2 r! `0 Y6 c        }
$ M5 S& R. Y9 ~; k5 ^; `: o% t    }
/ x9 V8 H- C0 S4 u! X( \% y" \! C2 h0 u: w0 d/ y
/ X9 z2 \, a- a7 w) c
    return true;
& E* J$ E1 p! c, V9 K) K}! V6 d5 ]# X, N: q3 i  W$ F

; F2 h' X6 ^! j4 Gstatic bool server_upp_data_send(Server *server)$ y; u  k( [% B# y
{" H4 |. L: }  t/ q
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
+ r+ [; g% X6 Y7 U) v        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);, f; t9 ]7 W4 B; @! a) P
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);& b& h. i0 |' J5 p" {3 @* b2 D* @! _. Z
        char tmp[128] ={0};' ]5 A: z& t5 u+ n7 K
& V* J+ J# ]0 P7 [* H8 L: V
        server_msg_send(server, APP_CMD_LOG, "upp send: start");9 I! X7 i; R9 n% i
        print_log(server, data, 64);
$ p) I. t' j/ Y* r, S; I& f! c( R3 R* y
        //
/ Z* j3 V0 Q7 H- |' h* [: ^/ [- l        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' w+ h* F* m/ Q) ~9 h+ U" D& @1 {        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ u7 l- S8 X8 j- K5 M  B4 ~        print_log(server, upp_buffer_b, 64);
; C3 n/ V/ T4 a7 J# y; @* |' f; Y( h1 k( m+ J5 C/ O% {# G3 _
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
  k  M6 H$ ?; T/ n/ C! @        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
& ]' E8 W  v# x/ H        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
3 I# u1 H5 G( |2 Q. k7 ^        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;' O) ?" G  e1 F. J

. T6 o0 s2 D* G; o- {3 z: L8 k' ]        memset(tmp, 0, sizeof(tmp));, ~$ s; p; y0 i, u& q% l2 r  D0 R
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", # B7 O9 V8 A# P% q
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
& h/ \4 q1 P" Q) u        server_msg_send(server, APP_CMD_LOG, tmp);
' k5 n# q1 C7 B9 w$ o# l7 n9 m2 t7 i/ P& S
        upp_error_count = 0;+ G0 N  a2 z5 b) ^7 s( k# E! L" b
        upp_dmaq_int_cut = 0;
( c, M- q. G- m        // fill in data 8 h2 ^4 s! S0 w' N2 J1 \
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
. i9 T' p5 r- \( k8 E4 j. l. R4 w        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
) q0 I3 p1 i: [9 e" L' u# L$ [1 F# }& X; [( R1 ?% \4 B
        // wait send success1 w; l: Z0 d1 A* T$ q6 V& q
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); - A: i1 J- w3 V- H: ~
" m% \% h# K7 @  v$ o$ P$ u
        // make data node in free list 4 U+ S' l" i  R0 C
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);! P$ L* \+ e; F7 A) y. ~
        server_msg_send(server, APP_CMD_LOG, "upp send: success");, m* N/ r2 q9 |( F3 K$ T  U
    }
& ^' l; B! P7 {& f6 }$ h9 D    return true;
- |+ T. G6 X9 ~4 y) J# g}
5 o) l0 g9 D! I, Q0 T0 I
+ u4 v, F6 D8 v+ V
1 g# \# m. I# I. Q1 J
# H# a2 x7 ?+ b5 a  i2 Z* t
+ ^! c) V$ Y% L3 V. W8 \+ s( s& t

  d) N4 k8 E. D

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
9 d8 O/ O' V, c+ o! z& ?  g* X8 O. y" ^" Z

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-20 19:39 , Processed in 0.042582 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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