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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 . k: \+ m' u2 C# e1 W% k- @+ q) E
) S+ @: |. w9 ?; ?- Q
问题描述:3 r( F! c3 d$ X; w5 Y  O
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
/ R# c9 q* _8 F( |2 J
0 b& ~( Y3 }6 O! I图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。, }& l" W( M7 |* o9 F- J
. T0 k% l$ P! N% _' A: Z% K0 Y% c
测试结果如下:  X5 O1 ]# H, [" M& z
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?3 ?7 ^" u- K8 o3 A: |
; U9 Q% \; W/ I, j; a3 W) j5 j1 E* Q

8 ~6 E" x* L# d6 ?备注:4 x% x! k, _# s3 p2 f$ Y* r
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
  x, v8 @6 _, B
2、相关代码如下:
+ Z' s- n6 e: j' a3 W$ A//UPP DMA缓冲大小512字节
0 V) K, `' i" N0 @# W#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍: s& y0 P8 S# P5 P
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT/ f- e5 h) s% J. x5 X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
7 P) y" O3 o; [+ U0 {' _2 N5 [8 z( V& {% p$ t' \1 l  s

& G  c0 S+ W, q//upp接收、发送buffer
9 p2 n# h; L, c( H8 C#pragma DATA_ALIGN(upp_buffer_a, 8)1 F. C$ i2 p( W; p$ A1 z
#pragma DATA_ALIGN(upp_buffer_b, 8)) z9 C1 c1 [/ S4 ?2 Q+ n* }
8 v9 t, ^7 R  ~, {7 v+ {
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
/ @. K( ?! {2 d- C/ f/ N4 @unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
) E7 Y+ S: E. I' j( Q7 ^% ]
& l7 O/ R, Y5 _. O+ ^$ A+ G& |5 g6 X
static bool server_upp_data_recv(Server *server)
3 F5 K% n5 N. ~( _* {) n. H" b{$ W' [2 e% ?; Y  H+ [3 H! m$ B
    if(server->upp_channel_a_recv == false) {' j5 Y. b( k* g$ D  C2 B- Z
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");& |) M  D  ]( Q3 e
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {' ?" Y5 k* E2 l7 M, a# _
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 N1 S# t7 p9 i+ v# X
- Y; B+ R# r2 G# ]2 o

* W# C0 n1 l" U2 M$ Y& U            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
" p7 g' r8 m" Y- B: q1 W
* l! ^0 S0 W* D% s            server->upp_channel_a_recv = true;//
0 M4 t1 o$ l1 z/ c+ |0 [            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);. ^8 A9 H; J4 W& j& {9 D. a$ R
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
0 A6 q. k5 p- i( ~+ v6 h            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
/ y8 S( p! Y0 X) t            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
7 J$ J, F2 J' @6 k5 l9 c( W( J
' V1 Q6 v) x: {' V/ s            upp_error_count = 0;7 S" N$ R4 G: o
            upp_dmai_int_cut = 0;
5 W& C' q7 ]# ^6 T4 n2 s3 ~
( ?8 c6 b; Q; a' B7 O            // fill in data
% }, E" F4 d( X! Y: y! g            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ x" D. ^& L9 o' @7 |
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
! {- t2 U8 N8 N8 E: l* e; n- U        }
1 e7 ?8 T8 s1 w. j, E/ K    }( c1 ]0 q/ ~4 t  T* e3 `
    else{9 a% B4 q! W: u, \, \
        if (upp_dmai_int_cut > 0){- |  d( j2 O1 \1 c+ _" Y& @
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
' Z7 a! \6 ~3 P4 K            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
5 L! p3 p- a, r; r" r
& ~$ j. j1 m. S) {! f/ F  C$ Z- k/ \$ l( _; u
            //copy data to upp_recv_list_busy: D: ?0 i& P8 y7 M" a
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);$ W% [7 ]/ N) f! x& g" e3 A
+ F( T% [+ v" R& P# y- F7 r
            //
. U, N( W) B$ e+ }, \            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
3 i; j3 P6 z7 V: X
& ^8 _- ]2 ~! M& q6 `            //# e1 r" h5 s! k" J: P2 D$ `8 N6 |
            server->upp_channel_a_recv = false;//
) l6 i1 Y6 w& X
/ G, @) O; _/ Z" r  ^0 Z5 ?) z" z. n# H            server_msg_send(server, APP_CMD_LOG, "upp recv: success");) S6 T" A% ?# Q3 K2 E5 ^
        }+ }3 v" a5 x3 F1 f/ c: t
    }
