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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
, A5 o) J1 w0 A  r% I- D' ^3 _
, J+ l5 t/ X! P: h* W问题描述:
+ g7 T( f% [7 ~$ d) w0 Z: f在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:; ~5 F) K) r9 U  P: C4 W/ |9 R. n

$ x: C0 M3 j  }$ ~图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
0 J* Q; b. L& D9 U
2 _0 C4 [" S/ \- z$ H% M* j测试结果如下:' v- w* g( g6 [0 A: w7 Y
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?6 W& ~5 L. g: P0 Z& f% \
) x: A+ |: ^+ L) e# i: X
0 b) H% g  s5 C: ]; P! D9 K
备注:
, J! c" S$ k7 X' {9 K1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?3 F& p, ]* Z; H9 a/ b
2、相关代码如下:
( ~) l( Y5 v1 m//UPP DMA缓冲大小512字节
: f5 ?4 J4 w/ c: Q0 Q4 l#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ ], l! x" S' L1 F
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT4 w4 }# D( W9 K# P1 v/ S
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
5 @9 Y3 f, [6 j: `% W$ u8 S# R& r. J

# C8 N- [3 f# c1 Z//upp接收、发送buffer
0 }$ S" C9 E- M: O, E' u+ N#pragma DATA_ALIGN(upp_buffer_a, 8)
/ C+ X: J0 m$ ~; ~* e4 o1 L#pragma DATA_ALIGN(upp_buffer_b, 8)
2 z4 e0 ^% b3 a0 q- @! U! Z
* X' S$ j  R: p+ M7 aunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! q! C0 J- _! H0 m6 n7 j4 o' {2 |% Hunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
+ m1 J! N/ L1 E& d4 P. w
2 j0 f8 f* \( j% s3 }& ?7 d6 u' B' B  v; i  r- s' N" h
static bool server_upp_data_recv(Server *server)
+ {% c6 S: u/ D( G8 }8 ?{
6 ?2 ~( n7 q! d' M* F2 e2 ^9 `! u    if(server->upp_channel_a_recv == false) {% s: G6 |; B% g# h8 m, x6 K. H
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
1 A3 C3 l8 d' t: F! k) J: k, g- L8 s" {        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {+ i! n0 z0 W! T( {
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 l5 t, z; y# s* i0 d: z0 X. i  J
" X  q7 T1 `6 Y  ^
- e, t$ ^+ c2 f5 ~8 e* B/ M. G* Z
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% N8 f: w0 \) a: m: G, i
7 K9 `; h) ?/ ]9 E
            server->upp_channel_a_recv = true;//  ?" }) L: Z% e2 d1 A: u# e
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
& ], P( l- C- o  m; @$ o% e2 `            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;7 A- R8 _9 i9 E/ o% ]% T1 C
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
3 {3 j( x$ C9 j4 W" B/ c: G. s, {            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
: L8 p; d! F5 a
  m  _, e- H* U. L            upp_error_count = 0;
/ ^+ v& F6 C/ H& A            upp_dmai_int_cut = 0;
8 H8 S1 f  u# d2 ]. P; D/ l
/ W5 t* ?1 ?; q8 P3 ?            // fill in data 3 n4 T6 u6 W$ T1 C9 c5 }
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);+ p! g% C" V4 Y' c! Z/ k  ^
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
- Q- G: }- }) l3 \. _        }; Z$ N1 H) y; x) Q* ^4 U. x
    }$ N/ N; Z2 \% m3 v
    else{" ^! H: N& n) R4 H( N  G; C
        if (upp_dmai_int_cut > 0){) o, W) \3 n' X/ X  h( o1 h
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);" V3 k) N5 t8 Q% A  p. `3 x( k
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
1 @; B& e2 F  k- \# o& T
" y( A3 ]! l# @. v/ U5 t& k+ V
4 C" L+ Y6 j; t, N5 z7 m; W. u            //copy data to upp_recv_list_busy
5 g6 ?5 C' H* d            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
- M- Q. Y5 N& u- q: v4 Q) H3 L
+ b2 E& y, ?! v            //
/ q5 x0 F) U, y  ?" k8 \            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);- J& `0 a5 s4 I: e, s: J+ I9 E/ K2 W& d
" g( R; l! n) u* g; S( U# o
            //1 m# `6 ?: N3 k1 w: L3 z6 Y
            server->upp_channel_a_recv = false;//
