Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers pn512_registers.c Source File

pn512_registers.c

Go to the documentation of this file.
00001 
00002 /*
00003  * Copyright (c) 2013-2018, ARM Limited, All Rights Reserved
00004  * SPDX-License-Identifier: Apache-2.0
00005  *
00006  * Licensed under the Apache License, Version 2.0 (the "License"); you may
00007  * not use this file except in compliance with the License.
00008  * You may obtain a copy of the License at
00009  *
00010  * http://www.apache.org/licenses/LICENSE-2.0
00011  *
00012  * Unless required by applicable law or agreed to in writing, software
00013  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
00014  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00015  * See the License for the specific language governing permissions and
00016  * limitations under the License.
00017  */
00018 /**
00019  * \file pn512_registers.c
00020  * \copyright Copyright (c) ARM Ltd 2013
00021  * \author Donatien Garnier
00022  * \details Access to PN512 registers
00023  */
00024 
00025 
00026 #define __DEBUG__ 0
00027 #ifndef __MODULE__
00028 #define __MODULE__ "pn512_registers.c"
00029 #endif
00030 #include "stack/nfc_errors.h"
00031 
00032 #include "pn512_registers.h"
00033 #include "pn512_hw.h"
00034 #include "pn512.h"
00035 
00036 #define REGISTER_PAGE(x) ((x)>>4)
00037 #define REGISTER_ADDR(x) ((x)&0xF)
00038 
00039 /** \addtogroup PN512
00040  *  \internal
00041  *  @{
00042  *  \name Registers
00043  *  @{
00044  */
00045 
00046 static void pn512_register_switch_page_intl(pn512_t *pPN512, uint8_t page);
00047 
00048 /** \internal Initialize underlying pn512_registers_t structure
00049  * \param pPN512 pointer to pn512_t structure
00050  */
00051 void pn512_registers_init(pn512_t *pPN512)
00052 {
00053     pPN512->registers.registers_page = 0;
00054 }
00055 
00056 #define PN512_CFG_INIT_LEN 9
00057 static const uint8_t PN512_CFG_INIT_REGS[] = {
00058     PN512_REG_DIVIEN,
00059     PN512_REG_MODE,
00060     PN512_REG_GSNOFF,
00061     PN512_REG_RFCFG,
00062     PN512_REG_CWGSP,
00063     PN512_REG_MIFNFC,
00064     PN512_REG_FELNFC2,
00065     PN512_REG_RXSEL,
00066     PN512_REG_TYPEB
00067 };
00068 static const uint8_t PN512_CFG_INIT_VALS[] = {
00069     0x80,
00070     0x3F,
00071     0xF2,
00072     0x68,
00073     0x3F,
00074     0x62,
00075     0x80,
00076     0x84,
00077     0x00
00078 }; //Timer: For now max prescaler, max reload value
00079 
00080 /** \internal Switch to known (0) registers page, reset registers state
00081  * \param pPN512 pointer to pn512_t structure
00082  */
00083 void pn512_registers_reset(pn512_t *pPN512)
00084 {
00085     pn512_register_switch_page_intl(pPN512, 0);
00086     for (int i = 0; i < PN512_CFG_INIT_LEN; i++) {
00087         pn512_register_write(pPN512, PN512_CFG_INIT_REGS[i], PN512_CFG_INIT_VALS[i]);
00088     }
00089 }
00090 
00091 /** \internal Write register
00092  * \param pPN512 pointer to pn512_t structure
00093  * \param address register address
00094  * \param data value to write in register
00095  */
00096 void pn512_register_write(pn512_t *pPN512, uint8_t address, uint8_t data)
00097 {
00098     NFC_DBG("Write [%02x] << %02x", address, data);
00099     if (REGISTER_PAGE(address) != pPN512->registers.registers_page) {
00100         pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address));
00101     }
00102     address = REGISTER_ADDR(address);
00103     pn512_hw_write(pPN512, address, &data, 1);
00104 }
00105 
00106 /** \internal Read register
00107  * \param pPN512 pointer to pn512_t structure
00108  * \param address register address
00109  * \return data value read from register
00110  */
00111 uint8_t pn512_register_read(pn512_t *pPN512, uint8_t address)
00112 {
00113     uint8_t data;
00114     NFC_DBG_BLOCK(
00115         uint8_t __dbg_addr;
00116         __dbg_addr = address; //FIXME
00117     )
00118     if (REGISTER_PAGE(address) != pPN512->registers.registers_page) {
00119         pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address));
00120     }
00121     address = REGISTER_ADDR(address);
00122     pn512_hw_read(pPN512, address, &data, 1);
00123     NFC_DBG("Read  [%02x] >> %02x", __dbg_addr, data);
00124     return data;
00125 }
00126 
00127 void pn512_register_switch_page(pn512_t *pPN512, uint8_t address)
00128 {
00129     if (REGISTER_PAGE(address) != pPN512->registers.registers_page) {
00130         pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address));
00131     }
00132 }
00133 
00134 /** \internal Switch registers page
00135  * \param pPN512 pointer to pn512_t structure
00136  * \param page registers page
00137  */
00138 void pn512_register_switch_page_intl(pn512_t *pPN512, uint8_t page)
00139 {
00140     uint8_t pageRegValue;
00141     pageRegValue = (1 << 7) | page;
00142 
00143     pn512_hw_write(pPN512, PN512_REG_PAGE, &pageRegValue, 1);
00144 
00145     pPN512->registers.registers_page = page;
00146 }
00147 
00148 
00149 
00150 /**
00151  * @}
00152  * @}
00153  * */