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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 X- [: P; @  j& [$ i3 N/ R! C0 Z1 g& j! j2 V8 v! P
问题描述:3 g9 P" s0 I  v8 M
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 I, L/ x8 |& [

( s- L3 `2 p/ b7 N8 H7 \图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 q7 e# D/ M1 F/ `" F0 I7 J/ P; f5 v5 B3 M8 i7 X
测试结果如下:* _7 c1 ~2 R" Z$ J- a
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 s# I1 B- E$ w5 _$ E# k% b! t' P

; I0 {6 O6 C7 d  d. m  r8 L& ~  F. f4 T% I( ?
备注:
0 y4 ~& v/ z: d2 @1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 J% ]" S; ~3 g  E2 Z9 D; j2 ]5 D
2、相关代码如下:5 v& r( X4 ?( u, B: @7 g
//UPP DMA缓冲大小512字节
9 c' x$ C& I* m1 T* i" T. T8 Z#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
( f% u" E8 \& y% }0 ~& e#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT/ V5 y! R) E8 b6 _: k
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)3 F4 \. r1 l# C, {; D3 Y

# Z$ L" N  r) H1 ^
, \+ C/ ^- b- f: V//upp接收、发送buffer) T( }2 k# }  q, n
#pragma DATA_ALIGN(upp_buffer_a, 8)
( Z& Y% _8 s% z5 m% \9 p#pragma DATA_ALIGN(upp_buffer_b, 8)
  ^, X+ H' _* d* |& g
5 C& m; ]% F6 f8 r: C, ]1 Uunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
6 k, M0 l- A1 e1 Lunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
6 ^- Q! `: n: X  S. j- ]# I7 L/ x) [9 V, r+ E7 I" E
6 {, d9 S% t, Z' l' p
static bool server_upp_data_recv(Server *server)
* u& E& t& ^, B% R{+ v& P( f! q, F: U3 H% M
    if(server->upp_channel_a_recv == false) {
- J; ]* v2 V' z! I$ t# L; {        server_msg_send(server, APP_CMD_LOG, "upp recv: start");) N) ~( e' y. k8 l  t$ \. Q8 i
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) k) J6 H0 k+ }' R1 s! I1 A
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
+ E2 [) X) Z6 Z) R& H# S9 t" T4 J4 f0 \- B

- Z/ u8 V4 ~/ G            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);! U/ h, g5 K6 ~8 R6 _. w; R" T

' d4 a8 y  t) t2 D: o; ?            server->upp_channel_a_recv = true;/// G6 P* N1 p) d! v; {8 S2 n
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
/ L# m& O/ q- f+ K) e            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
! _( \3 V4 u6 t1 w, X( M" u            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
, v4 @8 `% Y# s! s0 g: x            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//, L' x9 m7 I/ V1 \- x

) O1 |# M3 b/ V            upp_error_count = 0;
; Z' t1 c2 R4 @7 e6 }+ g            upp_dmai_int_cut = 0;
# t  h3 J2 d  U$ O/ I2 k: l, E$ J' l$ i0 e
            // fill in data
  g/ |: S9 d  q  p1 Y* a            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);- r2 C0 S) l" Q" @  E. G
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");; F1 \2 t/ Q' U% K5 m  b
        }
4 g$ [+ Q! P& j    }
, c, n7 Y# {- z; f4 M, b8 `    else{# D$ @- p4 _2 ]/ ]) \  ?2 K# S7 z
        if (upp_dmai_int_cut > 0){' T" p5 ~& o3 W
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
" u) V: ^  z7 H- n0 J- w1 h            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
( N! R* @0 Y; e* R- j# O! c  t7 k

# t% g; l& f  B5 ?            //copy data to upp_recv_list_busy
: p" Q! Q0 L  v            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
8 w4 ?* a9 s7 g% q* [/ M: P+ Y& g5 k# H" |# _9 `, Z
            //
3 J1 W$ E. E8 S6 ?5 @7 g            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
# b- Z+ j8 z0 I, N
3 K: k( }: ^3 P) m+ j! b! B            //" m( Y& w2 s  n) L
            server->upp_channel_a_recv = false;//
" v( t! P! L0 b& K( `( y4 f6 w8 E- K* a* @! Z3 |. A0 R5 f4 l9 ?
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");! ~7 ~- }0 x* P2 l0 H
        }
) `/ L# M0 |8 c+ J" f7 ?7 _2 O" d    }* S( _& O, z! R9 K" q- ?/ E

4 w1 D4 Q# ?+ `5 H0 d0 k$ a5 r, \( Q) C+ @
    return true;
. d( k/ e/ ^% [0 `: z}: S, D2 T4 J1 ^, P+ R
$ V- i/ Q' U# c# A; X3 r5 c
static bool server_upp_data_send(Server *server)! {( b7 L( w/ q8 u
{
+ B3 V7 a! ?% R( l    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
- G& K. @% E; T5 `) t7 [! V+ S        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
& x7 h1 m$ E; b) c2 R5 C        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# K* B# b. }, [" f$ ]6 I
        char tmp[128] ={0};8 I2 \9 A6 v$ R: W

, s/ W( M9 i1 a* s6 x        server_msg_send(server, APP_CMD_LOG, "upp send: start");, k3 v5 O, o$ V# c  ^5 \1 x
        print_log(server, data, 64);, Q8 k7 p/ o; {+ M" |. V5 q% a

/ S/ W  q  p6 R# v! {# P$ y        //
5 Q5 M- F/ B0 ^% I- x) m- {  L        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);+ r0 R$ H* s" G# y
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
+ {$ ^: u; T/ n        print_log(server, upp_buffer_b, 64);
5 i3 L$ L0 i. U# e0 C/ {9 x) Z5 B0 L! p: R, M5 u; \. g
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);  J5 e9 \* G. V6 E: @
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; . |, e9 O( s9 c- R4 Y3 {4 B9 c& _
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;4 _, }( C* q6 f: {* C
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;7 @# W' o1 ?: p' l* b2 J& ]  ?

1 Z- J4 D7 [, c6 r        memset(tmp, 0, sizeof(tmp));: w* j4 ^* d. [; }: k$ K1 [+ L  M( A
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' R8 D0 R  ~( c) F( G
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 M0 ]8 t$ u3 w$ l; Z  @$ `        server_msg_send(server, APP_CMD_LOG, tmp);
! @( p" q, ^6 f
& ~. V6 h  V; N+ E- c        upp_error_count = 0;
. R" E! R4 |5 }: a) n. \, _* n        upp_dmaq_int_cut = 0;/ N9 D/ U3 c/ `, p
        // fill in data , |5 U! e  h2 z# ]. ]2 N
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); " v. _# h0 d# Q
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
* g1 N( f. P* F: C3 J6 j' J2 f
        // wait send success
  b* T# Y+ _8 l, \( n5 Z" _) i        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 3 W% M& j% G0 A, l: a$ m3 t/ S; [# |

% X2 w- t1 ~1 }) Y* Y  T        // make data node in free list 2 C# P8 e  w5 e" ^; G
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
5 w. \# E; Y/ P7 m' F( t6 j        server_msg_send(server, APP_CMD_LOG, "upp send: success");# ]% j/ @0 R' E9 Y
    }
, c5 K/ Y% ~& h0 ]    return true;, V" r; W4 |3 D7 x6 N/ N( c" L
}
  w2 E, [4 {5 Y  i( I* [! H2 T! b6 X/ i) |2 [/ ]
/ n6 I5 c# V4 O4 x+ a

0 o6 S" J5 x# ?
9 O, @2 C" L6 A- N; e

. d4 {% h0 e" z

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
$ \) Q9 {1 g- c$ Y( M
$ ]0 s2 R) ^4 X) r' U

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-12 19:54 , Processed in 0.050670 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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