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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 7 y2 o0 b. `8 f  v: B' T- d

3 }/ A2 d0 ?0 ^% ~0 S6 W- c问题描述:
! X, A% G; h5 {$ T& }6 d- L在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
2 v0 `' M/ `- i: ^* G/ X' w& r
! c5 D* ?& k" o  R0 N' _: }图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% G' L  T6 t, X9 u& ]# L- ]! ?) v: M0 @, ~$ o* e
测试结果如下:& }- A& V5 d2 `3 Q6 m6 b. s
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 {* v4 t$ [1 k( M3 F  R/ q  m, f% G% X! }
" E0 k& r9 J* o( f
备注:! L/ ^1 P) @3 z7 M+ R
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
: S: a; H4 z! Z6 D
2、相关代码如下:
$ q8 v0 U  z0 d$ `' {//UPP DMA缓冲大小512字节$ n1 S# L4 k& h$ _
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
5 G- w  S  A, {, a#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
% L8 C: m* g& r3 j. I, C#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
% r1 W9 i+ U" N  G* ~1 J" D4 ?
4 i) n; M8 n/ \3 x& J
3 v; |; B" S2 U4 J//upp接收、发送buffer
3 k" L7 C. r% \6 k#pragma DATA_ALIGN(upp_buffer_a, 8). O3 b; F: l" g- \4 y6 V( o6 G
#pragma DATA_ALIGN(upp_buffer_b, 8)
+ f2 H: z/ `8 L$ D* b
+ E+ V8 h$ @9 g* ~) V( D) ~unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];) O0 B+ |  L) V
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];1 r: V1 }9 c8 R5 V0 y, g* Z

8 o7 J+ R$ o5 m' L0 L4 U7 W' |- N% Y; {" A9 {
static bool server_upp_data_recv(Server *server)   p( t/ V; J; Y' k/ v. [
{
* y" c# d: z  Y$ }    if(server->upp_channel_a_recv == false) {$ D" ~$ b: W9 v
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
6 I  N  z5 K0 u5 J/ D        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {1 y" U, z/ m, O' D
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) d$ l0 L; S/ d2 Q, o
! z; T: W. c2 h, K1 ]5 X! |; Y2 F
6 S8 e/ {$ H2 c            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
8 A, ~) i. j, Z/ T( {6 i2 d
/ a% s; M" ~. h. J+ {2 {/ M            server->upp_channel_a_recv = true;//7 `; n! X' a+ U. c8 l' q4 J) r. Z
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
. t( M* {" t0 J' l" p            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
! F8 b7 B7 R3 T8 x6 ^1 A2 _( c. b            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;. Q( l3 K5 z; }8 R( ~0 K! o
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//0 b' x/ p1 V! I4 P: m9 {. x9 ]
' U! P( A- g! c7 }. ?/ r
            upp_error_count = 0;) ^( O0 ~/ z. {
            upp_dmai_int_cut = 0;
8 V) q9 w/ d" t  |9 g
3 p% E5 M% Z! B$ C: R* ]            // fill in data $ s9 {, e/ E7 J
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
3 B% a0 [4 j$ C            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
8 B; U$ f! e) R, F3 X9 L; z* X        }
4 c1 R& w6 k; u* o+ F    }
' H4 ]6 X) P* U" _' l* e    else{2 }! s1 g; V. h7 H
        if (upp_dmai_int_cut > 0){" l9 j0 |1 _3 M/ s
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);/ \7 t$ Y8 t' F
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
4 d& [' b& P& ?/ f& c* R, Y4 k# T
" Q) F3 ]' j, l" W( N& h
            //copy data to upp_recv_list_busy
- z0 F) B, @, K5 r5 K            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);, q2 r' l+ J5 V" c( a6 u* H! E+ {1 Z

& h0 {8 i3 ~( _4 Y% `  F" s            //
9 t3 M7 p! ?/ Q7 X) |            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);: A: _4 R' Z) `  f" F. [

. @( T# a8 N( D$ J8 |' @; [! D            //- m$ Q! h$ J( W, z( ~5 z
            server->upp_channel_a_recv = false;//
$ [# r7 E% o$ W6 p3 q/ M( O- O% [' }$ W8 J9 x3 P8 x
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");) N" }) X5 f8 @
        }5 O7 v8 X' ^! A$ r; D5 t( ?
    }! J- t6 @3 e% U" W8 R0 N" K/ h
$ \9 E0 S: m) j$ ~( a7 g7 G
# F% L8 m  t" J9 z' D9 I! o) U/ N
    return true;8 ~8 i3 ]! Z% D+ s0 v
}
& p# `& E0 m) q" z2 J4 E  X
; v8 v9 m/ V: r, d; sstatic bool server_upp_data_send(Server *server)) F: t; ~" w7 {3 ~) `* A
{
2 @& Q, z  B* m2 a$ C' p    if(ListMP_empty(server->upp_send_list_busy) == FALSE){$ m* t. O( w- z) m& e0 j; M
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
7 ~3 v% h% v+ O        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
- C! t: S/ g& {  e* u( k+ w        char tmp[128] ={0};* X6 l/ F. ]. H  f; I. k0 Y, J

% }, q# y  Q! x        server_msg_send(server, APP_CMD_LOG, "upp send: start");' X6 i* ~& L1 X) d( a$ i8 o: K# b
        print_log(server, data, 64);5 u* u, r/ }& d  S# F' G( l
) D/ i& \) g7 F% ?! C6 n4 x
        //
) R" @3 h0 u# {: Y        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);( D5 K! f; i) A+ D8 R3 i4 G
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);' Y" _9 G7 t0 d' Q
        print_log(server, upp_buffer_b, 64);% z* `% y9 F$ K. ?+ W
% T0 a" |# {) s1 P
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
. i* ]5 f- c/ s5 b$ S6 R. G4 A        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; : T3 V! `) B: s- c% \" T6 l
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
# }7 r, _6 W# o9 \5 _1 r        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 C' q* S! p  L6 n: C7 T6 B* F* @7 {" ]$ P# Y1 O4 R' a
        memset(tmp, 0, sizeof(tmp));
