ZG2100 Network interface source

Committer:
donatien
Date:
Fri Aug 06 10:46:03 2010 +0000
Revision:
4:e00281c7453d
Parent:
1:3a7c15057192

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:b802fc31f1db 1
donatien 0:b802fc31f1db 2 /*
donatien 0:b802fc31f1db 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
donatien 0:b802fc31f1db 4
donatien 0:b802fc31f1db 5 Permission is hereby granted, free of charge, to any person obtaining a copy
donatien 0:b802fc31f1db 6 of this software and associated documentation files (the "Software"), to deal
donatien 0:b802fc31f1db 7 in the Software without restriction, including without limitation the rights
donatien 0:b802fc31f1db 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
donatien 0:b802fc31f1db 9 copies of the Software, and to permit persons to whom the Software is
donatien 0:b802fc31f1db 10 furnished to do so, subject to the following conditions:
donatien 0:b802fc31f1db 11
donatien 0:b802fc31f1db 12 The above copyright notice and this permission notice shall be included in
donatien 0:b802fc31f1db 13 all copies or substantial portions of the Software.
donatien 0:b802fc31f1db 14
donatien 0:b802fc31f1db 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:b802fc31f1db 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:b802fc31f1db 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:b802fc31f1db 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:b802fc31f1db 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:b802fc31f1db 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
donatien 0:b802fc31f1db 21 THE SOFTWARE.
donatien 0:b802fc31f1db 22 */
donatien 0:b802fc31f1db 23
donatien 0:b802fc31f1db 24 #include "netCfg.h"
donatien 0:b802fc31f1db 25 #if NET_ZG2100
donatien 0:b802fc31f1db 26
donatien 0:b802fc31f1db 27 #include "zg_defs.h"
donatien 0:b802fc31f1db 28 #include "zg_com.h"
donatien 0:b802fc31f1db 29
donatien 0:b802fc31f1db 30 #include "mbed.h" //For SPI, DigitalOut & InterruptIn
donatien 0:b802fc31f1db 31
donatien 0:b802fc31f1db 32 //#define __DEBUG
donatien 0:b802fc31f1db 33 #include "dbg/dbg.h"
donatien 0:b802fc31f1db 34
donatien 0:b802fc31f1db 35 #define ZG_CMD_BUF_SIZE 16
donatien 0:b802fc31f1db 36
donatien 0:b802fc31f1db 37 //Locals
donatien 0:b802fc31f1db 38 static SPI* m_pSpi;
donatien 0:b802fc31f1db 39 static DigitalOut* m_pCs;
donatien 1:3a7c15057192 40 //static InterruptIn* m_pInt;
donatien 1:3a7c15057192 41 static DigitalIn* m_pInt;
donatien 0:b802fc31f1db 42
donatien 0:b802fc31f1db 43 static byte cmd[ZG_CMD_BUF_SIZE] ZG_MEM;
donatien 0:b802fc31f1db 44
donatien 0:b802fc31f1db 45 //Functions
donatien 0:b802fc31f1db 46
donatien 1:3a7c15057192 47 void zg_com_init(SPI* pSpi, DigitalOut* pCs, /*InterruptIn**/ DigitalIn* pInt, DigitalOut* pNrst)
donatien 0:b802fc31f1db 48 {
donatien 0:b802fc31f1db 49 m_pSpi = pSpi;
donatien 0:b802fc31f1db 50 m_pCs = pCs;
donatien 0:b802fc31f1db 51 m_pInt = pInt;
donatien 0:b802fc31f1db 52 m_pCs->write(ZG_SPI_CS_OFF); //Do no select chip for now
donatien 0:b802fc31f1db 53 m_pSpi->format(8,0); //8 bits / word, Mode 0
donatien 0:b802fc31f1db 54 //m_pSpi->frequency(1000000); //1Mhz - FMax is 25MHz
donatien 0:b802fc31f1db 55 m_pSpi->frequency(20000000); //20Mhz - FMax is 25MHz
donatien 0:b802fc31f1db 56 //Reset chip
donatien 0:b802fc31f1db 57 pNrst->write(ZG_SPI_RST_ON);
donatien 0:b802fc31f1db 58 wait_ms(100);
donatien 0:b802fc31f1db 59 //And release
donatien 0:b802fc31f1db 60 pNrst->write(ZG_SPI_RST_OFF);
donatien 1:3a7c15057192 61 // m_pInt->fall(zg_on_int); //Attach on interrupt callback
donatien 0:b802fc31f1db 62 }
donatien 0:b802fc31f1db 63
donatien 0:b802fc31f1db 64
donatien 0:b802fc31f1db 65 //Registers Access
donatien 0:b802fc31f1db 66
donatien 0:b802fc31f1db 67 uint32_t zg_register_read(uint32_t addr)
donatien 0:b802fc31f1db 68 {
donatien 0:b802fc31f1db 69 int len;
donatien 0:b802fc31f1db 70 uint32_t res;
donatien 0:b802fc31f1db 71
donatien 0:b802fc31f1db 72 len = ZG_REG_LEN( addr );
donatien 0:b802fc31f1db 73 cmd[0] = (byte)(ZG_CMD_REG_RD | addr);
donatien 0:b802fc31f1db 74 memset( &cmd[1], 0, len );
donatien 0:b802fc31f1db 75
donatien 0:b802fc31f1db 76 zg_spi_trf(cmd, len + 1);
donatien 0:b802fc31f1db 77
donatien 0:b802fc31f1db 78 if(len==1)
donatien 0:b802fc31f1db 79 {
donatien 0:b802fc31f1db 80 res = cmd[1];
donatien 0:b802fc31f1db 81 }
donatien 0:b802fc31f1db 82 else //if(len == 2)
donatien 0:b802fc31f1db 83 {
donatien 0:b802fc31f1db 84 res = (uint16_t) DTOHS( *((uint16_t*)&cmd[1]) );
donatien 0:b802fc31f1db 85 }
donatien 0:b802fc31f1db 86
donatien 0:b802fc31f1db 87 return res;
donatien 0:b802fc31f1db 88 }
donatien 0:b802fc31f1db 89
donatien 0:b802fc31f1db 90 void zg_register_write(uint32_t addr, uint32_t reg)
donatien 0:b802fc31f1db 91 {
donatien 0:b802fc31f1db 92 int len;
donatien 0:b802fc31f1db 93
donatien 0:b802fc31f1db 94 len = ZG_REG_LEN( addr );
donatien 0:b802fc31f1db 95 cmd[0] = (byte)(ZG_CMD_REG_WR | addr);
donatien 0:b802fc31f1db 96
donatien 0:b802fc31f1db 97 if(len==1)
donatien 0:b802fc31f1db 98 {
donatien 0:b802fc31f1db 99 cmd[1] = reg;
donatien 0:b802fc31f1db 100 }
donatien 0:b802fc31f1db 101 else //if(len == 2)
donatien 0:b802fc31f1db 102 {
donatien 0:b802fc31f1db 103 *((uint16_t*)&cmd[1]) = HTODS( reg );
donatien 0:b802fc31f1db 104 }
donatien 0:b802fc31f1db 105
donatien 0:b802fc31f1db 106 zg_spi_trf(cmd, len + 1);
donatien 0:b802fc31f1db 107 }
donatien 0:b802fc31f1db 108
donatien 0:b802fc31f1db 109 //Indexed Registers Access
donatien 0:b802fc31f1db 110
donatien 0:b802fc31f1db 111 uint32_t zg_indexed_register_read(uint32_t addr)
donatien 0:b802fc31f1db 112 {
donatien 0:b802fc31f1db 113 zg_register_write( ZG_REG_IREG_ADDR, addr );
donatien 0:b802fc31f1db 114 return zg_register_read( ZG_REG_IREG_DATA );
donatien 0:b802fc31f1db 115 }
donatien 0:b802fc31f1db 116
donatien 0:b802fc31f1db 117 void zg_indexed_register_write(uint32_t addr, uint32_t reg)
donatien 0:b802fc31f1db 118 {
donatien 0:b802fc31f1db 119 zg_register_write( ZG_REG_IREG_ADDR, addr );
donatien 0:b802fc31f1db 120 zg_register_write( ZG_REG_IREG_DATA, reg );
donatien 0:b802fc31f1db 121 }
donatien 0:b802fc31f1db 122
donatien 0:b802fc31f1db 123 //Fifos
donatien 0:b802fc31f1db 124
donatien 0:b802fc31f1db 125 void zg_fifo_read( byte fifo, byte* pType, byte* pSubtype, byte* buf, int len )
donatien 0:b802fc31f1db 126 {
donatien 0:b802fc31f1db 127 cmd[0] = (fifo==ZG_FIFO_DATA)?ZG_CMD_FIFO_RD_DATA:ZG_CMD_FIFO_RD_MGMT;
donatien 0:b802fc31f1db 128 memset( &cmd[1], 0, 2 );
donatien 1:3a7c15057192 129 zg_spi_trf(cmd, 3, false, ZG_SPI_TRF); //false : Command not terminated yet
donatien 0:b802fc31f1db 130 *pType = cmd[1];
donatien 0:b802fc31f1db 131 *pSubtype = cmd[2];
donatien 0:b802fc31f1db 132
donatien 1:3a7c15057192 133 //memset(buf, 0, len);
donatien 1:3a7c15057192 134 zg_spi_trf(buf, len, true, ZG_SPI_READ);
donatien 0:b802fc31f1db 135
donatien 0:b802fc31f1db 136 cmd[0] = ZG_CMD_FIFO_RD_DONE;
donatien 1:3a7c15057192 137 zg_spi_trf(cmd, 1, true, ZG_SPI_WRITE);
donatien 0:b802fc31f1db 138 }
donatien 0:b802fc31f1db 139
donatien 0:b802fc31f1db 140 void zg_fifo_write( byte fifo, byte type, byte subtype, byte* buf, int len, bool start /*= true*/, bool stop /*= true*/ )
donatien 0:b802fc31f1db 141 {
donatien 0:b802fc31f1db 142 if(start)
donatien 0:b802fc31f1db 143 {
donatien 0:b802fc31f1db 144 cmd[0] = (fifo==ZG_FIFO_DATA)?ZG_CMD_FIFO_WR_DATA:ZG_CMD_FIFO_WR_MGMT;
donatien 0:b802fc31f1db 145 cmd[1] = type;
donatien 0:b802fc31f1db 146 cmd[2] = subtype;
donatien 1:3a7c15057192 147 zg_spi_trf(cmd, 3, false, ZG_SPI_WRITE); //false : Command not terminated yet
donatien 0:b802fc31f1db 148 }
donatien 0:b802fc31f1db 149
donatien 0:b802fc31f1db 150 /*if(len>0 && buf!=NULL)
donatien 0:b802fc31f1db 151 {*/
donatien 1:3a7c15057192 152 zg_spi_trf(buf, len, stop, ZG_SPI_WRITE);
donatien 0:b802fc31f1db 153 /*}*/
donatien 0:b802fc31f1db 154
donatien 0:b802fc31f1db 155 if(stop)
donatien 0:b802fc31f1db 156 {
donatien 0:b802fc31f1db 157 cmd[0] = ZG_CMD_FIFO_WR_DONE;
donatien 1:3a7c15057192 158 zg_spi_trf(cmd, 1, true, ZG_SPI_WRITE);
donatien 0:b802fc31f1db 159 }
donatien 0:b802fc31f1db 160 }
donatien 0:b802fc31f1db 161
donatien 0:b802fc31f1db 162
donatien 1:3a7c15057192 163 void zg_spi_trf(byte* buf, int len, bool resetCs /*= true*/, ZG_SPI_DIR dir /*= ZG_SPI_TRF*/)
donatien 0:b802fc31f1db 164 {
donatien 0:b802fc31f1db 165 int i;
donatien 0:b802fc31f1db 166 m_pCs->write(ZG_SPI_CS_ON);
donatien 0:b802fc31f1db 167
donatien 1:3a7c15057192 168 #ifdef __DEBUG
donatien 0:b802fc31f1db 169 DBG("\r\nDump: >>\r\n");
donatien 0:b802fc31f1db 170 for(i=0; i<len; i++)
donatien 0:b802fc31f1db 171 {
donatien 1:3a7c15057192 172 DBGL("%02x ", buf[i]);
donatien 0:b802fc31f1db 173 }
donatien 1:3a7c15057192 174 DBG("\r\n>>\r\n");
donatien 1:3a7c15057192 175 #endif
donatien 0:b802fc31f1db 176
donatien 1:3a7c15057192 177 switch(dir)
donatien 0:b802fc31f1db 178 {
donatien 1:3a7c15057192 179 case ZG_SPI_READ:
donatien 1:3a7c15057192 180 for(i=0; i<len; i++)
donatien 1:3a7c15057192 181 buf[i] = (byte) m_pSpi->write(0);
donatien 1:3a7c15057192 182 break;
donatien 1:3a7c15057192 183 case ZG_SPI_WRITE:
donatien 1:3a7c15057192 184 for(i=0; i<len; i++)
donatien 1:3a7c15057192 185 m_pSpi->write(buf[i]);
donatien 1:3a7c15057192 186 break;
donatien 1:3a7c15057192 187 case ZG_SPI_TRF:
donatien 1:3a7c15057192 188 default:
donatien 1:3a7c15057192 189 for(i=0; i<len; i++)
donatien 1:3a7c15057192 190 buf[i] = (byte) m_pSpi->write(buf[i]);
donatien 1:3a7c15057192 191 break;
donatien 0:b802fc31f1db 192 }
donatien 0:b802fc31f1db 193
donatien 1:3a7c15057192 194 #ifdef __DEBUG
donatien 0:b802fc31f1db 195 DBG("\r\nDump: <<\r\n");
donatien 0:b802fc31f1db 196 for(i=0; i<len; i++)
donatien 0:b802fc31f1db 197 {
donatien 1:3a7c15057192 198 DBGL("%02x ", buf[i]);
donatien 0:b802fc31f1db 199 }
donatien 0:b802fc31f1db 200 DBG("\r\n<<\r\n");
donatien 1:3a7c15057192 201 #endif
donatien 1:3a7c15057192 202
donatien 0:b802fc31f1db 203
donatien 0:b802fc31f1db 204 if(resetCs) //If false, allows to split transfer in multiple calls
donatien 0:b802fc31f1db 205 m_pCs->write(ZG_SPI_CS_OFF);
donatien 0:b802fc31f1db 206 }
donatien 0:b802fc31f1db 207
donatien 1:3a7c15057192 208 bool zg_is_int()
donatien 1:3a7c15057192 209 {
donatien 1:3a7c15057192 210 return !(m_pInt->read());
donatien 1:3a7c15057192 211 }
donatien 1:3a7c15057192 212
donatien 0:b802fc31f1db 213 #endif