- h; y6 o' Y5 ~: Y' y& h# ~6 ]8 |/ `9 W

8 s4 b7 l4 G% j* T+ {2 t  x$ C    return true;; b9 S: N+ _3 z& s! p# l  {
}
8 u/ U+ J8 n( \
1 c: [3 o4 L! q9 g. {static bool server_upp_data_send(Server *server)
; C3 c9 l' z8 [1 G% Z( B2 ]7 r. I{
) d2 w$ ^$ R! D7 {( y3 c- d8 e- K    if(ListMP_empty(server->upp_send_list_busy) == FALSE){% E1 o  y8 r- A5 _
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);% m& U' M2 Z5 u& I. P  }
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
. l) U: V7 F$ p" Y        char tmp[128] ={0};
6 y: Y  `) V9 k  T8 }) e" T
1 g4 c* p8 T/ w8 I        server_msg_send(server, APP_CMD_LOG, "upp send: start");/ u0 W1 ?3 J6 {* ^( Z- G
        print_log(server, data, 64);
( R! b+ n* s7 W3 s* [: F/ b/ a9 {" N# b% b. @! G6 k
        //
( n, v- e# C$ q. n! T2 ]4 {8 Q        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
+ }5 H1 q; W# P! A( C        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);9 j2 C+ }7 C! {
        print_log(server, upp_buffer_b, 64);
- k5 p5 t, P0 v/ ^5 e( w# V* c$ c; ^/ h5 F* N
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
+ D- A( m& V4 \. ]- ^0 V        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
; W1 }- z" V1 P  `: n. C        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
# ~' B+ x1 {' t( [+ s. M        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, ~8 a/ v5 {& A

! N; W: R9 O5 E4 y; y9 S) v        memset(tmp, 0, sizeof(tmp));
- K2 J4 s( V6 T8 ^: d        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
) _. }6 b. r8 V# T            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);! H) i+ k4 [7 P* A/ k9 ~
        server_msg_send(server, APP_CMD_LOG, tmp);1 j8 @+ |8 j1 m4 U) K" N' N+ u

0 N+ ~1 |9 v! f5 X6 [5 j! X        upp_error_count = 0;* x9 j1 ~0 Q$ H
        upp_dmaq_int_cut = 0;: F: n2 n8 a, a/ H8 H" o
        // fill in data ; N+ q% x: y  T* R8 T2 |1 S( ~' l- s
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# a; Y( t$ b2 C2 B# _        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
+ ^. O4 q/ k. Y) {) q" \/ f+ y; y, }0 I' f- ^2 _
        // wait send success4 y4 U/ S# y. A/ ~2 H
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( D1 N4 M" K% M+ h6 W+ _  m- E
0 ]7 L: r; C5 C3 A$ e& g( _
        // make data node in free list $ i% f2 P' r- T! `' A
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);9 [! _8 f6 U( p9 L
        server_msg_send(server, APP_CMD_LOG, "upp send: success");' r8 _8 T1 q8 Q/ k) W; ^
    }
3 ^' d4 x3 d" S    return true;
5 P* K. v. X* m5 j}
% v9 l8 c7 C5 x! Y7 y" U) N" P9 a  y5 M% ?: t4 W

* C" A1 E% x# Q3 w2 B, J
; v  e- C' [/ W4 `6 q

: m" n7 A& l- w3 Z% E- ]" ?2 {- {1 m; N0 v2 {* L5 E

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
6 H7 _; Z; j' j* B- ~5 L! `) ]1 _8 o2 L; ~

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-2 03:50 , Processed in 0.043185 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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