: m% n5 z! m! d. v6 A        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 1 ^6 N; T' H, y- ?( R
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);$ R/ S: W3 z, ]6 a0 k1 l
        server_msg_send(server, APP_CMD_LOG, tmp);
1 Z: ^- `7 z+ q0 ^. x5 q
4 A% J2 ]0 ?+ L* f, t        upp_error_count = 0;
' g& k1 K& H1 X        upp_dmaq_int_cut = 0;- w# S+ S! U. [7 u. \- d5 K
        // fill in data
; f% Q; A. G  m3 u        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ) T; ~+ p8 m. ?5 j
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");' u, `' \+ ~" n- X0 m0 I

5 V" B6 \( r% X7 o0 J: x" s        // wait send success4 C+ t  g6 W8 F8 w) A6 D
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ( {% q; T* t) w+ L6 N+ z; a: K
3 G5 h8 X0 {8 G* H
        // make data node in free list 0 x/ m/ Y' Q0 y( x: v3 E
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# E) P/ h, i' ^1 m        server_msg_send(server, APP_CMD_LOG, "upp send: success");9 Y8 ^7 k2 F. H- [" X# z) l
    }- U+ Y/ l, Q' b
    return true;
; @* W& e* p& ~* _1 n- t}) V$ u) o, P! O7 ]( ?1 E% O) n& m
2 u' W- A, F# K! e

2 R! T3 g% |* a% H$ C. w( \# a- W5 R& O1 O( e

) U2 o2 K4 ?* P9 K5 F
8 N0 `7 s; k$ f

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐! F2 J/ U& C5 d" x- k+ T" ]
# H0 t2 S3 b/ A7 Q; I& I5 q5 u

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-9 00:12 , Processed in 0.047369 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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