Telefonê SIP-ê li ser STM32F7-Discovery

Hê her kesî

Demek berê me nivîsand li ser ka me çawa karî têlefonek SIP-ê li ser STM32F4-Discovery bi 1 MB ROM û 192 KB RAM dest pê bike) li ser bingeha Embox. Li vir divê bê gotin ku ew guhertoya herî kêm bû û du têlefon rasterast bêyî serverek û bi veguheztina deng tenê di yek alî de ve girêda. Ji ber vê yekê, me biryar da ku em têlefonek bêkêmasî bi bangek serverê, veguheztina deng di her du aliyan de dest pê bikin, lê di heman demê de di nav mezinahiya bîranîna herî piçûk de bimînin.


Ji bo têlefonê, biryar hate girtin ku serîlêdanek hilbijêrin simple_pjsua wekî beşek ji pirtûkxaneya PJSIP. Ev serîlêdanek hindiktirîn e ku dikare li ser serverê qeyd bike, bangan bistîne û bersiv bide. Li jêr ez ê tavilê raveyek bidim ka meriv wê çawa li STM32F7-Discovery dimeşîne.

Meriv çawa dest pê dike

  1. Veavakirina Embox
    make confload-platform/pjsip/stm32f7cube
  2. Hesabê SIP-ê ya pêwîst di pelê conf/mods.config de bicîh bikin.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    ko server serverek SIP e (mînak, sip.linphone.org), navê bikarhêner и şîfre - navê bikarhêner û şîfreya hesabê.

  3. Embox wekî tîmek berhev dikin kirin. Di derbarê firmware-ya panelê de ku em li ser hene wiki wiki û di gotara.
  4. Fermana "simple_pjsua_imported" di konsolê Embox de bimeşînin
    
    00:00:12.870    pjsua_acc.c  ....SIP outbound status for acc 0 is not active
    00:00:12.884    pjsua_acc.c  ....sip:[email protected]: registration success, status=200 (Registration succes
    00:00:12.911    pjsua_acc.c  ....Keep-alive timer started for acc 0, destination:91.121.209.194:5060, interval:15s
    

  5. Di dawiyê de, ew dimîne ku meriv axaftvan an guhên xwe têxe nav derana deng, û li dû mîkrofonên piçûk MEMS li tenişta ekranê biaxive. Em ji Linux bi serîlêdana simple_pjsua, pjsua bang dikin. Welê, an hûn dikarin celebek din a linphone bikar bînin.

Ev hemî li ser me têne vegotin wiki wiki.

Em çawa hatin wir

Ji ber vê yekê, di destpêkê de pirs di derbarê hilbijartina platformek hardware de derket. Ji ber ku eşkere bû ku STM32F4-Discovery dê ji bîranînê venebe, STM32F7-Discovery hate hilbijartin. Wê 1 MB ajokerek flash û 256 KB RAM heye (+ 64 bîranîna bilez a taybetî, ku em ê jî bikar bînin). Di heman demê de ji bo bangên bi navgîniya serverê ne pir in, lê me biryar da ku em hewl bidin ku tê de cih bigirin.

Bi şert û merc ji bo xwe, peywir li çend qonaxan hate dabeş kirin:

  • PJSIP li ser QEMU dimeşîne. Ew ji bo debugkirinê rehet bû, plus me jixwe piştgirîya kodek AC97 li wir hebû.
  • Tomarkirina deng û lêdanê li ser QEMU û li ser STM32.
  • Veguheztina serîlêdanê simple_pjsua ji PJSIP. Ew dihêle hûn li ser servera SIP-ê qeyd bikin û bang bikin.
  • Pêşkêşkara xweya Asterisk-ê bicîh bikin û li ser ceribandinê bikin, dûv re yên derveyî yên wekî sip.linphone.org biceribînin

Deng di Embox de bi Portaudio re dixebite, ku di PISIP de jî tê bikar anîn. Pirsgirêkên yekem li ser QEMU xuya bûn - WAV li 44100 Hz baş lîst, lê di 8000 de tiştek eşkere xelet bû. Derket holê ku ew mijarek danîna frekansê ye - ji hêla xwerû ve ew di cîhazê de 44100 bû, û ev ji hêla bernameyê ve nehat guhertin.

Li vir, dibe ku, hêja ye ku meriv hinekî rave bike ka deng bi gelemperî çawa tê lîstin. Karta deng dikare li ser perçeyek bîranînê ya ku hûn jê dixwazin bi frekansek pêşwextkirî lê bilîzin an tomar bikin, were danîn. Piştî ku tampon qediya, navberek çêdibe û bi tampona din re pêkanîn berdewam dike. Rastî ev e ku dema ku ya berê tê lîstin pêdivî ye ku ev tampon pêşwext bêne dagirtin. Em ê li ser STM32F7 bêtir bi vê pirsgirêkê re rû bi rû bimînin.

Dûv re, me serverek kirê kir û Asterisk li ser wê bicîh kir. Ji ber ku hewce bû ku gelek debug bike, lê min nexwest zêde bi mîkrofonê re biaxivim, pêdivî bû ku ez bixweber lêkdan û tomar bikim. Ji bo kirina vê yekê, me simple_pjsua patch kir da ku hûn li şûna cîhazên dengî pelan bişkînin. Di PJSIP-ê de, ev bi hêsanî tê kirin, ji ber ku têgeha wan a portê heye, ku dikare bibe amûrek an pelek. Û ev port dikarin bi nermî bi benderên din ve werin girêdan. Hûn dikarin kodê di pjsip-a me de bibînin depoyên. Di encamê de, plan wiha bû. Li ser servera Asterisk, min du hesab dest pê kir - ji bo Linux û ji bo Embox. Dûv re, ferman li ser Emboxê tê darve kirin simple_pjsua_imported, Embox li ser serverê qeyd dike, piştî ku em ji Linux re dibêjin Embox. Di dema girêdanê de, em li ser servera Asterisk kontrol dikin ku pêwendiyek saz bûye, û piştî demekê divê em dengê ji Linux-ê li Embox-ê bibihîzin, û di Linux-ê de em pelê ku ji Embox tê lîstin hilînin.

Piştî ku ew li ser QEMU xebitî, em derbasî portkirina STM32F7-Discovery bûn. Pirsgirêka yekem ev e ku ew bêyî optimîzasyona berhevkar a çalak "-Os" ji bo mezinahiya wêneyê di 1 MB ROM-ê de cîh negirtin. Loma jî me “-Os” xistiye nav xwe. Wekî din, patch piştgirî ji bo C ++ neçalak kir, ji ber vê yekê ew tenê ji bo pjsua hewce ye, û em simple_pjsua bikar tînin.

Piştî danîn simple_pjsua, biryar da ku niha derfeta destpêkirina wê heye. Lê pêşî hewce bû ku meriv bi tomarkirin û lêxistina deng ve mijûl bibe. Pirs ev e ku meriv li ku binivîse? Me bîra derveyî hilbijart - SDRAM (128 MB). Hûn dikarin vê bi xwe biceribînin:

WAV stereo bi frekansa 16000 Hz û dirêjahiya 10 çirkeyan diafirîne:


record -r 16000 -c 2 -d 10000 -m C0000000

Em winda dikin:


play -m C0000000

Li vir du pirsgirêk hene. Yekem bi kodek - WM8994 tê bikar anîn, û tiştek wê wekî hêlînê heye, û 4 ji van hêlînê hene. Ji ber vê yekê, bi xwerû, heke ev ne mîhengkirî be, wê hingê dema ku deng tê lîstin, lêdan di her çar hêlînê de pêk tê. . Ji ber vê yekê, di frekansa 16000 Hz de, me 8000 Hz wergirt, lê ji bo 8000 Hz, lîstin bi tenê nexebitî. Gava ku tenê slots 0 û 2 hatin hilbijartin, ew wekî ku divê xebitî. Pirsgirêkek din pêwendiya dengî ya di STM32Cube de bû, ku tê de derana deng bi navgîniya SAI (Navenda Dengê Serial) bi têketina deng re hevdem dixebite (min hûrgulî fam nekir, lê derket holê ku ew demjimêrek hevpar parve dikin û dema ku derketina bihîstwerî dest pê dike, deng bi rengek bi têketina wê ve girêdayî ye). Ango, hûn nekarin wan ji hev cihê bimeşînin, ji ber vê yekê me ya jêrîn kir - ketina deng û derketina deng her gav dixebitin (tevî navbirî têne çêkirin). Lê gava ku di pergalê de tiştek nayê lîstin, wê hingê em bi tenê tamponek vala diherikin nav derana deng, û gava ku lêdan dest pê dike, em bi dilpakî dest bi dagirtina wê dikin.

Wekî din, em rastî vê yekê hatin ku deng di dema tomarkirina deng de pir bêdeng bû. Ev ji ber vê yekê ye ku mîkrofonên MEMS yên li ser STM32F7-Discovery bi rengekî li frekansên li jêr 16000 Hz baş naxebitin. Ji ber vê yekê, em 16000 Hz destnîşan dikin, heke 8000 Hz jî were. Ji bo vê yekê, lêbelê, pêdivî bû ku veguheztina nermalava yek frekansê li yekî din zêde bike.

Dûv re, min neçar ma ku qebareya ku di RAM-ê de ye zêde bikim. Li gorî hesabên me, pjsip bi qasî 190 KB hewce dike, û ji me re tenê 100 KB maye. Li vir ez neçar bûm ku hin bîranîna derveyî bikar bînim - SDRAM (nêzîkî 128 KB).

Piştî van hemî guhertinan, min pakêtên yekem di navbera Linux û Embox de dît, û min deng bihîst! Lê deng tirsnak bû, ne wekî QEMU bû, ne mimkun bû ku tiştek jê derbikeve. Paşê em fikirîn ku çi dibe bila bibe. Debugging destnîşan kir ku Embox bi tenê wext tune ku tamponên deng dagirtin / dakêşin. Dema ku pjsip çarçoveyek hildiweşîne, 2 qutbûn di derbarê temamkirina pêvajoya tamponê de, ku pir zêde ye, dem çêdibûn. Fikra yekem ji bo lezê xweşbînkirina berhevkerê bû, lê ew berê di PJSIP de bû. Ya duyemîn xalek hilkêşana hardware ye, me li ser wê peyivî gotara. Lê wekî pratîkê destnîşan kir, FPU di lezê de zêdebûnek girîng neda. Pêngava paşîn pêşîgirtina mijaran bû. Embox xwedan stratejiyên plansazkirinê yên cihêreng e, û min yeka ku pêşengiyê piştgirî dike û guheztinên bihîstwerî li ser pêşîniya herî bilind destnîşan kiriye. Ev jî alîkarî nekir.

Fikra din ev bû ku em bi bîranîna derveyî re dixebitin û dê xweş be ku em strukturên ku pir caran têne gihîştin wir biguhezînin. Min analîzek pêşîn kir ka kengê û di binê çi de simple_pjsua bîrê vediqetîne. Derket holê ku ji 190 Kb, 90 Kb yekem ji bo hewcedariyên navxweyî yên PJSIP-ê têne veqetandin û pir caran nayên gihîştin. Zêdetir, di dema bangek gihîştî de, fonksiyona pjsua_call_answer tê gazî kirin, ku tê de tampon ji bo xebata bi çarçoveyên ketin û derketinê re têne veqetandin. Hîn jî dora 100 Kb bû. Û paşê me jêrîn kir. Heya dema bangê, em daneyan di bîra derve de bi cih dikin. Hema ku em bang dikin, em tavilê guhê bi yekî din diguhezînin - di RAM-ê de. Bi vî rengî, hemî daneyên "germ" ji bo bîranîna zûtir û pêşbînîkirî hate veguheztin.

Di encamê de, van hemûyan bi hev re îmkan da destpêkirinê simple_pjsua û bi servera xwe re bang bikin. Û paşê bi rêya serverên din ên wekî sip.linphone.org.

vebiguherin

Di encamê de, gengaz bû ku dest pê bike simple_pjsua bi veguhestina deng di her du aliyan de bi riya serverê. Pirsgirêka 128 KB ya SDRAM-ê ya zêde hatî xerckirin dikare bi karanîna Cortex-M7-ya piçek bihêztir were çareser kirin (mînak, STM32F769NI bi 512 KB RAM), lê di heman demê de, me hîna jî hêviya xwe ji 256-ê bernedaye. KB 🙂 Ger kesek eleqedar be em ê kêfxweş bibin, An jî çêtir e, wê biceribîne. Hemî çavkanî, wekî berê, di me de ne depoyên.

Source: www.habr.com

Add a comment