Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
USB_Host/macros.h@0:b1ce54272580, 2020-01-18 (annotated)
- Committer:
- kotakku
- Date:
- Sat Jan 18 15:06:35 2020 +0000
- Revision:
- 0:b1ce54272580
1.0.0 first commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kotakku | 0:b1ce54272580 | 1 | /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. |
| kotakku | 0:b1ce54272580 | 2 | |
| kotakku | 0:b1ce54272580 | 3 | This program is free software; you can redistribute it and/or modify |
| kotakku | 0:b1ce54272580 | 4 | it under the terms of the GNU General Public License as published by |
| kotakku | 0:b1ce54272580 | 5 | the Free Software Foundation; either version 2 of the License, or |
| kotakku | 0:b1ce54272580 | 6 | (at your option) any later version. |
| kotakku | 0:b1ce54272580 | 7 | |
| kotakku | 0:b1ce54272580 | 8 | This program is distributed in the hope that it will be useful, |
| kotakku | 0:b1ce54272580 | 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| kotakku | 0:b1ce54272580 | 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| kotakku | 0:b1ce54272580 | 11 | GNU General Public License for more details. |
| kotakku | 0:b1ce54272580 | 12 | |
| kotakku | 0:b1ce54272580 | 13 | You should have received a copy of the GNU General Public License |
| kotakku | 0:b1ce54272580 | 14 | along with this program; if not, write to the Free Software |
| kotakku | 0:b1ce54272580 | 15 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| kotakku | 0:b1ce54272580 | 16 | |
| kotakku | 0:b1ce54272580 | 17 | Contact information |
| kotakku | 0:b1ce54272580 | 18 | ------------------- |
| kotakku | 0:b1ce54272580 | 19 | |
| kotakku | 0:b1ce54272580 | 20 | Circuits At Home, LTD |
| kotakku | 0:b1ce54272580 | 21 | Web : http://www.circuitsathome.com |
| kotakku | 0:b1ce54272580 | 22 | e-mail : support@circuitsathome.com |
| kotakku | 0:b1ce54272580 | 23 | */ |
| kotakku | 0:b1ce54272580 | 24 | |
| kotakku | 0:b1ce54272580 | 25 | #if !defined(_usb_h_) || defined(MACROS_H) |
| kotakku | 0:b1ce54272580 | 26 | #error "Never include macros.h directly; include Usb.h instead" |
| kotakku | 0:b1ce54272580 | 27 | #else |
| kotakku | 0:b1ce54272580 | 28 | #define MACROS_H |
| kotakku | 0:b1ce54272580 | 29 | |
| kotakku | 0:b1ce54272580 | 30 | //////////////////////////////////////////////////////////////////////////////// |
| kotakku | 0:b1ce54272580 | 31 | // HANDY MACROS |
| kotakku | 0:b1ce54272580 | 32 | //////////////////////////////////////////////////////////////////////////////// |
| kotakku | 0:b1ce54272580 | 33 | |
| kotakku | 0:b1ce54272580 | 34 | #define VALUE_BETWEEN(v,l,h) (((v)>(l)) && ((v)<(h))) |
| kotakku | 0:b1ce54272580 | 35 | #define VALUE_WITHIN(v,l,h) (((v)>=(l)) && ((v)<=(h))) |
| kotakku | 0:b1ce54272580 | 36 | #define output_pgm_message(wa,fp,mp,el) wa = &mp, fp((char *)pgm_read_pointer(wa), el) |
| kotakku | 0:b1ce54272580 | 37 | #define output_if_between(v,l,h,wa,fp,mp,el) if(VALUE_BETWEEN(v,l,h)) output_pgm_message(wa,fp,mp[v-(l+1)],el); |
| kotakku | 0:b1ce54272580 | 38 | |
| kotakku | 0:b1ce54272580 | 39 | #define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b))) |
| kotakku | 0:b1ce54272580 | 40 | #ifndef __BYTE_GRABBING_DEFINED__ |
| kotakku | 0:b1ce54272580 | 41 | #define __BYTE_GRABBING_DEFINED__ 1 |
| kotakku | 0:b1ce54272580 | 42 | #ifdef BROKEN_OPTIMIZER_LITTLE_ENDIAN |
| kotakku | 0:b1ce54272580 | 43 | // Note: Use this if your compiler generates horrible assembler! |
| kotakku | 0:b1ce54272580 | 44 | #define BGRAB0(__usi__) (((uint8_t *)&(__usi__))[0]) |
| kotakku | 0:b1ce54272580 | 45 | #define BGRAB1(__usi__) (((uint8_t *)&(__usi__))[1]) |
| kotakku | 0:b1ce54272580 | 46 | #define BGRAB2(__usi__) (((uint8_t *)&(__usi__))[2]) |
| kotakku | 0:b1ce54272580 | 47 | #define BGRAB3(__usi__) (((uint8_t *)&(__usi__))[3]) |
| kotakku | 0:b1ce54272580 | 48 | #define BGRAB4(__usi__) (((uint8_t *)&(__usi__))[4]) |
| kotakku | 0:b1ce54272580 | 49 | #define BGRAB5(__usi__) (((uint8_t *)&(__usi__))[5]) |
| kotakku | 0:b1ce54272580 | 50 | #define BGRAB6(__usi__) (((uint8_t *)&(__usi__))[6]) |
| kotakku | 0:b1ce54272580 | 51 | #define BGRAB7(__usi__) (((uint8_t *)&(__usi__))[7]) |
| kotakku | 0:b1ce54272580 | 52 | #else |
| kotakku | 0:b1ce54272580 | 53 | // Note: The cast alone to uint8_t is actually enough. |
| kotakku | 0:b1ce54272580 | 54 | // GCC throws out the "& 0xff", and the size is no different. |
| kotakku | 0:b1ce54272580 | 55 | // Some compilers need it. |
| kotakku | 0:b1ce54272580 | 56 | #define BGRAB0(__usi__) ((uint8_t)((__usi__) & 0xff )) |
| kotakku | 0:b1ce54272580 | 57 | #define BGRAB1(__usi__) ((uint8_t)(((__usi__) >> 8) & 0xff)) |
| kotakku | 0:b1ce54272580 | 58 | #define BGRAB2(__usi__) ((uint8_t)(((__usi__) >> 16) & 0xff)) |
| kotakku | 0:b1ce54272580 | 59 | #define BGRAB3(__usi__) ((uint8_t)(((__usi__) >> 24) & 0xff)) |
| kotakku | 0:b1ce54272580 | 60 | #define BGRAB4(__usi__) ((uint8_t)(((__usi__) >> 32) & 0xff)) |
| kotakku | 0:b1ce54272580 | 61 | #define BGRAB5(__usi__) ((uint8_t)(((__usi__) >> 40) & 0xff)) |
| kotakku | 0:b1ce54272580 | 62 | #define BGRAB6(__usi__) ((uint8_t)(((__usi__) >> 48) & 0xff)) |
| kotakku | 0:b1ce54272580 | 63 | #define BGRAB7(__usi__) ((uint8_t)(((__usi__) >> 56) & 0xff)) |
| kotakku | 0:b1ce54272580 | 64 | #endif |
| kotakku | 0:b1ce54272580 | 65 | #define BOVER1(__usi__) ((uint16_t)(__usi__) << 8) |
| kotakku | 0:b1ce54272580 | 66 | #define BOVER2(__usi__) ((uint32_t)(__usi__) << 16) |
| kotakku | 0:b1ce54272580 | 67 | #define BOVER3(__usi__) ((uint32_t)(__usi__) << 24) |
| kotakku | 0:b1ce54272580 | 68 | #define BOVER4(__usi__) ((uint64_t)(__usi__) << 32) |
| kotakku | 0:b1ce54272580 | 69 | #define BOVER5(__usi__) ((uint64_t)(__usi__) << 40) |
| kotakku | 0:b1ce54272580 | 70 | #define BOVER6(__usi__) ((uint64_t)(__usi__) << 48) |
| kotakku | 0:b1ce54272580 | 71 | #define BOVER7(__usi__) ((uint64_t)(__usi__) << 56) |
| kotakku | 0:b1ce54272580 | 72 | |
| kotakku | 0:b1ce54272580 | 73 | // These are the smallest and fastest ways I have found so far in pure C/C++. |
| kotakku | 0:b1ce54272580 | 74 | #define BMAKE16(__usc1__,__usc0__) ((uint16_t)((uint16_t)(__usc0__) | (uint16_t)BOVER1(__usc1__))) |
| kotakku | 0:b1ce54272580 | 75 | #define BMAKE32(__usc3__,__usc2__,__usc1__,__usc0__) ((uint32_t)((uint32_t)(__usc0__) | (uint32_t)BOVER1(__usc1__) | (uint32_t)BOVER2(__usc2__) | (uint32_t)BOVER3(__usc3__))) |
| kotakku | 0:b1ce54272580 | 76 | #define BMAKE64(__usc7__,__usc6__,__usc5__,__usc4__,__usc3__,__usc2__,__usc1__,__usc0__) ((uint64_t)((uint64_t)__usc0__ | (uint64_t)BOVER1(__usc1__) | (uint64_t)BOVER2(__usc2__) | (uint64_t)BOVER3(__usc3__) | (uint64_t)BOVER4(__usc4__) | (uint64_t)BOVER5(__usc5__) | (uint64_t)BOVER6(__usc6__) | (uint64_t)BOVER1(__usc7__))) |
| kotakku | 0:b1ce54272580 | 77 | #endif |
| kotakku | 0:b1ce54272580 | 78 | |
| kotakku | 0:b1ce54272580 | 79 | /* |
| kotakku | 0:b1ce54272580 | 80 | * Debug macros: Strings are stored in progmem (flash) instead of RAM. |
| kotakku | 0:b1ce54272580 | 81 | */ |
| kotakku | 0:b1ce54272580 | 82 | #define USBTRACE(s) (Notify(PSTR(s), 0x80)) |
| kotakku | 0:b1ce54272580 | 83 | #define USBTRACE1(s,l) (Notify(PSTR(s), l)) |
| kotakku | 0:b1ce54272580 | 84 | #define USBTRACE2(s,r) (Notify(PSTR(s), 0x80), D_PrintHex((r), 0x80), Notify(PSTR("\r\n"), 0x80)) |
| kotakku | 0:b1ce54272580 | 85 | #define USBTRACE3(s,r,l) (Notify(PSTR(s), l), D_PrintHex((r), l), Notify(PSTR("\r\n"), l)) |
| kotakku | 0:b1ce54272580 | 86 | |
| kotakku | 0:b1ce54272580 | 87 | |
| kotakku | 0:b1ce54272580 | 88 | #endif /* MACROS_H */ |
| kotakku | 0:b1ce54272580 | 89 | |
| kotakku | 0:b1ce54272580 | 90 |