标签归档:DSP

TI OMAP3530 数字媒体处理器

OMAP3530主要面向多媒体,此MCU片上集成了ARM9 Cortex-A8 600MHz内核、达芬奇C64X DSP 430MHz核、SX 2D/3D加速器,算是相当强悍的了,下面是一段来自TI官方的超声波扫面转换演示视频:

[flv]http://www.roboby.com/wp-content/uploads/2011/03/超声波扫描转换演示-OMAP3530-EVM-Basic-Small.flv[/flv]

TI还为此开发了DVSDK数字视频开发库,居然有500多兆,带源码,这对于那些基于此处理器开发DSP图像处理的人来说是相当宝贵的资源了!

从这里可以了解相关信息

http://www.ti.com

E文不好的还是从这里看中文的吧:

http://www.ti.com.cn

OMAP3530 DSP Howto ( Really works by DSPLINK)

————–我转载它,主要是为了自己学习

2009/11/03 17:33

搞了一段很長的時間終於把DSP功能弄起來了,該是回頭紀錄一下”眉角”了.

1.Before touch anything

目前有兩種方式可以控制DSP,一個是

TI DVSDK

提供的DSPLINK,另一個則是DSPBRIDGE.

以我從google搜尋之後的了解DSPBRIDGE目前是沒有繼續maintain.

DSPLINK是

TI

比較建議的方式.

所搭配的media library為

DSPLINK + gstreamer

DSPBRIDGE + openmax + gstreamer
http://felipec.wordpress.com/2009/10/13/new-project-gst-dsp-with-beagleboard-demo-image/
http://felipec.wordpress.com/2008/12/12/gst-openmax-demo-on-the-beagleboard/

這邊我選擇DSPLINK控制DSP

2.Software

dvsdk_3_00_02_44

gst-

ti

-plugin-full-1.00.02

gst-omapfb

Build and install to target root file system (過程就省略了)

可參考以下作法
http://ossie.wireless.vt.edu/trac/wiki/BeagleBoard_CodecEngine

安裝目錄
DVSDK

: /opt/

dvsdk

gstreamer : /opt

3.Setup

DSPLINK 透過share memory的方式跟DSP交換資料所以有另一個driver叫cmemk.ko負責建立memory pool. 但這塊memory必須脫離kernel的掌控因此必須要空出一塊memory讓cmemk.ko使用.至於大小要看實際memory size跟DSP所需要的size來決定.

http://pixhawk.ethz.ch/wiki/tutorials/omap/dsplink/memorymap

依照以上說明修改以下檔案

dsplink_1_61_03/packages/dsplink/config/all/CFG_OMAP3530_SHMEM.c

dsplink_1_61_03/packages/dsplink/dsp/inc/DspBios/5.XX/

OMAP3530

/dsplink-

omap3530

-base.tci

dsplink_1_61_03/packages/dsplink/config/all/CFG_OMAP3530_SHMEM.c

我的target board有256MB DDR,因此記憶體配置如下

# 0x40200000    60 KB   CMEM (internal memory, see comment below)

# 0x80000000    200 MB   Linux

# 0x8C900000    16 MB   CMEM (external memory)

# 0x8D900000     2 MB   DSPLINK (MEM)

# 0x8DB00000     unused

kernel boot command 加上 mem=200M

For kernel 2.6.27

optargs=init=/init omapfb.video_mode=1280x1024MR-16@60 vram=12M omapfb.vram=4M,4M,4M omapfb.debug=1 omap-dss.def_disp=lcd omap-dss.debug=1 mem=200M

For kernel 2.6.29

setenv optargs ‘init=/init omapdss.def_disp=dvi omapfb.mode=dvi:1280x1024MR-16@60 vram=12M omapfb.vram=0:4M,1:4M,2:4M mem=200M’

memory pool配置如下

insmod cmemk.ko phys_start=0x8C900000 phys_end=0x8D900000 pools=20×4096,10×131072,2×1048576,1×5250000,4×829440,2×691200

gstreamer需要設定target上的環境變數好讓系統找的到執行檔及plug-in

export PATH=$PATH:/opt/gstreamer/bin

export GST_PLUGIN_PATH=/opt/gstreamer/lib/gstreamer-0.10

