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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 W( k/ r/ b4 Q
& y5 K. _* E" ^, H4 `
问题描述:4 b2 A7 h; @, |
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
6 p( M  S/ \& [- {3 G3 n
' r% F1 I  @: r" n: v图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
$ t3 t9 A; F, ~% e4 L0 ^
; H4 E8 `5 Q# b' `. D测试结果如下:/ t4 Q0 S/ |. k6 i- h6 Q" F* y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
+ L# ~9 C' h" `2 D! p) ]" v- U% o( F$ m, ]+ d, r0 L" {: d

1 ~% v1 X3 g/ x% T  X备注:- i- }/ D2 d( @* H' e) k5 F1 @# u
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?4 b5 a; N6 E# t; \  a3 f) i
2、相关代码如下:
9 H& ^2 D$ }, z7 C//UPP DMA缓冲大小512字节0 u' M5 N5 |# ~& d( Q% i3 |5 T8 y* g- r
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
% e$ H6 J, X9 C0 V& v#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 j1 G' B5 ?: F- u3 ?#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)5 l# E; B/ O( O/ z+ S

& V3 `4 g# W7 C( V) j: q8 t6 j% f( H6 j( y
//upp接收、发送buffer1 N) X+ L2 M& Z
#pragma DATA_ALIGN(upp_buffer_a, 8); ^1 |* ]5 o( ^( v
#pragma DATA_ALIGN(upp_buffer_b, 8)
9 R# U1 T+ d( g2 {
/ Q( ]0 p. z: T, L6 o, v% a# Y+ Iunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
" n4 K: A# E1 P. d1 \( S( s1 _unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];  B6 x( V: V6 U0 o. G
) R/ }1 t" \. l; Y: q' e4 v5 v
& }0 _2 b, Y: i
static bool server_upp_data_recv(Server *server)
0 `9 i5 p% v4 b0 q) w- [{
  c" p  B2 c  z8 w/ G/ G8 v    if(server->upp_channel_a_recv == false) {5 j( ]3 T) m: u9 p( Z$ V
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");: T% d+ X2 a& z; i
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {5 C5 O" l, y( e* r$ j- }% ]. W# W
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");/ Y' G3 `! ]  L- w
( B5 ~; G  p; j* @& i; S" I
$ h( V9 u8 p3 e
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 \2 ?, D0 a# L8 D- {
4 p) P8 `- Y# V  O  h2 Q- l
            server->upp_channel_a_recv = true;//
' i& V3 O* Y* w  t4 T3 U            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
' E! G1 \9 {  B6 Z            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
. E- O( r+ _; h! F  C! Z            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
+ G8 J# ?" `  O. K7 o# \            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//1 J8 Y  o* g) h7 n' l) w
/ r4 H* e* D* s! ~2 T9 N2 x( M% r
            upp_error_count = 0;) F5 k& p# R9 L1 k4 l9 v
            upp_dmai_int_cut = 0;
: y) @7 a/ l$ @; Y6 {, q( @; M( ~/ u  y7 ~* f8 G; i
            // fill in data
" x( h. @; z8 ]/ _            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
5 H0 H) w: }& E% q; z            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");5 a2 c. A% s# \
        }
. v; ?3 W+ m3 n! Q! T: w6 R' ?    }
, O4 k. e& w% K$ ^% U1 B    else{% [5 Q  c% C/ |) f
        if (upp_dmai_int_cut > 0){* ~  E# g/ E, a0 ]4 r/ [* B, Q
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);$ o/ P, m* ?- q9 q& L) n2 A4 p
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);' ]6 l* P6 r/ s. j0 W
6 _0 m: }' H+ r2 {, b* `
) L. e% ^) a# u; k/ T: m) ~
            //copy data to upp_recv_list_busy
8 q1 Y( W$ L2 w: r- j* l            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);! Z* G' ]) l9 F- r7 d
, p4 w" T+ d/ j; c* B& E* ^
            //
' L( u9 [% `' Z8 j9 Y8 [3 }5 r3 p            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
0 ?1 A' u# G$ Q& N9 ~$ N9 A' T+ Q
            //
  O5 m8 p; {% M0 M4 u! C            server->upp_channel_a_recv = false;//8 T" r, Y, x% Z. H9 f$ |+ ]4 f
; `  H' D$ s! y3 Q! X. W; H
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
. \8 d2 L1 f; l$ m$ f+ X* R9 {        }
9 `1 x' m, b  r! h    }
, _0 D/ |3 c! ?! f2 b  t
; B) F; e$ l; o
* H0 j: o/ T. S7 N" U    return true;
8 i; X; v& G2 A( O) f, @}8 P/ ?" K# j( |* f: \; {0 m# r

7 z# [3 I4 |% `: h) _0 _' r5 V6 Sstatic bool server_upp_data_send(Server *server)' g# l. G/ @! W
{
1 n9 m* u9 \7 \! x/ W    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, _6 P, N: J8 P9 o( C. q        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);  D. I$ b' ^8 A
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
3 a" L% i1 q' _$ @4 n. K+ O) d        char tmp[128] ={0};
/ k& Y3 _  b( V1 o% A7 V( ?* a- y* C. n$ q
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
+ k, Z4 @8 _0 p, y2 ]        print_log(server, data, 64);
7 y' @% w8 I* a% [% D" R/ _0 H5 I' Y5 \" x2 [
        //
0 T5 c( B" ?3 p! R2 e$ ^        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
1 f2 v1 Y6 q- u9 k        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
/ ?* z( I) k0 d5 P6 p' W7 r        print_log(server, upp_buffer_b, 64);
& b, P* R0 V) o& Y3 I/ P! u+ j# n, N& ~5 n3 C
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
5 p7 O3 |- o# u        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
3 k# V$ O" c. Q* p        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;! F' @1 `' M9 G7 y& e
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
7 M  `' f) I9 M' z% f
; u4 @) w  n$ t4 m# V1 G$ L, u        memset(tmp, 0, sizeof(tmp));
; U" g5 \. R- `        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
1 Z* ~. Y5 [9 \            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
7 M+ [$ W: ~+ S% a4 l        server_msg_send(server, APP_CMD_LOG, tmp);* y* t% j4 l2 S& Y4 j: H; x. }

3 C) Z" w. I: O0 P3 L* P        upp_error_count = 0;4 Q$ N0 n4 I. I
        upp_dmaq_int_cut = 0;. {% r3 L# X& y$ c
        // fill in data 5 r! C: w( U! J( ^' k/ \& ~
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
1 `" h: C3 I; ^. y        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
2 V2 ]# p: Q1 |
4 x( k/ ?4 Q! Y8 a        // wait send success
3 Q; S1 M' n2 }& b6 X+ A' }        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 T- \6 ]8 @9 \7 Y

' @4 r7 o2 z& I# e0 {: d3 D9 z$ U        // make data node in free list
/ W( S& @5 K2 {: J+ @) e- c        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);: n- H6 Y' V: n
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
; x  B& M% u) k    }
, C9 Z; y* K; l    return true;7 B; v* W, H5 `2 H* a7 }
}! `$ `9 ], H7 j8 K$ |7 F& ]8 u

8 V. C$ V4 h6 f2 n  ^: a

8 {4 R8 E7 x3 c: S7 V  u5 l; X. B! o; P5 h3 {+ @

/ ]/ Z) e. y( C# O+ @  |; @
3 w; m' D- {7 Q4 q

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐* U; J$ y/ x: \2 X6 a, C& c% S3 z
. `: b" k, ?- @$ _7 w- b

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 20:51 , Processed in 0.041622 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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