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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
  G- ?  k" p$ p5 Z- w2 r5 @% T4 y; R+ x8 a8 V4 a* u
问题描述:3 U6 W+ P6 y  b+ d3 \
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:& k7 g) G. N, ]2 |7 n5 M
) l; F( L" c! R( A
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。2 p$ Q. b& J: j7 ~# [
- m4 T- n; ~( [3 U- X
测试结果如下:( z8 Y, P0 J) G7 y# ?5 [3 K
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
4 X6 p8 i6 x: Z% b3 D
: g( }  i! b0 N( u- z& a
8 E5 W+ ^3 i- M" f备注:
5 D: J. s! I4 A; u# j! E1 x* x1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?+ N  Z. H. W5 G% i
2、相关代码如下:9 Q6 k+ E' x7 G3 r8 J9 N3 p
//UPP DMA缓冲大小512字节& m4 `" b6 C9 L* T; d7 x
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
- p; F& H+ Q( F- q- L#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 A1 E7 A& p1 S  W" A7 Y8 i: K#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)/ [+ \% V& T8 {7 ~) F

, ?1 s9 i* S6 j+ j* b
9 v% ]: _6 k% g) u# w//upp接收、发送buffer. S# S$ d* s) ^2 E
#pragma DATA_ALIGN(upp_buffer_a, 8)6 G. J; @" M5 N7 `; n6 E
#pragma DATA_ALIGN(upp_buffer_b, 8)* p4 b9 p, p' {2 Y; T" X2 c3 X" b0 b
6 O, |# m3 q( I( ?
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
9 o/ y5 i# M  P# G3 j. F- gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
1 F, H; m. e) S% N
/ f! U& x) n7 g" e; G( G( {: ?5 O* A7 [
static bool server_upp_data_recv(Server *server) + s+ }$ |" W9 w7 T9 N  t) D) X+ W
{
) j3 @2 j/ ]8 a# y( U1 q5 [/ t    if(server->upp_channel_a_recv == false) {
$ r" U! w) Y  x0 V        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
7 @8 B) y0 i, |* z' z  f/ [/ {& k        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
. E+ w" l: N5 F/ q, W6 M/ @            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");2 B* g- B! i" g% \$ F) W# P. p! L8 Z

, S9 f( m. W  F: r% p! H; M& i3 q! e# r+ j# Z4 ^! `( i
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
1 T7 K6 `1 ~3 L: a% w9 i* _( M; }2 }7 N" T# l
            server->upp_channel_a_recv = true;//6 |3 C5 i& e  ]+ l1 l
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
: M* `: \4 {  C. l  Q, s7 t            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
( W/ a+ f3 ~6 T  A# o. r            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
& B% b) s( F# B8 m" n            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
8 r7 W2 X% n( l  g3 n) C
1 X+ ^4 f! {4 I( ]            upp_error_count = 0;+ [" g" j: A8 u2 |
            upp_dmai_int_cut = 0;
+ g2 ?6 B- d. {) \
8 g; m8 \  ~* l; A            // fill in data
, g0 r- ]/ P$ ]0 p* g1 `            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);% F0 L7 t1 F  K7 K% |
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");! D) G1 g! G( @
        }
' ?$ C9 M& v! g  o6 {7 D, L6 D    }2 @/ r- C6 n% N. m  E
    else{, W! q! y: v) }# q/ @
        if (upp_dmai_int_cut > 0){
1 I; V6 o  K$ ?4 @3 A* x            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
3 h3 Y# _, J- W            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
0 h# y# x  B8 ^8 r  t, u# p% R
8 T4 e  N+ x' _
: v9 v, s* R5 h% s" e6 A            //copy data to upp_recv_list_busy% m4 [- K" h8 k+ P' l- w- [, F, M% C  Q
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
) I  c7 z  [+ k
$ I7 M' B! L% N0 n; |0 P: ^            //
9 {% u+ U' l, ~0 y6 `            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);  ~5 \" Q1 e) m1 `1 P' e/ ^
' l+ E. b; B0 ?
            //
/ v% N& F+ w+ W- ?( ?& L            server->upp_channel_a_recv = false;//
7 g5 q) x& z  K5 U$ r) Q2 C
1 d% o% t0 a  }1 S+ e2 y5 j            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
4 ^& W3 Y/ h0 }8 t) E! }        }
' _# A3 D8 }3 `    }* S' ~# |" p- u) Z8 `