export LD_LIBRARY_PATH=/opt/gstreamer/lib

3.Get DSP work

載入drivers

#cd /opt/

dvsdk

#./loadmodules.sh

CMEMK module: built on Oct 30 2009 at 20:23:52

  Reference Linux version 2.6.28

  File /home/gigijoe/

OMAP3530

/dvsdk_3_00_02_44/linuxutils_2_24_02/packages/

ti

/sdo/linuxutils/cmem/src/module/cmemk.c

ioremap_nocache(0x8c900000, 16777216)=0xcf000000

allocated heap buffer 0xcf000000 of size 0x32c000

cmem initialized 6 pools between 0x8c900000 and 0x8d900000

DSPLINK Module (1.61.03) created on Date: Oct 30 2009 Time: 20:20:31

# lsmod

lpm_omap3530 8276 0 – Live 0xbf02c000

dsplinkk 114052 1 lpm_omap3530, Live 0xbf00b000

cmemk 24428 0 – Live 0xbf000000

測試omapfb, 應該會在畫面上看到彩色條紋.

gst-launch videotestsrc num-buffers=1000 ! omapfbsink

播放

TI

h.264 raw data sample

gst-launch –gst-debug-level=1 filesrc location=”/media/dcim/100andro/ntsc.264″ ! typefind ! TIViddec2 ! omapfbsink

Play avi file

gst-launch –gst-debug-no-color –gst-debug=

TI

*:2 filesrc location=/media/dcim/100andro/aris.mpeg ! typefind ! qtdemux name=demux demux.audio_00 ! queue max-size-buffers=8000 max-size-time=0 max-size-bytes=0 ! typefind ! TIAuddec1 ! audioconvert ! osssink demux.video_00 ! typefind ! TIViddec2 ! omapfbsink

Play mpeg4 file

gst-launch –gst-debug-no-color –gst-debug=

TI

*:2 filesrc location=/media/dcim/100andro/KenBlock-TopGear.mp4 ! typefind ! qtdemux name=demux demux.audio_00 ! queue max-size-buffers=8000 max-size-time=0 max-size-bytes=0 ! typefind ! TIAuddec1 ! audioconvert ! osssink demux.video_00 ! typefind ! TIViddec2 ! omapfbsink

Play H.264 mpeg4 file without mp3 audio

gst-launch filesrc location=/media/dcim/100andro/sany0014.mp4  ! typefind ! qtdemux name=demux  demux.video_00 ! typefind ! TIViddec2 ! omapfbsink

4.Debug

http://tiexpressdsp.com/wiki/index.php?title=Debugging_DSPLink_using_SET_FAILURE_REASON_prints

http://tiexpressdsp.com/index.php/Enabling_trace_in_DSPLink

一開始有一段時間kernel-2.6.29 DSP_init總是失敗

# ./messagegpp ./message.out 1000

========== Sample Application : Failure [0x8000800b] in [0x401] at line 522

MESSAGE ==========

Entered MESSFailure [0x8000802d] in [0x401] at line 544

AGE_Create ()

Failure [0x8000802d] in [0x401] at line 544

Failure [0x8000802d] in [0x401] at line 544

ISR_Install:445

request_irq 28

request_irq failed with error: -16

Failure [0x80008008] in [0x502] at line 459

Failure [0x80008008] in [0x80a] at line 824

Failure [0x80008008] in [0x80a] at line 1061

Failure [0x80008008] in [0x801] at line 597

Failure [0x80008008] in [0x701] at line 370

 DSP_init status [0x80008008]

Assertion failed ((isrObj!= NULL) && (ISR_InstalledIsrs [isrObj->dspId][isrObj->irq] == isrObj)). File : /home/gigijoe/

OMAP3530

/dvsdk_3_00_02_44/dsplink_1_61_03/packages/dsplink/gp

p/src/../../gpp/src/osal/Linux/2.6.18/isr.c Line : 507

Failure [0x80008000] in [0x502] at line 515

Failure [0x80008008] in [0x300] at line 476

Failure [0x80008008] in [0x300] at line 563

PROC_attach () failed. Status = [0x80008008]

PROC_setup () failed. Status = [0x80008008]

Leaving MESSAGE_Create ()

Entered MESSAGE_Delete ()

