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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
" u9 m0 [; c; U; X3 O, D2 E0 @7 L% `& S! ]1 O5 W% l
问题描述:
0 r3 I9 N1 S  i在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:* C0 A" ?# C8 w% }, l: o; I

) U# d* q8 b1 {图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
4 [3 L1 Z. G; W: ]2 [1 g: a3 ]- C" R: l  |0 ~" l6 V6 I: J' P6 O
测试结果如下:( e3 ]( w8 s! X/ U9 T! R
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?% Z+ f' I9 i. g0 E& d$ @9 m6 d
( C5 ?. Z7 ]# J% @$ T

8 }1 D" ?; Q7 h2 O- o+ [备注:* r+ V) C/ ^% G' I3 n% r$ W
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
/ B7 g9 f2 K8 E$ }
2、相关代码如下:
0 s  Y- Z. W# E( u8 Z% `//UPP DMA缓冲大小512字节
' `$ J( B; k' ]% G4 u#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍# x* ^$ l/ [: a, e4 m# G
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT0 I! O1 C+ _1 P9 o, F
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 p7 T( u- _. `3 d  r
1 F+ q; C: F" X
  b0 _# ^2 F( z6 `, g, v8 v1 U//upp接收、发送buffer4 o- B; x# }3 Y$ s8 F
#pragma DATA_ALIGN(upp_buffer_a, 8)0 N: P+ u0 E4 L, u  @9 S! @
#pragma DATA_ALIGN(upp_buffer_b, 8)
5 K& A2 ^- A" w/ b! e! W; a  x' S  X
+ o4 N- p" ]. N9 P* z: xunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];! l3 u, o: m6 y; b
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 B4 n2 B2 a5 f1 _8 p
$ [2 b7 W" \4 e9 U$ H/ C/ u0 M+ J6 u( m8 N- G
static bool server_upp_data_recv(Server *server) , k7 W0 h$ ^  w( t: j5 x
{
6 J7 w# b7 U! r- Y    if(server->upp_channel_a_recv == false) {
" `$ Y1 u4 y. Q: r; ~        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 {+ @  D1 i' `3 S        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {# o% M1 @) n1 _3 W; Z
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
  q' y6 s" T3 n7 |  Z; |2 f8 x0 |" Y7 h7 B" m

2 M- X" P9 i! n8 t! r$ |            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 B1 D0 R/ {" F7 X- @! ]; N; V$ A
' V) z' w# D) F: T6 M2 K
            server->upp_channel_a_recv = true;//* d# l) A0 K) K/ M5 x( A8 f9 Y
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
  k( `$ s; o) m- u            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
  J2 B. W5 ?; D1 P) c) a            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
6 y, Z) ^1 D0 F5 H/ F7 a            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//% l: u9 u' ^$ R; g4 V+ T0 D6 B

" y7 U0 x5 l: }            upp_error_count = 0;
% s% _' p2 f4 O: ^2 F            upp_dmai_int_cut = 0;0 G$ j+ Z- Z8 s

, U: p7 b$ s8 h1 D' w! h            // fill in data ) V; t5 ~) P$ c% Q5 Q
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
" w- n" {$ z* m% G' @8 q            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");0 t8 y& q7 F' Z+ E; _- _
        }
* P& _$ y, d7 I- j8 t    }0 L: ^7 g1 N8 _' z
    else{
- n8 J6 T  ?8 }1 T- e$ O4 S! F        if (upp_dmai_int_cut > 0){3 a; k+ V: Z/ m: h- {* o
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);6 j, V9 H* |( P' h2 J% T
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
, p* h) n1 X# W( Q7 H% S
5 d) y2 h* x: r/ k8 W
; _+ e* t) N4 ^: h4 g: A8 N( f            //copy data to upp_recv_list_busy
; c2 p, I$ H- o1 f            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 p$ ~# j2 B3 y7 |% z

/ y* G: N; X* R4 a            //  A5 p" ^* m: ~$ ~$ B8 k
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);( ~/ x' t2 i; S8 q

$ g* y" T% a5 m$ C            //2 n  V0 P, L7 ]1 N/ J1 f
            server->upp_channel_a_recv = false;//
$ g: g* i& z- f. j
( \* D0 |, F) C* L            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& R1 m' B6 R/ m5 f        }% D: p% A) P; B) Y
    }
% B) g4 \% e5 ^( o
* s1 N1 L- A% Y' i. v* @' {0 T
- R% r+ U4 G6 F! V7 D* ]9 d) A% ]    return true;1 z. G7 y$ l$ c6 n% q
}
6 A' w+ T% E* j( g1 R3 Z$ n* X9 ~8 ?- Y4 g% D. i2 P5 P- x  @9 ]& y
static bool server_upp_data_send(Server *server)( w+ [  ~9 O! w
{
% y% ?- i2 U+ x! r2 r    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
, M; j1 o- i* |0 @9 R) ?        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! I* s/ g$ X) c! \- p, J1 Q        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 \: F* w* h1 K, l5 j6 _9 _        char tmp[128] ={0};/ T! a/ n# p" }/ k% [) u& i

9 `% B" N* K; Y; {        server_msg_send(server, APP_CMD_LOG, "upp send: start");# D% M: L7 [) s- B( {& @
        print_log(server, data, 64);5 ?* U$ N/ y' e, O6 Y+ p

4 w) d: y! [0 d! K# c$ j        /// E# r( T/ _) |4 Y1 p) d# `) r& O5 k
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
" N( ^* t# |. _7 U        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);" p0 v1 a- |# V8 L
        print_log(server, upp_buffer_b, 64);  E2 J6 e2 |  k4 o
2 m9 G8 }5 F: \( |
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
& `$ L; d# U5 e% c        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 2 G* g9 O& r0 x$ t; s# i% j
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;" `/ U9 `0 Q/ O
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
! s" T8 Y/ _5 O& @, z
2 ]+ h) S; v9 X! X6 w/ Y        memset(tmp, 0, sizeof(tmp));
5 m+ s2 Z) H3 D        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", $ D- k7 p0 c0 K, ?" d# O3 M! L
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);# ^. R& ^) n# C2 [
        server_msg_send(server, APP_CMD_LOG, tmp);
" h' B- q7 A+ n6 h: R% H$ g1 j- Y
        upp_error_count = 0;
" X% C* O( u  n3 w+ _        upp_dmaq_int_cut = 0;" m9 f) V% a( l0 v
        // fill in data / [4 k- k5 W4 z
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); " I; U3 M* x: V4 B. J3 F. }
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");6 ?1 h  t6 }8 o3 V+ x
/ J$ T* W+ Z+ I  X) ?' {
        // wait send success/ y& ]7 [( g$ h7 h# ~' c! O0 \7 |
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
& y3 c& E: V3 N8 z4 X
" w$ N$ n6 `/ e+ J5 i& Q        // make data node in free list
$ W& e& S. l& i5 U. R0 @        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
" R) z8 `* U- ?" p        server_msg_send(server, APP_CMD_LOG, "upp send: success");
3 R& e: V5 J( C  ^3 h    }3 ?9 J- _; p/ N& M& W" a
    return true;  H2 D8 m. e$ Y; n$ @$ f
}
& U4 g4 ?: J$ k  r9 a4 N2 ~4 K" t* Q! |0 g2 _: s
4 a, l: e0 p) {% ]

& M( O" w( A+ t7 p4 V9 t1 s
2 J; R. ?% ^  o
9 P+ t# n7 `" e0 M( g- y3 R

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
! e" J2 s  c* b/ P: i5 f% S5 y  L  b2 {

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-22 19:34 , Processed in 0.043760 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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