source: PlatformSupport/CustomPeripherals/pcores/w3_sd_spi_v1_00_a/src/sd_spi.h

Last change on this file was 2447, checked in by murphpo, 10 years ago
File size: 4.8 KB
Line 
1#ifndef WARP_SIMPLE_SPI_H
2#define WARP_SIMPLE_SPI_H
3
4#include "xbasic_types.h"
5#include "xstatus.h"
6#include "xil_io.h"
7
8#define WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET (0x00000000)
9#define WARP_SIMPLE_SPI_SLV_REG0_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000000)
10#define WARP_SIMPLE_SPI_SLV_REG1_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000004)
11#define WARP_SIMPLE_SPI_SLV_REG2_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000008)
12#define WARP_SIMPLE_SPI_SLV_REG3_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x0000000C)
13#define WARP_SIMPLE_SPI_SLV_REG4_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000010)
14#define WARP_SIMPLE_SPI_SLV_REG5_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000014)
15#define WARP_SIMPLE_SPI_SLV_REG6_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000018)
16#define WARP_SIMPLE_SPI_SLV_REG7_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x0000001C)
17#define WARP_SIMPLE_SPI_SLV_REG8_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000020)
18#define WARP_SIMPLE_SPI_SLV_REG9_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000024)
19#define WARP_SIMPLE_SPI_SLV_REG10_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000028)
20#define WARP_SIMPLE_SPI_SLV_REG11_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x0000002C)
21#define WARP_SIMPLE_SPI_SLV_REG12_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000030)
22#define WARP_SIMPLE_SPI_SLV_REG13_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000034)
23#define WARP_SIMPLE_SPI_SLV_REG14_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x00000038)
24#define WARP_SIMPLE_SPI_SLV_REG15_OFFSET (WARP_SIMPLE_SPI_USER_SLV_SPACE_OFFSET + 0x0000003C)
25
26
27    /* Address map:
28        HDL is coded [MSB:LSB] = [31:0]
29        regX[31]  maps to 0x80000000 in C driver
30        regX[0] maps to 0x00000001 in C driver
31
32    0: Config:
33        [ 3: 0] Clock divider bit sel (00=0.5*busclk, 01=0.25*busclk, ...) 0x0000000F
34        [30:10] Reserved
35        [   31] Chip select
36
37    1: SPI Tx
38        [ 7: 0] Tx data byte
39        [31: 8] Reserved
40   
41    2: SPI Rx: {samp_rxByte, 24'b0}
42        [ 7: 0] SPI Rx byte
43        [31: 8] Reserved 0xFFFFFF00
44       
45    3: FPGA config control:
46        [    0] SPI Enable (inverted below - reg active high, output active low) - gives FPGA SPI master control of SD card
47        [    1] Config request (inverted below - reg active high, output active low) - asserting this bit will reconfigure FPGA!
48        [ 7: 2] Reserved
49        [10: 8] Bitstream selection (slot on SD card, [0 to 7])
50        [31:11] Reserved
51   
52    4-15: Reserved
53    */
54
55#define SSPI_REG_CONFIG         WARP_SIMPLE_SPI_SLV_REG0_OFFSET
56#define SSPI_REG_SPITX          WARP_SIMPLE_SPI_SLV_REG1_OFFSET
57#define SSPI_REG_SPIRX          WARP_SIMPLE_SPI_SLV_REG2_OFFSET
58#define SSPI_REG_FPGA_CFG_CTRL  WARP_SIMPLE_SPI_SLV_REG3_OFFSET
59
60#define SSPI_REG_CONFIG_MASK_CLKDIV  0x0000000F
61#define SSPI_REG_CONFIG_MASK_CS      0x80000000
62
63#define SSPI_REG_FPGA_CFG_MASK_EN   0x00000001
64#define SSPI_REG_FPGA_CFG_MASK_GO   0x00000002
65#define SSPI_REG_FPGA_CFG_MASK_SLOT 0x00000F00
66
67#define sd_fpga_ctrl_en(ba) Xil_Out32((ba+SSPI_REG_FPGA_CFG_CTRL), (Xil_In32((ba+SSPI_REG_FPGA_CFG_CTRL)) | SSPI_REG_FPGA_CFG_MASK_EN))
68#define sd_fpga_ctrl_dis(ba) Xil_Out32((ba+SSPI_REG_FPGA_CFG_CTRL), (Xil_In32((ba+SSPI_REG_FPGA_CFG_CTRL)) & ~SSPI_REG_FPGA_CFG_MASK_EN))
69
70#define sd_config_req(ba) Xil_Out32((ba+SSPI_REG_FPGA_CFG_CTRL), (Xil_In32((ba+SSPI_REG_FPGA_CFG_CTRL)) | SSPI_REG_FPGA_CFG_MASK_GO))
71#define sd_config_set_slot(ba, slot) Xil_Out32((ba+SSPI_REG_FPGA_CFG_CTRL), ((Xil_In32((ba+SSPI_REG_FPGA_CFG_CTRL)) & ~SSPI_REG_FPGA_CFG_MASK_SLOT) | (slot&0xF)<<8))
72
73#define simple_spi_set_clkDiv(ba, div) (Xil_Out32((ba+SSPI_REG_CONFIG), \
74        (Xil_In32((ba+SSPI_REG_CONFIG)) & ~SSPI_REG_CONFIG_MASK_CLKDIV) | (div & SSPI_REG_CONFIG_MASK_CLKDIV)))
75
76#define simple_spi_set_cs(ba, cs) (Xil_Out32((ba+SSPI_REG_CONFIG), \
77        (Xil_In32((ba+SSPI_REG_CONFIG)) & ~SSPI_REG_CONFIG_MASK_CS) | (cs ? SSPI_REG_CONFIG_MASK_CS:0)))
78       
79//Functions
80u8 simple_spi_read(u32 baseaddr);
81void simple_spi_write(u32 baseaddr, u8 txByte);
82void sd_send_cmd(u32 ba, u8 cmd, u32 args, u8 last_byte);
83int sd_read_block(u32 ba, u32 blk_offset, u8* buf, u32 blk_size);
84int sd_write_block(u32 ba, u32 blk_offset, u8* buf, u32 blk_size);
85int sd_rw_init(u32 ba);
86
87#define SD_BLK_SIZE     512
88#define SD_BLKS_PER_IMG 18404 //LX240 bitstrem = 9.2MB
89
90//Subset of SD card commands for basic init/read/write via SPI
91#define SD_CMD0 (0x40+0)    /* GO_IDLE_STATE */
92#define SD_ACMD41   (0x40+41)   /* SEND_OP_COND (SDC) */
93#define SD_CMD16    (0x40+16)   /* SET_BLOCKLEN */
94#define SD_CMD17    (0x40+17)   /* READ_SINGLE_BLOCK */
95#define SD_CMD23    (0x40+23)   /* SET_BLOCK_COUNT (MMC) */
96#define SD_CMD24    (0x40+24)   /* WRITE_BLOCK */
97#define SD_CMD55    (0x40+55)   /* APP_CMD */
98
99#define SD_DATA_TOKEN_RD            0xFE
100#define SD_DATA_TOKEN_WR_SINGLE 0xFE
101#define SD_DATA_TOKEN_WR_MULTI      0xFC
102#define SD_DATA_TOKEN_STOP_TRAN 0xFD
103
104#endif /** WARP_SIMPLE_SPI_H */
Note: See TracBrowser for help on using the repository browser.