138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 2 |' T) f6 U* H4 @, w2 F

5 \3 `0 o& q8 G% X9 j问题描述:
3 H  E6 ^5 y( u在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:/ R6 Y( I; M- T/ J

8 E! ^5 E6 N4 f1 S! k/ p图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
6 g6 P8 X: \+ Y" D* ?4 `% L* R8 {$ i9 n1 X. m% _
测试结果如下:/ Q  k, r/ P' L6 p1 D
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 t& H# F; e/ |4 b3 J4 D

0 E/ z- a& F4 }! M. h; K+ _4 H0 X) m1 \
备注:8 W* ^+ o/ I/ n+ L2 ]
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
# h- I* P8 ^- Y$ C0 i+ r* A
2、相关代码如下:; X1 ~7 h% b. |9 |5 c: |
//UPP DMA缓冲大小512字节5 e8 B6 z+ s9 }4 D& P
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍* h# A7 p- b# x& k) g  k
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT: p$ Y& {. {# S, m8 c
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
& @, y4 ~* u3 F4 x. x0 s( _: _
7 P1 D, C! ?' O- u( c1 g
3 H3 N* P, K/ k/ M0 T  h8 q//upp接收、发送buffer" {* p* @6 H" I% z0 f$ A
#pragma DATA_ALIGN(upp_buffer_a, 8)" ^0 Q6 P2 s: D: I4 b/ g) n
#pragma DATA_ALIGN(upp_buffer_b, 8)( t* g3 Y5 W/ S! {4 L8 ?
& J) V1 V+ y5 ^3 y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 T: E! c& q+ V# junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];8 m3 b+ y. x8 m% S$ p) e) V  t5 |

$ W: E" j7 e7 {5 b- H1 h4 w+ ^$ y2 [
static bool server_upp_data_recv(Server *server) # L( x  H7 C( c- j2 V
{/ F$ `7 F' _' [
    if(server->upp_channel_a_recv == false) {
' e) j7 S' c$ N8 v9 n( h( a0 d        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
4 h) D' j" \' j4 ?        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {6 Z. X  @$ Y, Z& ^
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");" q6 \7 t0 h6 }* ^
7 J: z& r. t$ ^# g* @5 v
/ u( n% X$ C4 K
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
9 F& \( E. g$ o; V8 S5 \* o$ k% M7 {  R! g8 T( `. R- X9 l
            server->upp_channel_a_recv = true;//
% k% {7 o* D4 y            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);* [3 B7 q7 ]' Z% _) o$ l9 h4 _& d
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;6 C* I5 r( |0 Y) Y
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
  `. q5 k+ w* t9 q, y9 c            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//- J( `! ]& M7 q

* M. S7 }# e) \9 c; V! u0 ?            upp_error_count = 0;
0 B' W  _, p) i. H            upp_dmai_int_cut = 0;
% D" b4 Q4 I1 d7 e4 R/ U" Y
6 g. `& P8 D+ U8 Z            // fill in data
1 B& F) a) `4 [4 d9 X            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);3 s! o) [, o' ?6 H$ K1 \
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
7 t: ]' o  {) v% J9 P        }% v# }1 Q) L9 [
    }
