From patchwork Mon Sep 5 20:43:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12966536 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D4FDFECAAD3 for ; Mon, 5 Sep 2022 20:43:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229546AbiIEUnX (ORCPT ); Mon, 5 Sep 2022 16:43:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47088 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229762AbiIEUnW (ORCPT ); Mon, 5 Sep 2022 16:43:22 -0400 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3A1E26565E for ; Mon, 5 Sep 2022 13:43:21 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id 13F801BF206; Mon, 5 Sep 2022 20:43:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1662410600; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=uAeRvYt5NYKv1ka0MwEzsEd6cjJhQIlrU3flT5h26cw=; b=Sys044HJiDObS8O6fPZL96NMwVQhdVlKdcoelfxfxQPfX0YDSFIwBVcD6GaSJb1hOkYSKN dXLTRcLYsC29kr4WDoKv+w3esvFIsAFCY4xaGLm+rD0dQFE2Be1geWGlfclkKnGwBcf1ko HVc1gXnAYrnr0a8ZdcjRd1oPbIZq559Y6xhsFo6GfjyKUQlQSHFDB5atVLBMu4G9leIClY bjewrTHGCGtuQuvse+PClqJIgdUbd57dICzgKE09Rv1dCcNhkUdv3HvuIk/UaRhBV5zCbb 0BeI623YeAYmQ44IXmQ95Titz4+1bEovTHFNPUkfTzgU3vEVNGTgp8znVsUHEg== From: Miquel Raynal To: werner@almesberger.net Cc: Stefan Schmidt , Alexander Aring , Thomas Petazzoni , linux-wpan@vger.kernel.org, Miquel Raynal Subject: [PATCH atusb/fw 1/2] atusb: fw: Update toolchain instructions Date: Mon, 5 Sep 2022 22:43:17 +0200 Message-Id: <20220905204318.1324284-1-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wpan@vger.kernel.org Those instructions do not work anymore for several reaons: - Two out of the three files to download return a 404 error: * The binutils version does not exist, it was 2.21.1 or 2.21.1a instead of just 2.21. * The avr-libc is no longer hosted on the pointed website, I've found an alternate. - The binutils version mentioned is not able to compile the firmware on a recent distribution, the Internet advised to update its version and it worked. - Most of these compilations will throw warnings if you use a recent gcc. Sometimes -Werror is set and it fails the build. To avoid that, just use --disable-werror in the ./configure options. - I had issues building the gcc doc but those issues are trivial to fix inline. Update the instructions for building the toolchain and while at it, start the file by mentioning that this is maybe not useful anymore, and provide the packets to install. Signed-off-by: Miquel Raynal --- atusb/fw/README | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/atusb/fw/README b/atusb/fw/README index 99ceb22..44f65f5 100644 --- a/atusb/fw/README +++ b/atusb/fw/README @@ -1,4 +1,6 @@ -Requires a very recent toolchain, because ATmega32U2 is relatively new. +- Toolchain: + + apt install avr-gcc libc-avr - Building: @@ -64,12 +66,13 @@ apt-get install libmpfr-dev libmpc-dev # binutils -wget http://ftp.gnu.org/gnu/binutils/binutils-2.21.tar.bz2 -tar xfj binutils-2.21.tar.bz2 -cd binutils-2.21 -./configure --target=avr --disable-nls +wget https://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2 +tar xfj binutils-2.27.tar.bz2 +cd binutils-2.27 +./configure --target=avr --disable-nls --disable-werror make make install +ln -s /usr/local/bin/avr-as /usr/bin/avr-as # gcc @@ -85,9 +88,8 @@ cd obj-avr make make install -wget http://download.savannah.gnu.org/releases/avr-libc/avr-libc-1.7.1.tar.bz2 -tar xfj avr-libc-1.7.1.tar.bz2 -cd avr-libc-1.7.1 +wget https://android.googlesource.com/toolchain/avr-libc/+archive/master/avr-libc-1.7.1.tar.gz +tar xf avr-libc-1.7.1.tar.gz ./bootstrap # the automake at the end takes a while ./configure --build=`./config.guess` --host=avr make From patchwork Mon Sep 5 20:43:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Miquel Raynal X-Patchwork-Id: 12966537 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 89651ECAAD5 for ; Mon, 5 Sep 2022 20:43:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230036AbiIEUna (ORCPT ); Mon, 5 Sep 2022 16:43:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47094 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229762AbiIEUn2 (ORCPT ); Mon, 5 Sep 2022 16:43:28 -0400 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::228]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A749465645 for ; Mon, 5 Sep 2022 13:43:22 -0700 (PDT) Received: (Authenticated sender: miquel.raynal@bootlin.com) by mail.gandi.net (Postfix) with ESMTPSA id 35A7A1BF207; Mon, 5 Sep 2022 20:43:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1662410601; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=5dmr/bzmt973yT9b+06KOqqMsSYwtvcJBhkOV+yohms=; b=k+0cvhzpfbn/0Qfl6zdZCY2uW/NJUMcc4QWNVLtRiYkcLoiOI2ZAxot4dbqUjXi9Y5yFwR brq/KDVC4o8RbMCDOElpKSqUbiky0vrsyUuv1LKYknzxRZJWTnHYCi1rCRK7/Opyzgu92B TAEhKSgUqa2j+1rWonCUulabRxI0pmz6ZxL6+ja+HT4WoIX5pzoerGw0RFRMAJ7341V6cs 5jvyuNCqJunBc07oz9DxreffaEI3IFvvTGVnxg1Tc4IY9jKU8RotHjUDUkX3qRb+x2wmRO Au+EQ7Ey9/PW0b5qaL1zbmZXvG5KKQE7gy8WkAkGA8oFeXHhHENzPtpGGpOD9Q== From: Miquel Raynal To: werner@almesberger.net Cc: Stefan Schmidt , Alexander Aring , Thomas Petazzoni , linux-wpan@vger.kernel.org, Alexander Aring , Miquel Raynal Subject: [PATCH atusb/fw 2/2] atusb: fw: Provide TRAC status Date: Mon, 5 Sep 2022 22:43:18 +0200 Message-Id: <20220905204318.1324284-2-miquel.raynal@bootlin.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220905204318.1324284-1-miquel.raynal@bootlin.com> References: <20220905204318.1324284-1-miquel.raynal@bootlin.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-wpan@vger.kernel.org From: Alexander Aring Upon Tx done condition, returning the sequence number is useful but we might also return the TRAC value which is needed to ensure that the packet we sent got ACKed. The TRAC register just needs to be read when the TRX_END interrupt fires. We then need to send this information as part of the status message. First byte remains the sequence number for ensuring backward compatibility and a second byte is added to forward the TRAC register status. Signed-off-by: Alexander Aring [Miquel Raynal: Moved the data array out of the stack, wrote commit log] Signed-off-by: Miquel Raynal --- atusb/fw/.version | 1 + atusb/fw/app-atu2.d | 8 ++ atusb/fw/atusb.bin | Bin 0 -> 6536 bytes atusb/fw/atusb.d | 13 +++ atusb/fw/atusb.dfu | Bin 0 -> 6552 bytes atusb/fw/atusb.elf | Bin 0 -> 52324 bytes atusb/fw/board.d | 12 ++ atusb/fw/board_app.d | 13 +++ atusb/fw/board_atusb.d | 13 +++ atusb/fw/boot-atu2.d | 8 ++ atusb/fw/boot.d | 14 +++ atusb/fw/boot.elf | Bin 0 -> 36816 bytes atusb/fw/boot.hex | 259 +++++++++++++++++++++++++++++++++++++++++ atusb/fw/descr.d | 12 ++ atusb/fw/dfu.d | 11 ++ atusb/fw/dfu_common.d | 13 +++ atusb/fw/ep0.d | 20 ++++ atusb/fw/flash.d | 11 ++ atusb/fw/mac.c | 13 ++- atusb/fw/mac.d | 13 +++ atusb/fw/sernum.d | 11 ++ atusb/fw/spi.d | 8 ++ atusb/fw/usb.d | 8 ++ atusb/fw/version.c | 4 + atusb/fw/version.d | 5 + 25 files changed, 466 insertions(+), 4 deletions(-) create mode 100644 atusb/fw/.version create mode 100644 atusb/fw/app-atu2.d create mode 100755 atusb/fw/atusb.bin create mode 100644 atusb/fw/atusb.d create mode 100755 atusb/fw/atusb.dfu create mode 100755 atusb/fw/atusb.elf create mode 100644 atusb/fw/board.d create mode 100644 atusb/fw/board_app.d create mode 100644 atusb/fw/board_atusb.d create mode 100644 atusb/fw/boot-atu2.d create mode 100644 atusb/fw/boot.d create mode 100755 atusb/fw/boot.elf create mode 100644 atusb/fw/boot.hex create mode 100644 atusb/fw/descr.d create mode 100644 atusb/fw/dfu.d create mode 100644 atusb/fw/dfu_common.d create mode 100644 atusb/fw/ep0.d create mode 100644 atusb/fw/flash.d create mode 100644 atusb/fw/mac.d create mode 100644 atusb/fw/sernum.d create mode 100644 atusb/fw/spi.d create mode 100644 atusb/fw/usb.d create mode 100644 atusb/fw/version.c create mode 100644 atusb/fw/version.d diff --git a/atusb/fw/.version b/atusb/fw/.version new file mode 100644 index 0000000..6f4247a --- /dev/null +++ b/atusb/fw/.version @@ -0,0 +1 @@ +26 diff --git a/atusb/fw/app-atu2.d b/atusb/fw/app-atu2.d new file mode 100644 index 0000000..6a248fd --- /dev/null +++ b/atusb/fw/app-atu2.d @@ -0,0 +1,8 @@ +app-atu2.o: usb/atu2.c usb/usb.h board.h include/atusb/atusb.h board_atusb.h + +usb/atu2.c: +usb/usb.h: +board.h: +include/atusb/atusb.h: +board_atusb.h: + diff --git a/atusb/fw/atusb.bin b/atusb/fw/atusb.bin new file mode 100755 index 0000000000000000000000000000000000000000..5f3c76c20b9a71076a3c5b5dd27254d50e143fa7 GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/atusb/fw/atusb.d b/atusb/fw/atusb.d new file mode 100644 index 0000000..8ccacd3 --- /dev/null +++ b/atusb/fw/atusb.d @@ -0,0 +1,13 @@ +atusb.o: atusb.c usb/usb.h board.h include/atusb/atusb.h board_atusb.h \ + sernum.h spi.h include/atusb/ep0.h + +atusb.c: +usb/usb.h: +board.h: +include/atusb/atusb.h: +board_atusb.h: + +sernum.h: +spi.h: +include/atusb/ep0.h: + diff --git a/atusb/fw/atusb.dfu b/atusb/fw/atusb.dfu new file mode 100755 index 0000000000000000000000000000000000000000..77e203029cac8a291de0377dc6ba5333e47f9877 GIT binary patch literal 6552 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 z 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 IuUq>5C+-q^GXMYp literal 0 HcmV?d00001 diff --git a/atusb/fw/boot.hex b/atusb/fw/boot.hex new file mode 100644 index 0000000..10fa523 --- /dev/null +++ b/atusb/fw/boot.hex @@ -0,0 +1,259 @@ +:107000000C944C380C9469380C9469380C94693899 +:107010000C9469380C9469380C9469380C9469386C +:107020000C9469380C9469380C9469380C94DB3DE5 +:107030000C940D3E0C9469380C9469380C946938A2 +:107040000C9469380C9469380C9469380C9469383C +:107050000C9469380C9469380C9469380C9469382C +:107060000C9469380C9469380C9469380C9469381C +:107070000C9469380C9469380C9469380C9469380C +:107080000C9469380C9469380C9469380C946938FC +:107090000C9469380C94693811241FBECFEFD4E0EA +:1070A000DEBFCDBF11E0A0E0B1E0E6E9FFE702C03E +:1070B00005900D92A037B107D9F711E0A0E7B1E034 +:1070C00001C01D92AE3CB107E1F70E946B380C94F1 +:1070D000C93F0C940038DF93CF9300D0CDB7DEB713 +:1070E0001A8219820E944C3F0E94AB380E94893F4D +:1070F0000E948D3B81E085BF82E085BF789481E06E +:107100000E94C1382091620180E090E0A0E0B0E0F0 +:107110000FC080E090E0A0E0B0E002C02230D1F4E7 +:10712000E981FA81E491EF3FA1F30196A11DB11D20 +:107130008C3737EC93073CE0A30730E0B30771F7D7 +:1071400080E00E94C138F8940E94423FE0E0F0E005 +:107150000995FFCFFFCF14B817B81AB815B818B8EB +:107160001BB8269A3F9A249A0E94613F479885E06F +:10717000982F9A95F1F7479A8A95F1F70E947E3FEA +:107180000895882311F02E9A08952E980895F89462 +:1071900028EC30E02E9A88EE93E0F9013197F1F770 +:1071A0000197D9F72E9888EE93E0F9013197F1F71E +:1071B0000197D9F7EFCF80E090E041E2FC013E96E5 +:1071C00040935700E4919C01220F331F220F331F7D +:1071D000D90112965E2F52955F705A3010F4505DAF +:1071E00001C0595AA050BF4F5C932C5F3F4FEF70C6 +:1071F000EA3010F4E05D01C0E95AD901A050BF4F58 +:10720000EC9301968A309105C9F60895FA01D901E7 +:10721000833099F4662319F0613089F406C08AE25C +:1072200091E09183808384E005C080E091E09183C8 +:1072300080838AE28C9381E0089580E0089580E065 +:1072400008958093CE008091C80087FFFCCF809185 +:10725000CE000895599A08956623D9F01092CE0071 +:10726000262FFC0109C03091C80037FFFCCF3091B8 +:10727000CE0031931092CE002150A9F76150860FB5 +:10728000911D2091C80027FFFCCF2091CE00FC016A +:107290002083089510927001109271011092720172 +:1072A0001092730108959C0140E050E080917001BC +:1072B00090917101A0917201B0917301280F391F53 +:1072C0004A1F5B1F81E0213090E7390790E04907B2 +:1072D00090E0590708F080E008952F923F924F9276 +:1072E0005F926F927F928F929F92AF92BF92CF9256 +:1072F000DF92EF92FF920F931F93CF93DF93EB01F7 +:10730000A0907001B0907101C0907201D090730193 +:1073100090907401860175010894E11CF11C011D17 +:10732000111DA6019501DC013C01660E771E93E05C +:10733000892E5524539485E0482E44C0CA01B901D2 +:107340006F7770708070907061157105810591057F +:1073500039F4F90180925700E89507B600FCFDCF9B +:10736000C901817090706C91009769F0892D90E04F +:10737000362E222482299329F9010C0150925700BC +:10738000E895112401C0962EC801B7016F7770707F +:1073900080709070611571058105910549F4F701C0 +:1073A000E058F04040925700E89507B600FCFDCF4A +:1073B00011960894E11CF11C011D111D2F5F3F4F18 +:1073C0004F4F5F4FA615B70509F0B8CFCE01A0E02B +:1073D000B0E08A0D9B1DAC1DBD1D80937001909384 +:1073E0007101A0937201B093730190927401DF91C7 +:1073F000CF911F910F91FF90EF90DF90CF90BF90B2 +:10740000AF909F908F907F906F905F904F903F9044 +:107410002F9008958091700190917101A091720157 +:10742000B09173019C01AD012F77307040705070A6 +:10743000211531054105510549F0807825E0FC0111 +:1074400020935700E89507B600FCFDCF81E18093BB +:107450005700E8950895EF92FF920F931F93CF93F3 +:10746000DF93DC01E0907001F090710100917201F6 +:1074700010917301A801970108C0E491ED93615048 +:1074800070402F5F3F4F4F4F5F4FF901E901CE1919 +:10749000DF096115710541F0203080E8380780E090 +:1074A000480780E0580749F7209370013093710135 +:1074B0004093720150937301CE01DF91CF911F91E0 +:1074C0000F91FF90EF900895E0912E01F0912F0120 +:1074D000DC016D917C910480F581E02D88E791E0DD +:1074E000099508950895EF92FF920F931F93CF93FC +:1074F000DF93EC01398120E0888190E0822B932B8F +:1075000021E081329207A1F0E1E082329E072CF463 +:107510008132910509F0F3C0F6C0F2E0813A9F078D +:1075200009F47CC026E08132920709F0E8C0E1C08E +:1075300080916201823079F48A819B8190937601F7 +:1075400080937501E0912E01F0912F010190F0815F +:10755000E02D099503C0853009F0D7C08091620104 +:10756000823059F0809175019091760101972A81BE +:107570003B812817390709F4C6C02A813B818091D5 +:107580007501909176012817390709F074C00E80B3 +:10759000DF81C02DE0912E01F0912F01209759F449 +:1075A0000680F781E02D099582E08093620181E0F9 +:1075B00080937701ABC00280F381E02DCE01099565 +:1075C000882311F488E004C0C134D10528F08EE08E +:1075D00080935E0180E014C0D093B901C093B801DC +:1075E00083EC91E061E070E048E751E02C2F04E685 +:1075F0001AE338EBE32E31E0F32E0E94E93B81E001 +:1076000020917501309176012F5F3F4F30937601C5 +:107610002093750195E09093620178C0809162019A +:10762000823079F48A819B819093760180937501F1 +:10763000E0912E01F0912F010190F081E02D09954C +:1076400003C0893009F061C080916201823051F03D +:10765000809175019091760101972A813B812817CD +:10766000390749F02A813B8180917501909176011B +:107670002817390739F08AE0809362018EE0809301 +:107680005E0141C00E80DF81C02DC134D10520F0E4 +:107690008EE080935E0120C0E0912E01F0912F01D9 +:1076A0000084F185E02D88E791E0BE0109959C01F9 +:1076B0008C179D0720F482E08093620101C09E0137 +:1076C00083EC91E062E070E048E751E000E010E018 +:1076D000EE24FF240E94E93B809175019091760190 +:1076E0000196909376018093750189E08093620101 +:1076F0000AC082E08093620110925E0104C0CE0154 +:107700000E94A03B03C081E001C080E0DF91CF91E7 +:107710001F910F91FF90EF90089583E79AE3909364 +:10772000C2018093C1018AED9BE39093BC018093D9 +:10773000BB0182E79AE39093BE018093BD01089557 +:10774000EF92FF920F931F93FC01318120E0808123 +:1077500090E0822B932B24E08132920781F025E088 +:10776000813A920791F023E0813A9207E9F483ECA1 +:1077700091E062E070E04EE551E026E00DC082E06D +:107780008093620110925E010DC083EC91E062E093 +:1077900070E042E651E021E000E010E0EE24FF243A +:1077A0000E94E93B81E001C080E01F910F91FF90B2 +:1077B000EF900895813219F00E940639089584E609 +:1077C00091E0FA019183808389E0F901808381E06F +:1077D00008958F929F92AF92BF92CF92DF92EF92D5 +:1077E000FF920F931F93DF93CF930F92CDB7DEB726 +:1077F0004C015B016A01FC0180819181009721F0BD +:1078000029830E94C7382981F401B182A082D382E2 +:10781000C282C20ED11CD582C48210870783F28631 +:10782000E186C4010E94A93D0F90CF91DF911F9185 +:107830000F91FF90EF90DF90CF90BF90AF909F900F +:107840008F900895FF920F931F93DF93CF9300D0F3 +:107850000F92CDB7DEB7DC0111969C91119780E0B5 +:107860002C9130E0282B392B85E02030380709F4A3 +:1078700081C085E02130380714F581E020303807D9 +:1078800009F42EC181E0213038076CF4203831052D +:1078900009F451C0203831050CF419C123383105E1 +:1078A0000CF015C11FC181E0233038070CF41AC158 +:1078B000205033402330310508F009C113C188E05E +:1078C0002038380709F4ABC088E02138380784F441 +:1078D00086E0203838070CF4FAC086E022383807F2 +:1078E0000CF44DC087E02030380709F0F0C0FAC032 +:1078F0008AE02138380709F4F5C08AE022383807D1 +:1079000034F489E02030380709F0E1C0AFC08BE0E3 +:107910002130380731F08CE02238380709F0D7C021 +:10792000E1C020914E0130E0245B3E4F80E090E0CA +:10793000E5E5F1E0C8C016968D919C9117978230CD +:10794000910509F0CFC00DE611E08091C30190913F +:10795000C401009711F00E94C73882E090E0909334 +:10796000C4018093C3011093C6010093C5010E5F4B +:107970001F4F6BC012968C910E94913DB1C0129620 +:107980006C91129713968C91139716960D911C91EA +:107990001797813019F0823099F407C08AE391E09B +:1079A0009B838A8380913A0109C0662309F09AC0BB +:1079B0008CE491E09B838A8380914E01898311C07E +:1079C000E091BB01F091BC01309709F48BC0AE018E +:1079D0004E5F5F4F9E012F5F3F4F0995882309F44B +:1079E00081C0898190E00817190708F409830A818A +:1079F0001B81F9808091C3019091C401009711F01F +:107A00000E94C73882E090E09093C4018093C30144 +:107A10001093C6010093C5010F0D111D16C00FE68E +:107A200011E08091C3019091C401009711F00E9470 +:107A3000C73882E090E09093C4018093C301109313 +:107A4000C6010093C5010F5F1F4F1093C80100933B +:107A5000C7011092CB011092CA011092CD01109271 +:107A6000CC0183EC91E00E94A93D3AC020915101E4 +:107A700030E081E012964D915C91139742175307C5 +:107A800089F531C041814430D9F4628170E01496A7 +:107A90004D915C9115976417750789F4638170E0C7 +:107AA00012964D915C9113976417750741F4E0911C +:107AB000BF01F091C001309799F0099511C001966E +:107AC0004081E40FF11DE217F307E1F60BC0E091EE +:107AD000C101F091C201309729F0CD01099503C091 +:107AE00081E001C080E00F900F900F90CF91DF9167 +:107AF0001F910F91FF900895E1EFF0E02081308118 +:107B0000932F80E030E0282B392BC9010895809114 +:107B1000E80080FFFCCF8091E30080688093E30061 +:107B20000895EF92FF920F931F938093E30083ECED +:107B300091E062E070E040E050E020E007E81DE303 +:107B4000EE24FF240E94E93B1F910F91FF90EF90DC +:107B50000895FC01208131812230310569F4835C74 +:107B6000914063EA7BE80E94B73F8093E9008091EF +:107B7000F00081608093F00008951092E90089E0A0 +:107B80008093EB001092EC0080E38093ED008091F5 +:107B9000ED0082608093ED008091EE0087FFFCCFC6 +:107BA0008FE08093F0001092C4011092C30180E432 +:107BB0008093C90108951F920F920FB60F9211245E +:107BC0002F933F934F935F936F937F938F939F93E5 +:107BD000AF93BF93EF93FF938091E10083FF0CC0BD +:107BE000E091BD01F091BE01309709F009950E9426 +:107BF000BD3D87EF8093E100FF91EF91BF91AF9181 +:107C00009F918F917F916F915F914F913F912F91B4 +:107C10000F900FBE0F901F9018951F920F920FB6E6 +:107C20000F921124EF92FF920F931F932F933F9384 +:107C30004F935F936F937F938F939F93AF93BF9374 +:107C4000EF93FF93DF93CF93CDB7DEB72897DEBFD7 +:107C5000CDBF8091F40080FFFBC01092E9008091BD +:107C6000E80083FF3BC01092C4011092C3018091D1 +:107C7000F200883010F40E94C7388091F1008983A7 +:107C80008091F1008A830E947C3D9C838B830E94BB +:107C90007C3D9E838D830E947C3D98878F83CE019F +:107CA00001960E94223C882309F4BDC0898187FD8A +:107CB000C7C08091C3019091C401009709F0C0C072 +:107CC00083EC91E062E070E040E050E020E000E012 +:107CD00010E0EE24FF240E94E93BB2C08091E8004E +:107CE00082FF4EC08091C3019091C4018130910503 +:107CF00009F099C06091F200262F30E08091C70111 +:107D00009091C8014091C5015091C601841B950B0B +:107D1000821793070CF487C008C08091F10081930B +:107D2000F093C601E093C5016150E091C501F09167 +:107D3000C601662391F78091C7019091C801E817A9 +:107D4000F90709F081C01092C4011092C301E091BB +:107D5000CA01F091CB01309729F08091CC0190912C +:107D6000CD01099583EC91E062E070E040E050E0E5 +:107D700020E000E010E0EE24FF240E94E93B64C014 +:107D80008091E80081FF07C01092C4011092C301E6 +:107D90008DEF8093E8008091E80080FF59C08091CA +:107DA000C3019091C40182309105B9F58091C7015A +:107DB0002091C5019091C901821B981708F4892F61 +:107DC000982F0CC0E091C501F091C601219120933C +:107DD000F100F093C601E093C5019150992391F70A +:107DE0009091C901891721F01092C4011092C3012A +:107DF0008EEF8093E8008091C3019091C4010097B9 +:107E000039F5E091CA01F091CB01309709F18091E9 +:107E1000CC019091CD0109951BC08091F0008E7F1F +:107E20008093F00015C081EF8093E8001092C401A8 +:107E30001092C3018091EB0080628093EB0008C038 +:107E400087EF8093E8004ACF8BE78093E80098CFD4 +:107E50002896DEBFCDBFCF91DF91FF91EF91BF910B +:107E6000AF919F918F917F916F915F914F913F91D2 +:107E70002F911F910F91FF90EF900F900FBE0F90D9 +:107E80001F901895E0EEF0E080818160808380EDA6 +:107E900097E00197F1F7089514BEE0E6F0E08081E5 +:107EA0008061808380E18083E1E6F0E080E8808388 +:107EB00010820E94DB3808951092BA011092C90016 +:107EC0000895599A559A539A519A5298ECECF0E0C9 +:107ED0001182108280EC8093CA0088E18093C900EF +:107EE0001182108281E08093BA0108958091BA01D5 +:107EF000882311F40E94613F599808950E94763FAB +:107F000083EC0E94213984E00E9421390E942A39A1 +:107F100008958091D80080628093D80089B5837ECF +:107F200089BD89B5826089BD09B400FEFDCF80910D +:107F3000D8008F778093D8008091D8008068809394 +:107F4000D8008091D8008F7D8093D8008091E00088 +:107F50008E7F8093E00088E08093E2000E94BD3D28 +:107F6000089583E08093690081E08DBB08955527D3 +:107F7000002480FF02C0060E571F660F771F611591 +:107F8000710521F096958795009799F7952F802D8B +:067F90000895F894FFCFF4 +:107F96002A030000000000000000000000000000AE +:107FA60000000000000000000000000000000000CB +:107FB6000000000000000000000004030904300176 +:107FC6004A3953396D390A3A2B3A12010001FE003B +:107FD6000040B7204015010000000101090212000F +:107FE60001010080140904000000FE010200006483 +:107FF6000000020009210FFFFF4000010100000000 +:040000030000700089 +:00000001FF diff --git a/atusb/fw/descr.d b/atusb/fw/descr.d new file mode 100644 index 0000000..cccf24c --- /dev/null +++ b/atusb/fw/descr.d @@ -0,0 +1,12 @@ +descr.o: descr.c usb/usb.h usb/dfu.h usb/usb.h board.h \ + include/atusb/atusb.h board_atusb.h + +descr.c: +usb/usb.h: +usb/dfu.h: +usb/usb.h: +board.h: + +include/atusb/atusb.h: +board_atusb.h: + diff --git a/atusb/fw/dfu.d b/atusb/fw/dfu.d new file mode 100644 index 0000000..6e0954e --- /dev/null +++ b/atusb/fw/dfu.d @@ -0,0 +1,11 @@ +dfu.o: usb/dfu.c usb/usb.h usb/dfu.h board.h include/atusb/atusb.h \ + board_atusb.h + +usb/dfu.c: +usb/usb.h: +usb/dfu.h: +board.h: +include/atusb/atusb.h: + +board_atusb.h: + diff --git a/atusb/fw/dfu_common.d b/atusb/fw/dfu_common.d new file mode 100644 index 0000000..b3d986f --- /dev/null +++ b/atusb/fw/dfu_common.d @@ -0,0 +1,13 @@ +dfu_common.o: usb/dfu_common.c usb/usb.h usb/dfu.h board.h \ + include/atusb/atusb.h board_atusb.h usb/../sernum.h usb/../board.h + +usb/dfu_common.c: +usb/usb.h: +usb/dfu.h: +board.h: + +include/atusb/atusb.h: +board_atusb.h: +usb/../sernum.h: +usb/../board.h: + diff --git a/atusb/fw/ep0.d b/atusb/fw/ep0.d new file mode 100644 index 0000000..3c719ec --- /dev/null +++ b/atusb/fw/ep0.d @@ -0,0 +1,20 @@ +ep0.o: ep0.c usb/usb.h usb/dfu.h usb/usb.h include/at86rf230.h \ + include/atusb/ep0.h include/atusb/atusb.h version.h board.h \ + board_atusb.h sernum.h spi.h mac.h + +ep0.c: +usb/usb.h: +usb/dfu.h: +usb/usb.h: +include/at86rf230.h: + +include/atusb/ep0.h: +include/atusb/atusb.h: +version.h: +board.h: + +board_atusb.h: +sernum.h: +spi.h: +mac.h: + diff --git a/atusb/fw/flash.d b/atusb/fw/flash.d new file mode 100644 index 0000000..d8e5a90 --- /dev/null +++ b/atusb/fw/flash.d @@ -0,0 +1,11 @@ +flash.o: flash.c usb/dfu.h usb/usb.h board.h include/atusb/atusb.h \ + board_atusb.h + +flash.c: +usb/dfu.h: +usb/usb.h: +board.h: +include/atusb/atusb.h: + +board_atusb.h: + diff --git a/atusb/fw/mac.c b/atusb/fw/mac.c index 835002c..a520887 100644 --- a/atusb/fw/mac.c +++ b/atusb/fw/mac.c @@ -32,8 +32,8 @@ static uint8_t tx_buf[MAX_PSDU]; static uint8_t tx_size = 0; static bool txing = 0; static bool queued_tx_ack = 0; -static uint8_t next_seq, this_seq, queued_seq; - +static uint8_t next_seq, this_seq, queued_seq, queued_tx_trac; +static uint8_t data[2]; /* ----- Receive buffer management ----------------------------------------- */ @@ -65,7 +65,9 @@ static void usb_next(void) } if (queued_tx_ack) { - usb_send(&eps[1], &queued_seq, 1, tx_ack_done, NULL); + data[0] = queued_seq; + data[1] = reg_read(REG_TRX_STATE); + usb_send(&eps[1], data, 2, tx_ack_done, NULL); queued_tx_ack = 0; } } @@ -124,10 +126,13 @@ static bool handle_irq(void) if (txing) { if (eps[1].state == EP_IDLE) { - usb_send(&eps[1], &this_seq, 1, tx_ack_done, NULL); + data[0] = this_seq; + data[1] = reg_read(REG_TRX_STATE); + usb_send(&eps[1], data, 2, tx_ack_done, NULL); } else { queued_tx_ack = 1; queued_seq = this_seq; + queued_tx_trac = reg_read(REG_TRX_STATE); } txing = 0; return 1; diff --git a/atusb/fw/mac.d b/atusb/fw/mac.d new file mode 100644 index 0000000..aa43423 --- /dev/null +++ b/atusb/fw/mac.d @@ -0,0 +1,13 @@ +mac.o: mac.c usb/usb.h include/at86rf230.h spi.h board.h \ + include/atusb/atusb.h board_atusb.h mac.h + +mac.c: +usb/usb.h: +include/at86rf230.h: +spi.h: +board.h: + +include/atusb/atusb.h: +board_atusb.h: +mac.h: + diff --git a/atusb/fw/sernum.d b/atusb/fw/sernum.d new file mode 100644 index 0000000..8c04153 --- /dev/null +++ b/atusb/fw/sernum.d @@ -0,0 +1,11 @@ +sernum.o: sernum.c usb/usb.h board.h include/atusb/atusb.h board_atusb.h \ + sernum.h + +sernum.c: +usb/usb.h: +board.h: +include/atusb/atusb.h: +board_atusb.h: + +sernum.h: + diff --git a/atusb/fw/spi.d b/atusb/fw/spi.d new file mode 100644 index 0000000..fa0b3ef --- /dev/null +++ b/atusb/fw/spi.d @@ -0,0 +1,8 @@ +spi.o: spi.c board.h include/atusb/atusb.h board_atusb.h spi.h + +spi.c: +board.h: +include/atusb/atusb.h: +board_atusb.h: +spi.h: + diff --git a/atusb/fw/usb.d b/atusb/fw/usb.d new file mode 100644 index 0000000..e420d8e --- /dev/null +++ b/atusb/fw/usb.d @@ -0,0 +1,8 @@ +usb.o: usb/usb.c usb/usb.h board.h include/atusb/atusb.h board_atusb.h + +usb/usb.c: +usb/usb.h: +board.h: +include/atusb/atusb.h: +board_atusb.h: + diff --git a/atusb/fw/version.c b/atusb/fw/version.c new file mode 100644 index 0000000..f58413c --- /dev/null +++ b/atusb/fw/version.c @@ -0,0 +1,4 @@ +/* MACHINE-GENERATED. DO NOT EDIT ! */ +#include "version.h" +const char *build_date = "lun. 05 sept. 2022 05:10:00 CEST"; +const uint16_t build_number = 26; diff --git a/atusb/fw/version.d b/atusb/fw/version.d new file mode 100644 index 0000000..aafbf8c --- /dev/null +++ b/atusb/fw/version.d @@ -0,0 +1,5 @@ +version.o: version.c version.h + +version.c: +version.h: +