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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
5 n3 Y. @8 k! x3 d' e7 W
4 i; x8 P' I9 o% I# x8 r2 r3 X问题描述:# v7 l) }, q  ]" x1 {; D8 P$ d
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:9 L( b, O. \6 x5 z2 H/ R

" T: I8 L- S# G& D, G2 o图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。8 L) H: k& V, r! b2 N3 W5 S

: X/ S- H9 c! k4 }' ~4 }测试结果如下:
4 C3 Y1 B% E" r- K; E138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 w/ y+ v/ c4 R' N6 ?
! y  m0 V9 I8 L0 T5 i

0 t# R) ?6 ?# }4 Z- k备注:' @; t* x8 D0 ?  [: y1 `! D. \
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?& _! g1 U' a8 _3 z
2、相关代码如下:
) a6 s- x" `: f6 o& W//UPP DMA缓冲大小512字节
0 d+ F& p- ?$ g#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 z5 ?' @$ u! F/ ?. a7 N7 L5 Y#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT5 ~. k% L8 z. x2 o4 W+ \3 Z! O
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)" U5 a; {, k. q% |

# m1 Q1 T7 q; k5 ~3 m
6 V0 L$ i) F( S& d4 ?8 Q9 A8 j//upp接收、发送buffer2 |$ r+ c; `% q6 h; Z" {
#pragma DATA_ALIGN(upp_buffer_a, 8)
! L" j: J# j8 b: M! Z3 u  z4 N* T8 w#pragma DATA_ALIGN(upp_buffer_b, 8)
- ]7 ~% S( O+ `
6 `$ s; c) w8 u0 H- O9 Bunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
  K. L5 P+ `& c; D3 c) Junsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];, ?) q$ K+ {4 ?7 b) o+ [3 }- j4 r* N/ [
' F. r* [- H% v" A- X
0 s4 ^( Y1 p5 N9 Q. e, B$ j
static bool server_upp_data_recv(Server *server)
; O9 {9 v" r& ~1 {{
8 z- }3 [2 ?% v( d+ }! t6 i    if(server->upp_channel_a_recv == false) {% ~9 l1 Q& U) s6 l  @' {
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
) D( j6 d9 ^9 I9 n+ ~2 I8 c  ]/ `        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {8 A& L/ h' q( u& ~& {( w" \
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
2 Y1 l$ a0 W: G' {" ?- C% V. r3 a0 L' _8 ~# J
$ p3 s% k+ _( U" _8 s
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
. f+ k& {- h0 v% G* {% B1 X- o) ?+ Q- ~! o
            server->upp_channel_a_recv = true;//4 |" G( I4 }9 L6 R8 [6 o
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);* X9 ~7 ]5 `. }4 _1 Q1 A
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;+ J3 n9 i! O! Y# P% p  J
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
! D6 s% ^1 Z4 N! q/ G$ `            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//2 |) I4 r# }! ~# z

: t0 e' K# g# I8 \6 {: ]; ?5 n            upp_error_count = 0;
/ h8 t! B, S$ |. i7 l            upp_dmai_int_cut = 0;! f# ]6 S1 y: r, C% C6 T8 a, \. @$ N

# g8 W; y" r- Q# d) ]# `9 ?            // fill in data 6 p% Z' n' K0 a4 f8 o& D) g9 z
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' q0 |7 w1 l* I$ J
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
5 ^( P7 C& K% `- a) j0 R) X  F        }
( v7 q9 ]+ [2 I/ V    }
8 m; I: R, D0 u% O6 E    else{
' |1 m, J6 g* X$ T6 x" @' H  b9 }        if (upp_dmai_int_cut > 0){
) f8 ~7 _& o5 x+ O& Y4 ^$ @+ x            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);* Q1 ^. R4 H( `' ^
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
) ~! }( b  Z& M/ S& W  h1 d" h5 j7 {# _+ R( `

% ~: j& R* T( h            //copy data to upp_recv_list_busy
8 n  {9 z( w1 H4 J            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& C3 P  ~9 i- R3 h. S' e; i) Y( h' u+ l4 ?' K: p' y7 E3 @
            //
; X" E& ?# X) W/ G  j            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
/ l( ~; }1 g8 ~& _4 m7 b+ \& Z$ z3 ?' h
            /// K/ t' h/ ~+ h$ Z+ J, e6 a
            server->upp_channel_a_recv = false;//7 y( k  d# V( Y8 P0 N5 x4 b& c# Z

: e9 r& ~. y. s            server_msg_send(server, APP_CMD_LOG, "upp recv: success");! X5 d; `: x5 b3 k8 [
        }
& p5 L/ {9 L+ L- S/ e7 r    }
! R4 z7 b' U* H' @  l" s% d4 ?, i3 v+ a2 y- y

7 ~4 ]. n: R2 S8 A* O/ H1 f    return true;! i% j& K& P/ u9 S$ A% B1 z
}+ u9 l4 o' C; k- U

/ x0 l! F3 l8 e- Y# `# kstatic bool server_upp_data_send(Server *server)( ]/ t+ Y' A% M( T" M
{5 I) e0 l+ F7 O1 u) d0 \
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){; |4 I* j: Y  N& y/ K7 X( h
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);& A3 m: x- m3 R2 g1 Q: K, m
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);5 O) z: v( W) G5 g
        char tmp[128] ={0};
+ O5 }% S# X6 |- g! J1 S
' y; c* A* _" |( }' C7 [. x        server_msg_send(server, APP_CMD_LOG, "upp send: start");
+ ^  y5 W6 }3 y% h1 V: z        print_log(server, data, 64);, U; W. m, o( t, @9 K- ]3 W- _+ v