" n* Q' W: R! e+ O/ B/ M5 _+ _    else{0 B9 d- A# {4 P9 _' y( I! M
        if (upp_dmai_int_cut > 0){
) |5 \% B. F/ M( P0 Y' C# E5 n            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
- L7 H7 c5 k5 h4 z- B) S* b            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);- f( F6 \  u4 H$ h+ N

" Q% I7 y; e. Y$ o$ Y0 S1 a, h! |0 ^. d
            //copy data to upp_recv_list_busy2 h9 M! C# q# O/ y% Z  A
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
% |0 O! \* q. \) v3 R( V9 \; W; ]1 K& `6 M* T5 B/ l
            //# Z1 U$ E+ t: \7 u; _6 ]
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
5 N5 `% n$ j. q* H+ F4 B/ c/ |! X8 `) |) y! p9 B
            //
# c$ `  z  i0 i8 B! {# c" x* e) B            server->upp_channel_a_recv = false;//
* |! k$ Z. S8 ?0 m# a
+ m2 o5 h; u" ]% h/ e            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
9 x' t# j2 h- O' d! t* c1 ^        }
+ `" t: A- B. a3 m" S: U    }* j( ?0 g1 T( x3 y: n) e2 T
  U6 N* Z/ j" j4 ], R

9 `* {; ?4 V' j: I2 L    return true;
  `) ~$ E" h. c}
$ P" Y$ k6 B) U; _: c6 [  g
) m) g8 U- X% d8 m' t- ^5 Z. qstatic bool server_upp_data_send(Server *server)) L9 J6 x  A) w, }! ]: v' q8 I
{  Y" M7 k  X% [4 |
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
0 x9 G% S( d& e$ w9 r+ r+ U        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# c' u) P+ A( g) w4 a# }4 B; }
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);/ P% I8 J/ u% V/ `; d& q
        char tmp[128] ={0};
5 x+ v4 g1 ?0 v1 ]6 C1 y- _- v- ]( X# a/ ?# R) v& a1 H% E: D
        server_msg_send(server, APP_CMD_LOG, "upp send: start");6 x: L( y  r, i2 d4 P( G/ v) O
        print_log(server, data, 64);
: r$ S+ U' Z- B8 ~/ }
9 h( z' s5 B/ K; k9 [, V' D        //
' J0 I0 q7 j. N7 \7 L) P        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);0 M5 _9 {  T+ H8 K% J/ B3 h
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 s* r% Z; N# g( B, D, g# `. e
        print_log(server, upp_buffer_b, 64);
3 ?5 q4 s1 h3 ^% ?1 f
, u- V2 W, h+ f8 }' `$ V        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);; n, O. U3 A& {
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ( b) M& k" B2 @$ @& S
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;& `( ]; ^0 {. E: k
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- j# j* c4 U4 Y1 J/ e& E) W
: @3 R" t" [+ V0 h
        memset(tmp, 0, sizeof(tmp));+ d+ @3 [3 c+ `6 H# V: R1 Z
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: {$ S9 r" T' Q4 M. H            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
/ J; v* y9 d3 Q' P5 E9 W        server_msg_send(server, APP_CMD_LOG, tmp);
' e3 g$ A* e- {( H: e3 X! U( z
3 \7 o( Q, b' d2 L7 G        upp_error_count = 0;# R% m3 r5 r& z
        upp_dmaq_int_cut = 0;3 b  a% N% r3 K. Z
        // fill in data " ]3 d# P+ y( d, u! h( M2 Y
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
5 p) g2 x' n7 G* F        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# \3 ]  S6 _% U1 ]6 q
/ S* U7 q2 s& h. _
        // wait send success& ^' |3 P% k2 X  _' i/ c0 I! O
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
2 J) A$ q2 a9 w" W0 b" G: ~3 q. n2 b  _% h6 V
        // make data node in free list
0 l/ \2 h( i- t- K% i" }. [        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# i* R6 a$ g, h
        server_msg_send(server, APP_CMD_LOG, "upp send: success");1 t8 _1 I( D6 |9 ?0 v! n; M
    }, G( e! m' n; |. x+ b
    return true;
$ |- f* n8 r9 i* V}
5 `: a7 c. U3 g+ o2 \
$ h0 M9 s; C$ j; t9 u# Z7 A- u

* x% u: O% h) B
/ Y% @+ V) P* C

6 E9 I/ O3 _3 Z  T/ p7 z9 L
) ^# L. n% }* Y9 ]3 l4 t5 R1 x

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
6 @, r3 d& v- X$ ~/ X3 a- p8 N4 ^, U5 w- C7 n

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-30 06:51 , Processed in 0.071238 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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