: l% n0 Q, o: E
* T- k$ L1 E2 i/ E    return true;
5 N% f6 ]& P! I$ ~}
3 a% n+ I1 }9 C6 N- b0 |
8 [9 @2 o% D3 a0 _2 s) I( bstatic bool server_upp_data_send(Server *server). p" I* ]9 N! b5 F! p
{) U" T" K) @- y9 {9 i
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){7 g) i" |+ ?7 M( c/ y! M
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
/ X( s. a" C( P! `* e3 K        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);6 E5 P; A3 ?+ e7 M& d5 `8 @
        char tmp[128] ={0};
1 c6 }/ P. Y) q1 n& k, t
* i7 N- J' n, U, z        server_msg_send(server, APP_CMD_LOG, "upp send: start");
7 {8 o2 y" f1 e! t9 P) R! A        print_log(server, data, 64);% D, k" b3 v4 B& m$ @9 C: v
3 h; H7 d  C4 z. |4 F
        //
' ~+ z) a9 m% J" I2 `8 d, R0 O        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
0 v2 m3 G$ r+ ]        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);0 ]2 w- g: K  t. J/ N
        print_log(server, upp_buffer_b, 64);. }5 m2 \$ L" N# Z# D$ h6 Y: L0 r, f7 y
/ Q3 E$ B7 G4 q' m0 H" N% S% `3 y
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);. t3 E8 N/ c. o8 O
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; - O: R  e+ n: U& d
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
1 N) A* h) f% Z& [! E7 A; i        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, t/ F: I& ^2 ^" z) z3 {
  m8 d5 S1 X3 P9 z: h1 [
        memset(tmp, 0, sizeof(tmp));4 C8 v+ {0 s( m, }7 z8 _& L+ {
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", " c6 N* q$ Z' z! S. D1 u6 F1 P0 P8 ?
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( g1 a7 `: A3 F2 O
        server_msg_send(server, APP_CMD_LOG, tmp);
( w& o7 `5 H, L& I1 p
3 ~0 P* w5 R* @3 x1 }, [        upp_error_count = 0;
% c5 M! w& U$ m# m/ l        upp_dmaq_int_cut = 0;
# U1 l  i( O" W8 [( Y        // fill in data / d7 A) y2 _2 B2 a
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ M# Z# b$ I- B! b5 v        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
, V* b3 S4 S& J7 e0 }3 C5 H4 F) z! H, A) [6 b) {' j* v/ t3 {
        // wait send success5 A7 X* y( b1 i- Y$ N: e9 e2 g
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
3 S) p  h, ~0 m
  L6 e  c- P7 N/ r9 p* |6 n        // make data node in free list 3 N( s7 l% B" ~$ N5 ]4 ~* M
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# B$ `" @8 M9 P6 `
        server_msg_send(server, APP_CMD_LOG, "upp send: success");7 f) ?7 E$ b( ~$ g
    }) e8 p: B3 \9 I' r6 a
    return true;% F. B/ q( U. `. s; q' q  r1 S. G6 ?" t
}! i& o. H+ k* d3 l' {" G
  Z' x7 C  Q; [% \
3 f  x% |$ G! L4 h

* g; @- A  {, R+ M! J1 X

& }+ |  l: J* w: Y5 I# S( z* h, i1 Z. ]! ^

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
( i% Y% a7 ~: r) Z* k8 |. B& ?/ ~, ?

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-13 08:57 , Processed in 0.042409 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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