source: PlatformSupport/CustomPeripherals/pcores/simple_spi_v1_00_a/src/simple_spi.h

Last change on this file was 2445, checked in by murphpo, 10 years ago
File size: 5.3 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//From http://www.mars.dti.ne.jp/~m7030/pic_room/rec/mmc.c
91/* MMC/SD command (in SPI) */
92#define CMD0    (0x40+0)    /* GO_IDLE_STATE */
93#define CMD1    (0x40+1)    /* SEND_OP_COND (MMC) */
94#define ACMD41  (0x40+41)   /* SEND_OP_COND (SDC) */
95#define CMD8    (0x40+8)    /* SEND_IF_COND */
96#define CMD9    (0x40+9)    /* SEND_CSD */
97#define CMD10   (0x40+10)   /* SEND_CID */
98#define CMD12   (0x40+12)   /* STOP_TRANSMISSION */
99#define ACMD13  (0x40+13)   /* SD_STATUS (SDC) */
100#define CMD16   (0x40+16)   /* SET_BLOCKLEN */
101#define CMD17   (0x40+17)   /* READ_SINGLE_BLOCK */
102#define CMD18   (0x40+18)   /* READ_MULTIPLE_BLOCK */
103#define CMD23   (0x40+23)   /* SET_BLOCK_COUNT (MMC) */
104#define ACMD23  (0x40+23)   /* SET_WR_BLK_ERASE_COUNT (SDC) */
105#define CMD24   (0x40+24)   /* WRITE_BLOCK */
106#define CMD25   (0x40+25)   /* WRITE_MULTIPLE_BLOCK */
107#define CMD55   (0x40+55)   /* APP_CMD */
108#define CMD58   (0x40+58)   /* READ_OCR */
109
110#define DATA_TOKEN_RD           0xFE
111#define DATA_TOKEN_WR_SINGLE    0xFE
112#define DATA_TOKEN_WR_MULTI     0xFC
113#define DATA_TOKEN_STOP_TRAN    0xFD
114
115#endif /** WARP_SIMPLE_SPI_H */
Note: See TracBrowser for help on using the repository browser.