* ]. g9 N: W) @' d  a$ m  r$ Q        //+ b9 i' \4 W4 C8 f% w, ^
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);  s! p+ Y& g+ F! _9 ]8 C& {
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 I4 O8 y$ G& Z& n" q& @
        print_log(server, upp_buffer_b, 64);7 Z, h8 h' E: y7 f& t5 }- N# H& B

8 l# u0 v$ o: a' k9 @( Z4 o        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);) w" ]0 M4 P! {0 g
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
0 D) X/ W2 c& |+ u0 H! F1 ^0 A        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;% N1 d5 a! w* [5 Y$ B
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;- E, \' ?) k$ y8 I( U2 r+ S
+ y$ t$ b  a+ i& Z: H
        memset(tmp, 0, sizeof(tmp));* E. p8 j% Y; p
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", , U+ B7 ^  O: w6 i/ q$ g
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
; R" ]/ e2 V. ?- d! D" p        server_msg_send(server, APP_CMD_LOG, tmp);
' l: J! K8 ?( Q( ]* z* o5 q: E
2 H+ w9 B) F8 X. V0 X/ O+ N+ [        upp_error_count = 0;
- w$ B7 Q5 w" Z" W9 o7 C        upp_dmaq_int_cut = 0;
% g! ]$ ^3 f; ^' o        // fill in data 5 o5 j$ f2 S* q2 g/ N
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
0 s- G2 f5 @$ K6 W5 ~: }. X) E        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");+ |7 l/ i" S9 h

% ^# ~6 `* _1 d! h( j7 N" B        // wait send success
, ^* k6 O: F- n1 l  _. s& }        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 8 L. a# P$ G# T: g0 d1 F) N+ d5 X
( W# u: Y1 `- T8 _) n8 Z3 |
        // make data node in free list
# z- `$ T) K8 @- K" e/ z) K        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);. w1 \; }. X( V9 x6 |1 q
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
) \6 V# f$ |! _( s6 x    }
' t/ w. R2 I% ?9 m; \& z1 a    return true;
: G$ W1 m  [9 g% b. e+ _6 _' ]}$ s$ ^& n# b1 y3 r2 m' L
( V# d: r1 _; r9 Z

9 `$ ]9 Y5 Q/ G5 T8 M7 C1 i% @
: S7 N, l5 v9 ]: d$ G
  _! `8 L( k+ A6 o

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
7 q0 j, j! Z7 c* ^* O# g( r) g9 W
& }- I5 Y+ Q$ P. W! j

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-23 01:44 , Processed in 0.091087 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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