Assertion failed (IS_VALID_MSGQ (msgqQueue)). File : msgq.c Line : 484

MSGQ_release () failed. Status = [0x8000800b]

Assertion failed (IS_VALID_MSGQ (msgqQueue)). File : msgq.c Line : 335

Leaving MESSAGE_Delete ()

====================================================

Trace DSPLINK driver發現request_irq 28 居然失敗了.很明顯IRQ被佔據了.

看看到底是誰

cat /proc/interrupts

           CPU0

 11:          0        INTC  prcm

 12:          1        INTC  DMA

 18:          0        INTC  sr1

 19:          0        INTC  sr2

 24:          0        INTC  omap-iommu.1, Omap 3 Camera ISP

 25:          1        INTC  OMAP DSS

28:          0        INTC  omap-iommu.2

 56:        347        INTC  i2c_omap

 61:          0        INTC  i2c_omap

 72:          1        INTC  serial idle

 73:          1        INTC  serial idle

 74:         94        INTC  serial idle, serial

 77:          0        INTC  ehci_hcd:usb2

 83:          0        INTC  mmc0

 86:         14        INTC  mmc1

 92:          0        INTC  musb_hdrc

 93:          0        INTC  musb_hdrc

 95:        641        INTC  gp timer

160:          0        GPIO  mmc1

167:          0        GPIO  user

181:          8        GPIO  eth0

378:          0     twl4030  twl4030_usb

379:          0     twl4030  rtc0

384:          0     twl4030  mmc0

原來是iommu啊,OK,調整一下kernel config

Disable

Device Drivers->Multimedia Devices->Video Capture Adapters->OMAP 3 Camera Support

System Type->

TI

OMAP Implemenation->IOMMU Support

這樣就OK囉

其實還有一些疑慮沒有解決.

IOMMU 以 Shared IRQ 方式 request_irq而DSPLINK Driver request_irq 並不是.

因此造成問題,DSPLINK Driver是否應該以Shared IRQ方式request_irq呢?

一个DSP开发者的感受

