From edcc65c9980079f0bc4935080c7eec7960484845 Mon Sep 17 00:00:00 2001 From: whowechina Date: Sat, 16 Mar 2024 16:06:35 +0800 Subject: [PATCH] More friendly as a library --- Production/Firmware/aic_pico.uf2 | Bin 119296 -> 119808 bytes firmware/include/nfc.h | 2 ++ firmware/src/lib/nfc.c | 43 +++++++++++++++++-------------- firmware/src/lib/pn5180.c | 10 +------ firmware/src/lib/pn5180.h | 3 +-- firmware/src/lib/pn532.c | 8 +----- firmware/src/lib/pn532.h | 2 +- 7 files changed, 29 insertions(+), 39 deletions(-) diff --git a/Production/Firmware/aic_pico.uf2 b/Production/Firmware/aic_pico.uf2 index 476589bbf984f0cb0bc1f493126999770902212f..37d5ae20da89475a48edb249170cb889c26a26e8 100644 GIT binary patch delta 21735 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 Skhmk^S)gG#vfTNy>VE*okk}9a delta 21466 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�PuGhkAD}r{y6N z{0G>^ab|~bm}xftPW)s!T_AER6ZBl3V8@lTI9(b;xW8jX8U#qV6MtchcKi$Oqk@dl6L_p+JT}M>GT?Ip3a=%|x`En95BBE-s&m=(S~HGD zhdrgvL2rZj=mz?qB6o+3f~eb&z~T=2UNO5_j~P~Hj*FV{oj0zo>${kHB@8Mho+R9T zPb2hFO|!@~M<|KD+Y^GRnXbId*Z;>El0vvM=##K$+&dhsGleS?CuKcc7LCeGxl z8`rHAxx1+$()>U=_A$6vbvL~ra;+#VjO=-dy1V6!s#`))PSJ2K4HQ{tG;_vvebK-xlX> z#Z=|MV-&MGD!%_1UA%Bj0_24DNV3HTq-Xo(^1M};l_vr4f#Q3fv5V-S7+pFdOL zm16E1jqf;EYkybfu7WJ_jwk6d(Y2NCmBmgQP35B9&lNzQy=uL?sc|E>!L@2V=en`U z&8@jno;;Mni^NFxp5`rnRgqvKBkwbdqhsvvYpnooNvUrTm-(7 zrK5TB=U*b_pUCjuNBR~V`~>j4EAspqY4-kq0zFQXB4w9E6QL(7SiBM*LFNA:I- z5%$yxnWz4575{(B3^x(|{m_y<8LgK8AA(1r?f;}c!_&Yj?D;POj1Fb~E0IX+ew5~x zM`M$ru==k<_$d0;h^6In99=FheuQpWIPbPQxbmr7xuv{a8M55XC)?8lxuOP|}) z*3uS9eT@&DSr1wUii}B2f@^k#xbsNCSM4 zcUI>sR*pQD{ujuOX8`HhCy4&wlWadpCUpx&Yt}1#B#X7H+KGPdPUPe7iQT9K=mI>C z6@Ay!;rvgL&O$l`aPcXkXYc z*(`V^cK?bCWtJCpPt*A2boc<1VugcNgg+N67H93H&(rgwcQ3t6pI*~Gr=sm%epF3W z8%xFbXL!Qy^T34BRv}vU(JK19xN0ALRi8oVRCD$BUNZ4B4=L&KL@e-Zf(7=|=Ip{i zx+A?dC$z(cU66V$0E2k_9`Wt{v_f&ALi}w%Ez$4dReiMb4)V=Wt}M$lGv2vpd>WSI z(*#Lgp!M`M@tzlGDP1Zad4aCi`^>?Lua_$Dzujy+_mbo5r7=}R-3tk(JV4!ag81wK z+M>6R+-f47_w6;GAr-AOv4;H@-*@jGRDvzCBOOxQ4uN zuSIrURMfqg!09mUP_wQ5O7Yvn)I5F#JVh*{pgr3n)7QVQBxDFMSivO6O~Ia)^8wQW zCV1oo;BW%Dm#CzFc4_ZdtKRZWQ*yZ z=9qaiPKOzvPGEeDW~wu>$J{2?9HXyVDp@i#S7#q7R^y|+tsN>Tyt&WO%Urg-Pg%OS zr*U2*KGi74hw(A$qV8CN4PK#3>C587uh2DggE;&OE!3w}=eUa;xvu4_WKA*L#9v9M zdYo<^9o_zxpKK8E?c?+Y{TNR^jv^KKs#a04lP8lxB8a|M6YTOjT##=~!`)CaX;RN< zqQ87%vP{<36Bxch-7U{sv35PCuy5t*8_qf8t*&bl-+%g-_qR7DmS28F;`?{|65lVw zv7em&m3YU=UNCSnaFVprQ50Qp=#M?~AaG3DmaoEo`w9io7GCu(!V-`PC<816r~qLS z?DrP{ttM^9NIfQE3jx=UC;GL;Sm=)<`ko@9|GXUITP4vaUqbYcBJV!HHUKMU?=1E^ z5DH@Do3!k*y|^Gc8&C&e7eyQJbOD+H4*`Be9xC8}DZoOHeSaPO6L-Ezr-)@I5T?E^ zxsOh~NsH5Nw8w=OFTP2+@ju-Y&bc1Xnn;?BPfkSUNxtSL!C5Qo^cK=!QvdqL@mtBKP*~K&~sr5 z@5v~{%S7KFWh#O4$Cb>f7|o&*5w=Q??kup~1!4$;7EcCxK+M;o?u49=J5{ diff --git a/firmware/include/nfc.h b/firmware/include/nfc.h index 75fe55b..4f04110 100644 --- a/firmware/include/nfc.h +++ b/firmware/include/nfc.h @@ -35,6 +35,8 @@ typedef struct { /* should init or attach i2c and spi port before init */ void nfc_attach_i2c(i2c_inst_t *port); +void nfc_attach_spi(spi_inst_t *port, uint8_t rst, uint8_t nss, uint8_t busy); + void nfc_init_i2c(i2c_inst_t *port, uint8_t scl, uint8_t sda, uint32_t freq); void nfc_init_spi(spi_inst_t *port, uint8_t miso, uint8_t sck, uint8_t mosi, uint8_t rst, uint8_t nss, uint8_t busy); diff --git a/firmware/src/lib/nfc.c b/firmware/src/lib/nfc.c index cc8c64f..8e1c73d 100644 --- a/firmware/src/lib/nfc.c +++ b/firmware/src/lib/nfc.c @@ -74,9 +74,6 @@ struct { static struct { i2c_inst_t *port; - uint32_t freq; - uint8_t scl; - uint8_t sda; } i2c = {0}; void nfc_attach_i2c(i2c_inst_t *port) @@ -86,42 +83,48 @@ void nfc_attach_i2c(i2c_inst_t *port) void nfc_init_i2c(i2c_inst_t *port, uint8_t scl, uint8_t sda, uint32_t freq) { - i2c.port = port; - i2c.freq = freq; - i2c.scl = scl; - i2c.sda = sda; + i2c_init(port, freq); + gpio_set_function(scl, GPIO_FUNC_I2C); + gpio_set_function(sda, GPIO_FUNC_I2C); + gpio_pull_up(scl); + gpio_pull_up(sda); + + nfc_attach_i2c(port); } static struct { spi_inst_t *port; - uint8_t miso; - uint8_t sck; - uint8_t mosi; uint8_t rst; uint8_t nss; uint8_t busy; } spi = {0}; -void nfc_init_spi(spi_inst_t *port, uint8_t miso, uint8_t sck, uint8_t mosi, - uint8_t rst, uint8_t nss, uint8_t busy) +void nfc_attach_spi(spi_inst_t *port, uint8_t rst, uint8_t nss, uint8_t busy) { spi.port = port; - spi.miso = miso; - spi.sck = sck; - spi.mosi = mosi; spi.rst = rst; spi.nss = nss; spi.busy = busy; } +void nfc_init_spi(spi_inst_t *port, uint8_t miso, uint8_t sck, uint8_t mosi, + uint8_t rst, uint8_t nss, uint8_t busy) +{ + spi_init(port, 2000 * 1000); + spi_set_format(port, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST); + + gpio_set_function(miso, GPIO_FUNC_SPI); + gpio_set_function(sck, GPIO_FUNC_SPI); + gpio_set_function(mosi, GPIO_FUNC_SPI); + + nfc_attach_spi(port, rst, nss, busy); +} + void nfc_init() { - if (i2c.port && - pn532_init(i2c.port, i2c.scl, i2c.sda, i2c.freq)) { + if (i2c.port && pn532_init(i2c.port)) { nfc_module = NFC_MODULE_PN532; - } else if (spi.port && - pn5180_init(spi.port, spi.miso, spi.sck, spi.mosi, - spi.rst, spi.nss, spi.busy)) { + } else if (spi.port && pn5180_init(spi.port, spi.rst, spi.nss, spi.busy)) { nfc_module = NFC_MODULE_PN5180; } } diff --git a/firmware/src/lib/pn5180.c b/firmware/src/lib/pn5180.c index a3b2905..e83ca32 100644 --- a/firmware/src/lib/pn5180.c +++ b/firmware/src/lib/pn5180.c @@ -35,16 +35,8 @@ static uint8_t gpio_rst; static uint8_t gpio_nss; static uint8_t gpio_busy; -bool pn5180_init(spi_inst_t *port, uint8_t miso, uint8_t sck, uint8_t mosi, - uint8_t rst, uint8_t nss, uint8_t busy) +bool pn5180_init(spi_inst_t *port, uint8_t rst, uint8_t nss, uint8_t busy) { - spi_init(port, 2000 * 1000); - spi_set_format(port, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST); - - gpio_set_function(miso, GPIO_FUNC_SPI); - gpio_set_function(sck, GPIO_FUNC_SPI); - gpio_set_function(mosi, GPIO_FUNC_SPI); - gpio_init(nss); gpio_set_dir(nss, GPIO_OUT); gpio_pull_up(nss); diff --git a/firmware/src/lib/pn5180.h b/firmware/src/lib/pn5180.h index 97ae70f..3b44565 100644 --- a/firmware/src/lib/pn5180.h +++ b/firmware/src/lib/pn5180.h @@ -23,8 +23,7 @@ typedef void (*pn5180_wait_loop_t)(); void pn5180_set_wait_loop(pn5180_wait_loop_t loop); -bool pn5180_init(spi_inst_t *port, uint8_t miso, uint8_t sck, uint8_t mosi, - uint8_t rst, uint8_t nss, uint8_t busy); +bool pn5180_init(spi_inst_t *port, uint8_t rst, uint8_t nss, uint8_t busy); void pn5180_write_reg(uint8_t reg, uint32_t v32); void pn5180_or_reg(uint8_t reg, uint32_t mask); diff --git a/firmware/src/lib/pn532.c b/firmware/src/lib/pn532.c index 9b27417..f6ade15 100644 --- a/firmware/src/lib/pn532.c +++ b/firmware/src/lib/pn532.c @@ -26,14 +26,8 @@ static i2c_inst_t *i2c_port = i2c0; -bool pn532_init(i2c_inst_t *i2c, uint8_t scl, uint8_t sda, uint32_t freq) +bool pn532_init(i2c_inst_t *i2c) { - i2c_init(i2c, freq); - gpio_set_function(scl, GPIO_FUNC_I2C); - gpio_set_function(sda, GPIO_FUNC_I2C); - gpio_pull_up(scl); - gpio_pull_up(sda); - i2c_port = i2c; uint32_t ver = pn532_firmware_ver(); diff --git a/firmware/src/lib/pn532.h b/firmware/src/lib/pn532.h index 853a7aa..4feb285 100644 --- a/firmware/src/lib/pn532.h +++ b/firmware/src/lib/pn532.h @@ -14,7 +14,7 @@ typedef void (*pn532_wait_loop_t)(); void pn532_set_wait_loop(pn532_wait_loop_t loop); -bool pn532_init(i2c_inst_t *i2c_port, uint8_t scl, uint8_t sda, uint32_t freq); +bool pn532_init(i2c_inst_t *i2c); int pn532_write_command(uint8_t cmd, const uint8_t *param, uint8_t len); int pn532_read_response(uint8_t cmd, uint8_t *resp, uint8_t len);