From fc9543a277b336dec42b875d646a382b0f7270cd Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 31 Mar 2005 15:47:22 +0000 Subject: [PATCH] Added open-source tascam_loader firmware Added open-source tascam_loader firmware files by Martin Langer New option "--enable-buildfw" is added to configure script to build firmware files via as31. --- configure.in | 14 +- usx2yloader/Makefile.am | 10 +- usx2yloader/an2131.asm | 88 +++++++++++ usx2yloader/tascam_loader.asm | 266 ++++++++++++++++++++++++++++++++++ usx2yloader/tascam_loader.ihx | 161 +++----------------- 5 files changed, 399 insertions(+), 140 deletions(-) create mode 100644 usx2yloader/an2131.asm create mode 100644 usx2yloader/tascam_loader.asm diff --git a/configure.in b/configure.in index ac58bcc..531a649 100644 --- a/configure.in +++ b/configure.in @@ -1,6 +1,6 @@ AC_PREREQ(2.53) AC_INIT(hdsploader/tobin.c) -AM_INIT_AUTOMAKE(alsa-firmware, 1.0.8) +AM_INIT_AUTOMAKE(alsa-firmware, 1.0.9rc2) AC_PROG_CC AC_PROG_INSTALL AC_HEADER_STDC @@ -13,9 +13,21 @@ AC_ARG_ENABLE(loader, AC_ARG_ENABLE(hotplug, [ --disable-hotplug Disable the hotplug fw loader support], [hotplug="$enableval"],[hotplug=yes]) +AC_ARG_ENABLE(buildfw, + [ --enable-buildfw Enable building fw from source files], + [buildfw="$enableval"],[buildfw=no]) + +AC_PATH_PROGS(AS31, as31) +AS31_FLAGS="-Fhex" +AC_SUBST(AS31_FLAGS) + +if test x"${AS31}" = x""; then + buildfw=false +fi AM_CONDITIONAL(USE_LOADER, test "$loader" = "yes") AM_CONDITIONAL(USE_HOTPLUG, test "$hotplug" = "yes") +AM_CONDITIONAL(BUILD_FW, test "$buildfw" = "yes") AC_ARG_WITH(hotplug-dir, [ --with-hotplug-dir Specify the hotplug firmware directory], diff --git a/usx2yloader/Makefile.am b/usx2yloader/Makefile.am index de84bdc..4bd66ca 100644 --- a/usx2yloader/Makefile.am +++ b/usx2yloader/Makefile.am @@ -6,7 +6,15 @@ cfg_files = us122.conf us224.conf us428.conf \ tascam_loader.ihx \ us122fw.ihx us224fw.ihx us428fw.ihx -EXTRA_DIST = $(cfg_files) +if BUILD_FW +bin_SCRIPTS = tascam_loader +tascam_loader: + $(AS31) $(AS31_FLAGS) -s tascam_loader.asm > tascam_loader.ihx +endif + +EXTRA_DIST = $(cfg_files) \ + tascam_loader.asm \ + an2131.asm firmwaredir = $(datadir)/alsa/firmware/$(MYNAME) firmware_DATA = $(cfg_files) diff --git a/usx2yloader/an2131.asm b/usx2yloader/an2131.asm new file mode 100644 index 0000000..1aaa78e --- /dev/null +++ b/usx2yloader/an2131.asm @@ -0,0 +1,88 @@ +; +; Declaration of AN2131xx EZ-USB Registers +; +; +; Copyright (c) 2004 Martin Langer +; +; +; This program is free software; you can redistribute it and/or +; modify it under the terms of the GNU General Public License +; as published by the Free Software Foundation; either version 2 +; of the License, or any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +; +; + + +.equ DPL1, 0x84 +.equ DPH1, 0x85 +.equ DPS, 0x86 +.equ CKCON, 0x8E +.equ SPC_FNC, 0x8F +.equ EXIF, 0x91 +.equ MPAGE, 0x92 +.equ SCON0, 0x98 +.equ SBUF0, 0x99 +.equ SCON1, 0xC0 +.equ SBUF1, 0xC1 +.equ EICON, 0xD8 +.equ EIE, 0xE8 ; Interrupt Enables +.equ EIP, 0xF8 + + +.equ OUT1BUF, 0x7E40 +.equ IN1BUF, 0x7E80 +.equ OUT0BUF, 0x7EC0 +.equ IN0BUF, 0x7F00 +.equ CPUCS, 0x7F92 +.equ PORTACFG, 0x7F93 +.equ PORTBCFG, 0x7F94 +.equ PORTCCFG, 0x7F95 +.equ OUTA, 0x7F96 +.equ OUTB, 0x7F97 +.equ OUTC, 0x7F98 +.equ PINSA, 0x7F99 +.equ PINSB, 0x7F9A +.equ PINSC, 0x7F9B +.equ OEA, 0x7F9C +.equ OEB, 0x7F9D +.equ OEC, 0x7F9E + +.equ I2CS, 0x7FA5 ; I2C Control and Status +.equ I2DAT, 0x7FA6 ; I2C Data + +.equ IN07IRQ, 0x7FA9 ; EP IN Interrupt Request +.equ OUT07IRQ, 0x7FAA ; EP OUT Interrupt Request +.equ USBIRQ, 0x7FAB ; USB Interrupt Request +.equ USBIEN, 0x7FAE ; USB Interrupt Enables +.equ USBBAV, 0x7FAF ; Breakpoint and Autovector +.equ EP0CS, 0x7FB4 ; Control and Status +.equ IN0BC, 0x7FB5 ; Byte Count +.equ IN1CS, 0x7FB6 +.equ IN1BC, 0x7FB7 +.equ OUT0BC, 0x7FC5 ; Byte Count +.equ OUT1CS, 0x7FC6 +.equ OUT1BC, 0x7FC7 +.equ USBCS, 0x7FD6 ; USB Control and Status +.equ SD_BMREQ, 0x7FE8 ; Setup Data Byte 1: bmRequest + ; c0: Vendor Request 'In' + ; 40: Vendor Request 'Out' +.equ SD_BREQ, 0x7FE9 ; Setup Data Byte 2: bRequest + ; a0: Internal Firmware Load + ; a3: External Firmware Load ? +.equ SD_VALL, 0x7FEA ; Setup Data Byte 3: Starting address (lo) +.equ SD_VALH, 0x7FEB ; Setup Data Byte 4: Starting address (hi) +.equ SD_INDL, 0x7FEC ; Setup Data Byte 5: 0x00 +.equ SD_INDH, 0x7FED ; Setup Data Byte 6: 0x00 +.equ SD_LENL, 0x7FEE ; Setup Data Byte 7: Number of Bytes (lo) +.equ SD_LENH, 0x7FEF ; Setup Data Byte 8: Number of Bytes (hi) + +;; diff --git a/usx2yloader/tascam_loader.asm b/usx2yloader/tascam_loader.asm new file mode 100644 index 0000000..b46bcdd --- /dev/null +++ b/usx2yloader/tascam_loader.asm @@ -0,0 +1,266 @@ +; +; Second stage AN2131QC (aka EzUSB) loader +; +; +; Copyright (c) 2004-2005 Martin Langer +; +; Written for Tascam US-122/US-224/US-428 audio/MIDI devices +; +; This program is free software; you can redistribute it and/or +; modify it under the terms of the GNU General Public License +; as published by the Free Software Foundation; either version 2 +; of the License, or any later version. +; +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. +; +; You should have received a copy of the GNU General Public License +; along with this program; if not, write to the Free Software +; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +; +; + +.inc "an2131.asm" + + +; ====================================================== interrupt vectors === + + .org 0x0000 ; reset vector + ljmp init + + .org 0x0043 ; int2 vector (USB) + ljmp usb_jump_table ; autovector will replace byte 45 + + +; =================================================================== init === + +init: + mov sp, #20h ; move stack pointer to 0x20 + + mov a, EIE + setb acc.0 ; enable int2 (USB Interrupt) + mov EIE, a + + mov dptr, #USBIRQ + mov a, #00011111b + movx @dptr, a ; clear Interrupt Request + + mov dptr, #IN07IRQ + mov a, #11111111b + movx @dptr, a ; clear EP IN Interrupt Request + + mov dptr, #OUT07IRQ + mov a, #11111111b + movx @dptr, a ; clear EP OUT Interrupt Request + + mov dptr, #PORTCCFG + movx a, @dptr + orl a, #11000000b ; allow read and write on Port C + movx @dptr, a + + mov dptr, #USBBAV + movx a, @dptr + orl a, #00000001b ; enable Autovector feature + movx @dptr, a + + mov dptr, #USBIEN + movx a, @dptr + orl a, #00000101b ; enable 'Setup Data Available + movx @dptr, a ; Interrupt Request' and 'Setup Token + ; Interrupt Request' + + setb ea ; enable global 8051 Interrupts + +loop: + sjmp loop + + +; ========================================= usb interrupt service routines === + +usb_jump_table: + ljmp setup_data_avail_isr ; setup data available + .db 0 + ljmp start_of_frame_isr ; Start of frame + .db 0 + ljmp setup_token_isr ; loading setup data + .db 0 + ljmp usb_suspend_isr ; USB suspend + .db 0 + ljmp usb_reset_isr ; USB reset + .db 0 + ljmp spare_isr + .db 0 + ljmp ep0_in_isr + .db 0 + ljmp ep0_out_isr + .db 0 + ljmp ep1_in_isr + .db 0 + ljmp ep1_out_isr + .db 0 + ljmp ep2_in_isr + .db 0 + ljmp ep2_out_isr + .db 0 + ljmp ep3_in_isr + .db 0 + ljmp ep3_out_isr + .db 0 + ljmp ep4_in_isr + .db 0 + ljmp ep4_out_isr + .db 0 + ljmp ep5_in_isr + .db 0 + ljmp ep5_out_isr + .db 0 + ljmp ep6_in_isr + .db 0 + ljmp ep6_out_isr + .db 0 + ljmp ep7_in_isr + .db 0 + ljmp ep7_out_isr + .db 0 + +setup_data_avail_isr: + push acc + push dph + push dpl + push dph1 + push dpl1 + push dps + mov a, EXIF + clr acc.4 ; clear USB Interrupt Request + mov EXIF, a + mov dptr, #USBIRQ + mov a, #00000001b ; Setup Data Avail. Interrupt Request + movx @dptr, a + pop dps + pop dpl1 + pop dph1 + pop dpl + pop dph + pop acc + reti + +start_of_frame_isr: + push acc + push dph + push dpl + push dph1 + push dpl1 + push dps + mov a, EXIF + clr acc.4 ; clear USB Interrupt Request + mov EXIF, a + mov dptr, #USBIRQ + mov a, #00000010b ; Start of frame Interrupt Request + movx @dptr, a + pop dps + pop dpl1 + pop dph1 + pop dpl + pop dph + pop acc + reti + +setup_token_isr: + push acc + push dph + push dpl + push dph1 + push dpl1 + push dps + mov a, EXIF + clr acc.4 ; clear USB Interrupt Request + mov EXIF, a + mov dptr, #USBIRQ + mov a, #00000100b ; Setup Token Interrupt Request + movx @dptr, a + pop dps + pop dpl1 + pop dph1 + pop dpl + pop dph + pop acc + reti + +usb_suspend_isr: + push acc + push dph + push dpl + push dph1 + push dpl1 + push dps + mov a, EXIF + clr acc.4 ; clear USB Interrupt Request + mov EXIF, a + mov dptr, #USBIRQ + mov a, #00001000b ; USB Suspend Interrupt Request + movx @dptr, a + pop dps + pop dpl1 + pop dph1 + pop dpl + pop dph + pop acc + reti + +usb_reset_isr: + push acc + push dph + push dpl + push dph1 + push dpl1 + push dps + mov a, EXIF + clr acc.4 ; clear USB Interrupt Request + mov EXIF, a + mov dptr, #USBIRQ + mov a, #00010000b ; USB Reset Interrupt Request + movx @dptr, a + pop dps + pop dpl1 + pop dph1 + pop dpl + pop dph + pop acc + reti + +spare_isr: + reti +ep0_in_isr: + reti +ep0_out_isr: + reti +ep1_in_isr: + reti +ep1_out_isr: + reti +ep2_in_isr: + reti +ep2_out_isr: + reti +ep3_in_isr: + reti +ep3_out_isr: + reti +ep4_in_isr: + reti +ep4_out_isr: + reti +ep5_in_isr: + reti +ep5_out_isr: + reti +ep6_in_isr: + reti +ep6_out_isr: + reti +ep7_in_isr: + reti +ep7_out_isr: + reti diff --git a/usx2yloader/tascam_loader.ihx b/usx2yloader/tascam_loader.ihx index faf5d9b..4022f2a 100644 --- a/usx2yloader/tascam_loader.ihx +++ b/usx2yloader/tascam_loader.ihx @@ -1,139 +1,24 @@ -:10146C00C200907FA5E05418FF131313541F44506F -:10147C00F51C139201D2E8907FAB74FFF0907FA91A -:10148C00F0907FAAF05391EF907F95E044C0F090DC -:10149C007FAFE04401F0907FAEE04405F0D2AF1294 -:0D14AC00175F3000FD121100C20080F62213 -:10110000907FE9E0245D600D147003021244240214 -:10111000600302124A907FEAE0750800F509A3E037 -:10112000FEE42509F509EE3508F508907FEEE07537 -:101130000A00F50BA3E0FEE4250BF50BEE350AF5EE -:101140000A907FE8E064C060030211D4E50B450A11 -:10115000700302124AC3E50B9440E50A940050085C -:10116000850A0C850B0D8006750C00750D40907F6F -:10117000E9E0B4A325AE0CAF0DAA08A9097B01C014 -:1011800003C002C0017A7F790078007C7FAD03D074 -:1011900001D002D003121356800FAF09AE08AD0D77 -:1011A0007A7F79007B001215A4907FB5E50DF0E5FC -:1011B0000D2509F509E50C3508F508C3E50B950D76 -:1011C000F50BE50A950CF50A907FB4E020E20302E6 -:1011D000114C80F4907FE8E06440706EE50B450AA6 -:1011E0006068E4907FC5F0907FB4E020E3F9907FE1 -:1011F000C5E0750C00F50D907FE9E0B4A315AE0CC9 -:10120000AF0DA809AC087D017B017A7E79C012136D -:1012100056800FAF09AE08AD0D7A7F79007B0012C2 -:1012200014B9E50D2509F509E50C3508F508C3E500 -:101230000B950DF50BE50A950CF50A907FB4E0448B -:0A12400002F08098907FEAE0F51CB0 -:01124A002281 -:06155800AB07AA06AC057A -:10155E00E4FD300111EAFFAE050DEE2400F582E444 -:10156E0034E0F583EFF0EBAE050D74002EF582E45A -:10157E0034E0F583EBF0AF050D74002FF582E43403 -:10158E00E0F583ECF0AF1C7AE07B001217207F0AA7 -:05159E007E0012173C65 -:0115A3002225 -:0A14B9008E0E8F0F8D108A118B121A -:1014C300E4F513E513C395105020050FE50FAE0E99 -:1014D3007002050E14FFE5122513F582E43511F5AC -:0A14E30083E0FD121558051380D9AF -:0114ED0022DC -:0A15A4008E0E8F0F8D108A118B122E -:1015AE00E4FD300112E50EFFAE050DEE2403F582CB -:1015BE00E434E0F583EFF0E50FAE050D74032EF580 -:1015CE0082E434E0F583E50FF0AF1C7AE07B031282 -:0D15DE001720AF1CAD10AB12AA111217049C -:0115EB0022DD -:10166E00C0E0C083C082C085C084C086758600D2AB -:10167E00005391EF907FAB7401F0D086D084D0856B -:07168E00D082D083D0E032CE -:10164400C0E0C083C082C085C084C0867586009017 -:101654007FC4E4F05391EF907FAB7404F0D086D054 -:0A16640084D085D082D083D0E0321C -:10169500C0E0C083C082C085C084C0867586005303 -:1016A50091EF907FAB7402F0D086D084D085D08244 -:0516B500D083D0E032FB -:1016BA00C0E0C083C082C085C084C08675860053DE -:1016CA0091EF907FAB7410F0D086D084D085D08211 -:0516DA00D083D0E032D6 -:0114FF0032BA -:1016DF00C0E0C083C082C085C084C08675860053B9 -:1016EF0091EF907FAB7408F0D086D084D085D082F4 -:0516FF00D083D0E032B1 -:01176700324F -:01176800324E -:01176900324D -:01176A00324C -:01176B00324B -:01176C00324A -:01176D003249 -:01176E003248 -:01176F003247 -:011770003246 -:011771003245 -:011772003244 -:011773003243 -:011774003242 -:011775003241 -:011776003240 -:03004300021500A3 -:1015000002166E0002169500021644000216DF0055 -:101510000216BA000214FF000217670002176800E3 -:101520000217690002176A0002176B0002176C00AD -:1015300002176D0002176E0002176F00021770008D -:10154000021771000217720002177300021774006D -:08155000021775000217760076 -:10173C008E148F15E5151515AE14700215144E6028 -:07174C00051214EE80EE22ED -:08175F00E4F51BD2E9D2AF2230 -:10161900A907E51B7023907FA5E04480F0E925E048 -:10162900907FA6F08D16AF03A9077517018A18894F -:0B16390019E4F51A751B01D322C3222F -:1015EC00A907E51B7025907FA5E04480F0E925E074 -:1015FC004401907FA6F08D16AF03A9077517018AD9 -:0D160C00188919E4F51A751B03D322C322B7 -:03004B0002137F1E -:10137F00C0E0C083C082C085C084C086758600C0AF -:10138F00D075D000C000C001C002C003C006C007A6 -:10139F00907FA5E030E206751B0602144E907FA5E4 -:1013AF00E020E10CE51B64026006751B0702144E7A -:1013BF00AF1BEF24FE604814602C24FE60772404DA -:1013CF00600302144EAB17AA18A919AF1A051A8F8A -:1013DF008275830012124B907FA6F0E51A65167086 -:1013EF005E751B058059907FA6E0AB17AA18A91947 -:1013FF00AE1A8E82758300121278751B028040E53B -:10140F001624FEB51A07907FA5E04420F0E51614C8 -:10141F00B51A0A907FA5E04440F0751B00907FA697 -:10142F00E0AB17AA18A919AE1A8E82758300121293 -:10143F0078051A800A907FA5E04440F0751B005391 -:10144F0091DFD007D006D003D002D001D000D0D08A -:0D145F00D086D084D085D082D083D0E032FA -:101704001215ECE51B24FA600E146006240770F32E -:0C171400D322E4F51BD322E4F51BD32202 -:10172000121619E51B24FA600E146006240770F3E4 -:0C173000D322E4F51BD322E4F51BD322E6 -:1014EE007400F58690FDA57C05A3E582458370F911 -:0114FE0022CB -:0300000002175391 -:0C175300787FE4F6D8FD75812002146C4C -:10124B00BB010CE58229F582E5833AF583E0225058 -:10125B0006E92582F8E622BBFE06E92582F8E222A2 -:0D126B00E58229F582E5833AF583E49322BC -:10127800F8BB010DE58229F582E5833AF583E8F0AC -:10128800225006E92582C8F622BBFE05E92582C858 -:02129800F22240 -:10129A00E709F608DFFA8046E709F208DFFA803E36 -:1012AA0088828C83E709F0A3DFFA8032E309F60823 -:1012BA00DFFA806EE309F208DFFA806688828C839F -:1012CA00E309F0A3DFFA805A89828A83E0A3F60849 -:1012DA00DFFA804E89828A83E0A3F208DFFA80422D -:1012EA0080D280FA80C680D4805580F2802980100E -:1012FA0080A680EA809A80A880DA80E280CA802963 -:10130A0088848C8589828A83E493A30586F0A30561 -:10131A0086DFF5DEF3800B89828A83E493A3F608DD -:10132A00DFF9ECFAA9F0EDFB2288848C8589828AA0 -:10133A0083E0A30586F0A30586DFF6DEF480E38961 -:10134A00828A83E493A3F208DFF980D688F0ED2439 -:10135A0002B4040050CCF582EB2402B4040050C25B -:10136A0023234582F582EF4E60B8EF60010EE582D5 -:05137A00239012EA734C +:03000000020046B5 +:1000430002007A758120E5E8D2E0F5E8907FAB7491 +:100053001FF0907FA974FFF0907FAA74FFF0907F48 +:1000630095E044C0F0907FAFE04401F0907FAEE0B4 +:100073004405F0D2AF80FE0200D2000200F7000276 +:10008300011C00020141000201660002018B000213 +:10009300018C0002018D0002018E0002018F00021B +:1000A30001900002019100020192000201930002FB +:1000B30001940002019500020196000201970002DB +:1000C3000198000201990002019A0002019B00C0FD +:1000D300E0C083C082C085C084C086E591C2E4F5D8 +:1000E30091907FAB7401F0D086D084D085D082D03C +:1000F30083D0E032C0E0C083C082C085C084C086A4 +:10010300E591C2E4F591907FAB7402F0D086D08480 +:10011300D085D082D083D0E032C0E0C083C082C01B +:1001230085C084C086E591C2E4F591907FAB7404E9 +:10013300F0D086D084D085D082D083D0E032C0E0A6 +:10014300C083C082C085C084C086E591C2E4F591B6 +:10015300907FAB7408F0D086D084D085D082D083D2 +:10016300D0E032C0E0C083C082C085C084C086E5D1 +:1001730091C2E4F591907FAB7410F0D086D084D017 +:1001830085D082D083D0E0323232323232323232D0 +:0A019300323232323232323232326E :00000001FF -- 2.47.1