作者:未知    DSP来源:网络  
我是已经从事DSP开发有几年了,看到许多朋友对DSP的开发非常感兴取,我结合这几年对DSP的开发写一写自己的感受,一家之言,欢迎指教。我上研究生的第一天起根据老板的安排就开始接触DSP,那时DSP开发在国内高校刚刚开始,一台DSP开发器接近一万还是ISA总线的,我从206开始240、 2407A都作过产品,对5402、2812、5471在产品方案规划制定和论证时也研究过。由于方向所限对6X、8X系列没有接触。

  我发现在国内无论在公司或高校许多地方为了加快开发周期往往把一个产品开发分为硬件和软件两个相对独立部分,由不同的人完成。这在具有一定技术和管理基础的公司,由总设计师统一规划协调,分任务并行完成的情况下是可行的,也是符合现代产品开发规律的。但是在高校人员的流动很大,研究生的有效科研时间很短、基础差(许多研究生起步时对电熔、电阻、三极管的分类和选型都很困难,我也是这样过来的)更不用说系统规划设计了,况且许多老板自己也不太懂,师兄有自己的任务,他们搞明白时也毕业了。在许多高校做DSP就是找一个算法加到自己的主程序里,在板子上跑一下,基本达到效果就可以了,至于可靠性是次要的,产业化无从谈起,这已经算不错的了。其实我觉得一个系统的完成,系统的规划是最重要的,在规划时对硬件设计的知识和认识是决定性的,它可以让你知道什么是可行的,什么是不可行的,当你同时具有软件设计能力时,就可以合理的分配系统功能,完成使用VHDL进行系统行为描述-—系统功能划分—— 系统子结构设计这样的自顶向下的设计规划流程,成为系统设计专家、项目经理,否则只是硬件工程师、软件工程师。无论作51、196、还是DSP都是这样。

  下面分别谈谈我对硬件和软件设计的感受

       硬件设计是系统设计的关键,国内和国外产品的差距往往是硬件设计水平高低决定的,任何软件设计思想没有可靠的物理载体都是空中楼阁,纸上谈兵。学校的研究生很多都想避开硬件设计,对于一个全新的设计与其说不屑不如说不敢。试想一下烧几个片子的压力要比跑飞几段程序的压力大的多,尤其是功率器件,一旦烧掉,弄不好火光冲天,人的自信都没了。况且改一次板周期长,经费高,还不知行不行。其实在国外实力一般的公司也是尽量避免硬件的更新设计,产品一旦定型往往通过软件升级,这是公司的发展策略,对个人而言物以希为贵,培养一个硬件设计师往往要比软件设计师时间长花费多。在设计dsp硬件时,开始设计最小系统板,系统按功能分板设计调试,注意分板电路的稳定性可能不如整板电路,要多加入抗干扰环节,分板间的引线包括电源线地线要短,尽量在10公分以内,实在不行加入光耦隔离、采用隔离电源。切记电源线、地线的干扰远比信号干扰对系统的危害大得多,又常常被人忽视。电路板工作正常的先决条件就是电源正常!当分板电路正常后再更居情况设计整板电路。在调试时发现的问题一定要找到原因解决,即使是飞线,割线,不要寄希望于下一板改了再看,除非原理性错误。每一个功能环节多准备几套方案。
  DSP的选型要根据系统功能而定,2000是一个功能比较全的控制器,但运算性能相对低,但目前大部分控制类、家电类包括中低层次的工业总线通信产品足够了,281X不错但太贵,而且开发技术不成熟。54XX更像一个协处理器,其实高端产品5471就很好,功能完*,但BGA封装对产品的开发有一定难度。如果没有从事过嵌入式系统开发的朋友其实可以从51看起,许多思想是共通的,51很经典没有哪一款微处理器像51那样使用持久和普遍。在硬件设计时更多的精力放在外围电路设计上,外围电路设计的灵活性要比DSP本身高得多,难度大得多。建议多考虑CPLD。

  软件设计上,着眼点不要仅局限于某种算法和控制策略,而是软件系统框架的制定,即操作系统的选择和实现,算法和控制策略只是其中技巧性很强的子程序和子程序间参数相互关系,建议设计软件时能具有操作系统、数据结构和编译原理方面的知识,特别是使用C。

  对DSP的内部硬件结构一定要掌握,特别是中断结构和流程、流水线操作,不然飞都不知道怎么飞的。在语言选择上我当时是这么给自己规定的先编20个左右的汇编程序,每个代码量超过4K,使用语句范围覆盖全部语句的60%-70%,在此基础上使用C。现在发现用C构建程序的主体框架(操作系统)比较快而其不容易出错,(我现在正在用ASM根据UCOSII的思想重写自己的操作系统)但对系统实时性影响比较大的运算算法一般采用MATLAB——C—— ASM的办法仿真调试优化,这里的优化不单单是利用优化器优化,而是根据数据的特点改变运算方法,以除法为例C里的/号其实掩盖了许多技巧,当除数为常数时就可以放大倒数移位相乘移位的办法进行,精度高速度快。这些办法只有掌握了ASM语言并用ASM语言思考才会熟练应用。另外我想告诉一些作算法特别是控制算法的朋友,千万不要随意评判一个算法的优劣,在程序中程序和代码优化的程度往往影响了控制效果好坏,而不是算法本身的思想。其实在实际中往往PID甚至PI、PD就够了,神经元、模糊、小波适用于研究和写论文,模糊在实际中用的多一点,主要是小***用的比较成熟,我再恨***人,这点也服气,小***就是滑,许多物理现象搞不透,就用这法,还管用,题外话。

  最后我想说的是,当我们面对市场要求时,产品往往考虑的是可靠性、性能、价格而不是你用的什么芯片,在满足性能的基础上结构越简单就越可靠,芯片越通用价格就越低,能用51就不用196,能用2407就不用2812,除非把芯片本身作买点利用高成本赢取高利润。无论2000还是5000、6000系列都有市场前景,关键是要做深做透获取知识的方法、处理项目的能力是相通的,具体的说就是不要把目光盯在做硬件还是做软件上,用ASM还是C,要勤动手打好基础,提高自己对系统总体设计的能力,从系统的眼光看问题。为什么都是做DSP的有的毕业拿3000,有的5000、8000,除了运气和关系外,重要的是你对事物的认识深度和高度。我一直都记住这句话:有前途的人做什么都有前途,没前途的人做什么都没前途。