5 E2 T; N& E0 J' f- ]! P" [9 D2 `& ~4 ]2 @* G, n
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");; ~/ n5 s) x. k. F0 E& m
        }) K1 u- \/ J7 B' x( P+ n
    }4 q6 g9 D. K' p

# o& [7 n# s" F* ^7 o: h0 J- ]9 @) [  `5 P8 ~
    return true;
/ _+ A7 O! j% ^9 I: @" B}
$ k$ V) \! t! W: F# c0 C
6 V2 }( `# I4 M! vstatic bool server_upp_data_send(Server *server)! P# [3 H0 n; z  S) j9 Q
{4 }+ g' ~( R8 J9 \% d
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
" a, y) ~' b5 k; R        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);+ O7 j$ ]; f4 s7 k& v- ^* v1 U
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);. y3 ?! y7 L& }4 l6 x" B+ j" A. H
        char tmp[128] ={0};4 K4 @; b  n% T9 X: D

; G/ i6 |) O- \/ W9 o, H0 D        server_msg_send(server, APP_CMD_LOG, "upp send: start");5 ?3 h: A$ c6 b, Z" b2 |: G& S
        print_log(server, data, 64);4 ?0 b4 U) |/ s, O( B; Y

4 C( y2 @: }8 d) Q        //' B9 H! V5 q  ^# V$ [
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);" S1 r2 O6 I  _, Z9 _" o0 c
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
$ a! G$ f0 N: W. J8 P" H        print_log(server, upp_buffer_b, 64);
- P$ G7 N) V4 t9 V4 i! g0 I& q
6 x1 ]0 ^3 ]0 Q- Q9 }4 l9 R( Z        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);% W: j" P9 I, c& T, t
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
7 @* C  G: ]  Z        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;) S7 z; o) W  l: S% y" U
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;& T3 y0 e# `5 ~" h7 U
, O# d6 Q; Z; E) S% p* Q
        memset(tmp, 0, sizeof(tmp));3 D" c* t8 U1 R! {; ~6 h; y- Y6 g
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - ?9 p# S4 L6 M  b& a
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! e: m- C: ^/ O2 P, Z4 O: U        server_msg_send(server, APP_CMD_LOG, tmp);+ D# @+ F% a+ y1 y) {! I& ~! {
5 M: [. M& _! W* Z  t" U
        upp_error_count = 0;
: G1 |% O% d5 _3 F4 ~  ?: u" H        upp_dmaq_int_cut = 0;
& k9 t$ L" \( k* @% R, H% D! c        // fill in data 8 ?* Z; S; l; T( [- d
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
* ?# f: ]% A* P  [        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
6 K( _. z: l$ m: ~# g  t
* T" b  c! w+ i        // wait send success! d" ?0 [6 I/ `& G- @: J7 e
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 2 P0 h% y. a$ @# ^; ~

1 w2 a! p( M/ X  N/ _        // make data node in free list
6 v6 ^2 s! ~4 N' q$ P4 T$ R5 ?: ~        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);  L8 f7 c6 {* |/ c. r7 q5 m# ^- [
        server_msg_send(server, APP_CMD_LOG, "upp send: success");. C4 i5 T( F) `
    }& l, l8 J1 F4 T. g! k9 D
    return true;
5 [0 i# l; S/ D( E9 M% ^# [}* T# n1 l$ v) q, \( u4 U
0 i$ H# J, u5 Q. z+ H" |: _
+ r0 b: k8 k; [

' J. V6 e. r9 ]0 z/ f

' z6 w5 ~7 |* X2 N9 v/ k- ?9 J) r8 a% R3 l0 o! t: v

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐* f) J; M) I" p, \
" l' L' R: k6 W" _% G/ B

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-21 03:48 , Processed in 0.048463 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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