24 #include "sysconfig.h" 41 #define VECTNUM_SPI1 51 // SPI1割り込み 42 #define VECTNUM_SPI2 52 // SPI2割り込み 43 #define VECTNUM_DMA2_RX 74 // DMA2_Stream2 44 #define VECTNUM_DMA2_TX 75 // DMA2_Stream3 45 #define VECTNUM_DMA1_RX 30 // DMA1_Stream3 46 #define VECTNUM_DMA1_TX 31 // DMA1_Stream4 48 #define FCPU (GSC_CPU_CLOCK_HZ/2) 49 #define CLK_DEFAULT 400000UL // SCLKの周波数 400KHz 50 #define CLK_FP256 (FCPU/256) // SCLKの最小周波数 51 #define CLK_FP128 (FCPU/128) 52 #define CLK_FP64 (FCPU/64) 53 #define CLK_FP32 (FCPU/32) 54 #define CLK_FP16 (FCPU/16) 55 #define CLK_FP8 (FCPU/8) 56 #define CLK_FP4 (FCPU/4) 57 #define CLK_FP2 (FCPU/2) // SCLKの最大周波数 62 typedef struct st_reg_gpio {
75 #define GPIOA_BASE (0x40020000 + 0x000) 76 #define GPIOB_BASE (0x40020000 + 0x400) 77 #define GPIOC_BASE (0x40020000 + 0x800) 79 #define GPIOA ((st_reg_gpio *)GPIOA_BASE) 80 #define GPIOB ((st_reg_gpio *)GPIOB_BASE) 81 #define GPIOC ((st_reg_gpio *)GPIOC_BASE) 83 #define GPIO_MODE_BIT_IN 0x00UL // Input Mode 84 #define GPIO_MODE_BIT_OUT 0x01UL // Output Mode 85 #define GPIO_MODE_BIT_AF 0x02UL // Alternate functions Mode 86 #define GPIO_MODE_BIT_AN 0x03UL // Analog Mode 87 #define GPIO_MODE_BIT_ALL 0x03UL 89 #define GPIO_OTYPE_BIT_PP 0x00UL // push-pull 90 #define GPIO_OTYPE_BIT_OD 0x01UL // open-drain 92 #define GPIO_OSPEED_BIT_ALL 0x03UL 93 #define GPIO_OSPEED_BIT_100MHz 0x03UL 95 #define GPIO_PUPDR_BIT_NOPULL 0x00UL // No pull-up, pull-down 96 #define GPIO_PUPDR_BIT_PUP 0x01UL // pull-up 97 #define GPIO_PUPDR_BIT_PDOWN 0x02UL // pull-down 98 #define GPIO_PUPDR_BIT_ALL 0x03UL 100 #define GPIO_AFR_BIT_SPI12 0x05UL 101 #define GPIO_AFR_BIT_ALL 0x0FUL 107 #define RCC_AHB1ENR (*(volatile unsigned int *)0x40023830) 108 #define RCC_AHB1LPENR (*(volatile unsigned int *)0x40023850) 109 #define RCC_AHB1_BIT_GPIOA (1UL<<0) 110 #define RCC_AHB1_BIT_GPIOB (1UL<<1) 111 #define RCC_AHB1_BIT_GPIOC (1UL<<2) 112 #define RCC_AHB1_BIT_DMA1 (1UL<<21) 113 #define RCC_AHB1_BIT_DMA2 (1UL<<22) 115 #define RCC_APB1ENR (*(volatile unsigned int *)0x40023840) 116 #define RCC_APB1_BIT_SPI2 (1UL<<14) 118 #define RCC_APB2ENR (*(volatile unsigned int *)0x40023844) 119 #define RCC_APB2LPENR (*(volatile unsigned int *)0x40023864) 120 #define RCC_APB2_BIT_SPI1 (1UL<<12) 125 typedef struct st_reg_spi {
133 unsigned int I2SCFGR;
137 #define SPI1_BASE 0x40013000 138 #define SPI2_BASE 0x40003800 140 #define SPI1 ((st_reg_spi *)SPI1_BASE) 141 #define SPI2 ((st_reg_spi *)SPI2_BASE) 143 #define SPI_CR1_BIT_BIDIMODE (1UL<<15) 144 #define SPI_CR1_BIT_BIDIOE (1UL<<14) 145 #define SPI_CR1_BIT_CRCEN (1UL<<13) 146 #define SPI_CR1_BIT_CRCNEXT (1UL<<12) 147 #define SPI_CR1_BIT_DFF (1UL<<11) 148 #define SPI_CR1_BIT_RXONLY (1UL<<10) 149 #define SPI_CR1_BIT_SSM (1UL<<9) 150 #define SPI_CR1_BIT_SSI (1UL<<8) 151 #define SPI_CR1_BIT_LSBFIRST (1UL<<7) 152 #define SPI_CR1_BIT_SPE (1UL<<6) 153 #define SPI_CR1_BIT_BR_256 (7UL<<3) 154 #define SPI_CR1_BIT_MSTR (1UL<<2) 155 #define SPI_CR1_BIT_CPOL (1UL<<1) 156 #define SPI_CR1_BIT_CPHA (1UL<<0) 158 #define SPI_CR2_BIT_TXEIE (1UL<<7) 159 #define SPI_CR2_BIT_RXNEIE (1UL<<6) 160 #define SPI_CR2_BIT_ERRIE (1UL<<5) 161 #define SPI_CR2_BIT_SSOE (1UL<<2) 162 #define SPI_CR2_BIT_TXDMAEN (1UL<<1) 163 #define SPI_CR2_BIT_RXDMAEN (1UL<<0) 165 #define SPI_SR_BIT_BSY (1UL<<7) 166 #define SPI_SR_BIT_OVR (1UL<<6) 167 #define SPI_SR_BIT_MODF (1UL<<5) 168 #define SPI_SR_BIT_CRCERR (1UL<<4) 169 #define SPI_SR_BIT_UDR (1UL<<3) 170 #define SPI_SR_BIT_CHSIDE (1UL<<2) 171 #define SPI_SR_BIT_TXE (1UL<<1) 172 #define SPI_SR_BIT_RXNE (1UL<<0) 174 #define SPI_I2SCFGR_BIT_I2SMOD (1UL<<11) 175 #define SPI_I2SCFGR_BIT_I2SE (1UL<<10) 176 #define SPI_I2SCFGR_BIT_I2SCFG (3UL<<8) 177 #define SPI_I2SCFGR_BIT_PCMSYNC (1UL<<7) 178 #define SPI_I2SCFGR_BIT_I2SSTD (3UL<<4) 179 #define SPI_I2SCFGR_BIT_CKPOLD (1UL<<3) 180 #define SPI_I2SCFGR_BIT_DATLEN (3UL<<1) 181 #define SPI_I2SCFGR_BIT_CHLEN (1UL<<0) 186 typedef struct st_reg_dmacr {
195 typedef struct st_reg_dma {
203 #define DMA1_BASE 0x40026000 204 #define DMA2_BASE 0x40026400 206 #define DMA1 ((st_reg_dma *)DMA1_BASE) 207 #define DMA2 ((st_reg_dma *)DMA2_BASE) 209 #define DMA_LISR_BIT_FEIF3 (1UL<<22) 210 #define DMA_LISR_BIT_TCIF3 (1UL<<27) 211 #define DMA_LISR_BIT_HTIF3 (1UL<<26) 212 #define DMA_LISR_BIT_TEIF3 (1UL<<25) 213 #define DMA_LISR_BIT_DMEIF3 (1UL<<24) 214 #define DMA_LISR_BIT_FEIF3 (1UL<<22) 216 #define DMA_LISR_BIT_TCIF2 (1UL<<21) 217 #define DMA_LISR_BIT_HTIF2 (1UL<<20) 218 #define DMA_LISR_BIT_TEIF2 (1UL<<19) 219 #define DMA_LISR_BIT_DMEIF2 (1UL<<18) 220 #define DMA_LISR_BIT_FEIF2 (1UL<<16) 222 #define DMA_HISR_BIT_TCIF4 (1UL<<5) 223 #define DMA_HISR_BIT_HTIF4 (1UL<<4) 224 #define DMA_HISR_BIT_TEIF4 (1UL<<3) 225 #define DMA_HISR_BIT_DMEIF4 (1UL<<2) 226 #define DMA_HISR_BIT_FEIF4 (1UL<<0) 228 #define DMA_SxCR_BIT_EN (1UL<<0) 229 #define DMA_SxCR_BIT_DMEIE (1UL<<1) 230 #define DMA_SxCR_BIT_TEIE (1UL<<2) 231 #define DMA_SxCR_BIT_HTIE (1UL<<3) 232 #define DMA_SxCR_BIT_TCIE (1UL<<4) 233 #define DMA_SxCR_BIT_PFCTRL (1UL<<5) 234 #define DMA_SxCR_BIT_DIR_ALL (3UL<<6) 235 #define DMA_SxCR_BIT_DIR_P2M (0UL<<6) 236 #define DMA_SxCR_BIT_DIR_M2P (1UL<<6) 237 #define DMA_SxCR_BIT_DIR_M2M (2UL<<6) 238 #define DMA_SxCR_BIT_CIRC (1UL<<8) 239 #define DMA_SxCR_BIT_PINC (1UL<<9) 240 #define DMA_SxCR_BIT_MINC (1UL<<10) 241 #define DMA_SxCR_BIT_PSIZE_ALL (3UL<<11) 242 #define DMA_SxCR_BIT_PSIZE_BYTE (0UL<<11) 243 #define DMA_SxCR_BIT_PSIZE_HW (1UL<<11) 244 #define DMA_SxCR_BIT_PSIZE_WORD (2UL<<11) 245 #define DMA_SxCR_BIT_MSIZE_ALL (3UL<<13) 246 #define DMA_SxCR_BIT_MSIZE_BYTE (0UL<<13) 247 #define DMA_SxCR_BIT_MSIZE_HW (1UL<<13) 248 #define DMA_SxCR_BIT_MSIZE_WORD (2UL<<13) 249 #define DMA_SxCR_BIT_MSIZE_PINCOS (1UL<<15) 250 #define DMA_SxCR_BIT_PL_ALL (3UL<<16) 251 #define DMA_SxCR_BIT_PL_LOW (0UL<<16) 252 #define DMA_SxCR_BIT_PL_MEDIUM (1UL<<16) 253 #define DMA_SxCR_BIT_PL_HIGH (2UL<<16) 254 #define DMA_SxCR_BIT_PL_VHIGH (3UL<<16) 255 #define DMA_SxCR_BIT_DBM (1UL<<18) 256 #define DMA_SxCR_BIT_CT (1UL<<19) 257 #define DMA_SxCR_BIT_PBURST_ALL (3UL<<21) 258 #define DMA_SxCR_BIT_PBURST_SINGLE (0UL<<21) 259 #define DMA_SxCR_BIT_PBURST_INCR4 (1UL<<21) 260 #define DMA_SxCR_BIT_PBURST_INCR8 (2UL<<21) 261 #define DMA_SxCR_BIT_PBURST_INCR16 (3UL<<21) 262 #define DMA_SxCR_BIT_MBURST_ALL (3UL<<23) 263 #define DMA_SxCR_BIT_MBURST_SINGLE (0UL<<23) 264 #define DMA_SxCR_BIT_MBURST_INCR4 (1UL<<23) 265 #define DMA_SxCR_BIT_MBURST_INCR8 (2UL<<23) 266 #define DMA_SxCR_BIT_MBURST_INCR16 (3UL<<23) 267 #define DMA_SxCR_BIT_CHSEL_ALL (7UL<<25) 268 #define DMA_SxCR_BIT_CHSEL_CH0 (0UL<<25) 269 #define DMA_SxCR_BIT_CHSEL_CH1 (1UL<<25) 270 #define DMA_SxCR_BIT_CHSEL_CH2 (2UL<<25) 271 #define DMA_SxCR_BIT_CHSEL_CH3 (3UL<<25) 272 #define DMA_SxCR_BIT_CHSEL_CH4 (4UL<<25) 273 #define DMA_SxCR_BIT_CHSEL_CH5 (5UL<<25) 274 #define DMA_SxCR_BIT_CHSEL_CH6 (6UL<<25) 275 #define DMA_SxCR_BIT_CHSEL_CH7 (7UL<<25) 276 #define DMA_SxCR_BIT_CHSEL_SHIFT (25) 278 #define DMA_SxFCR_BIT_FEIE (1UL<<7) 279 #define DMA_SxFCR_BIT_FS_ALL (7UL<<3) 280 #define DMA_SxFCR_BIT_DMDIS (1UL<<2) 281 #define DMA_SxFCR_BIT_FTH_ALL (3UL<<0) 282 #define DMA_SxFCR_BIT_FTH_1P4 (0UL<<0) 283 #define DMA_SxFCR_BIT_FTH_1P2 (1UL<<0) 284 #define DMA_SxFCR_BIT_FTH_3P4 (2UL<<0) 285 #define DMA_SxFCR_BIT_FTH_FULL (3UL<<0) 287 #define NVIC_ISER0 (*(volatile unsigned int *)0xE000E100) 288 #define NVIC_ISER1 (*(volatile unsigned int *)0xE000E104) 300 unsigned char channel;
301 unsigned char rx_stream;
302 unsigned char tx_stream;
305 static struct st_spi_data spi_data[2];
311 #define MUTEX_LOCK_TIMEOUT 1000 316 MUTEX_LOCK_TIMEOUT) == 0) {
317 SYSERR_PRINT(
"%s lock timeout\n", dev->
name);
327 #define unlock_spi(x) 331 static void inthdr_spi1(
unsigned int intnum,
void *sp)
335 static void inthdr_spi2(
unsigned int intnum,
void *sp)
340 static void inthdr_spi_dma2(
unsigned int intnum,
void *sp)
342 DMA2->LIFCR = DMA_LISR_BIT_TCIF2;
344 if(intnum == VECTNUM_DMA2_RX) {
347 SYSERR_PRINT(
"Invalid Interrupt(%d)\n", (
int)intnum);
351 static void inthdr_spi_dma1(
unsigned int intnum,
void *sp)
353 DMA1->LIFCR = DMA_LISR_BIT_TCIF3;
355 if(intnum == VECTNUM_DMA1_RX) {
358 SYSERR_PRINT(
"Invalid Interrupt(%d)\n", (
int)intnum);
364 static void init_gpio(st_reg_gpio *gpio,
int pin,
int pup)
366 volatile st_reg_gpio *gpiox = gpio;
369 gpiox->AFRL &= ~(GPIO_AFR_BIT_ALL << (4*pin));
370 gpiox->AFRL |= (GPIO_AFR_BIT_SPI12 << (4*pin));
372 gpiox->AFRH &= ~(GPIO_AFR_BIT_ALL << (4*(pin-8)));
373 gpiox->AFRH |= (GPIO_AFR_BIT_SPI12 << (4*(pin-8)));
376 gpiox->MODER &= ~(GPIO_MODE_BIT_ALL << (2*pin));
377 gpiox->MODER |= (GPIO_MODE_BIT_AF << (2*pin));
378 gpiox->OSPEEDR &= ~(GPIO_OSPEED_BIT_ALL << (2*pin));
379 gpiox->OSPEEDR |= (GPIO_OSPEED_BIT_100MHz << (2*pin));
380 gpiox->OTYPE &= ~(1UL << pin);
381 gpiox->OTYPE |= (GPIO_OTYPE_BIT_PP << pin);
382 gpiox->PUPDR &= ~(GPIO_PUPDR_BIT_ALL << (2*pin));
384 gpiox->PUPDR |= (GPIO_PUPDR_BIT_PUP << (2*pin));
386 gpiox->PUPDR |= (GPIO_PUPDR_BIT_NOPULL << (2*pin));
390 static void init_spi(
struct st_device *dev)
392 volatile st_reg_spi *spix = ((
struct st_spi_data *)(dev->
private_data))->spi;
394 volatile st_reg_dma *dmax = ((
struct st_spi_data *)(dev->
private_data))->dma;
395 int rx_stream = ((
struct st_spi_data *)(dev->
private_data))->rx_stream;
396 int tx_stream = ((
struct st_spi_data *)(dev->
private_data))->tx_stream;
399 if(dev == &spi1_device) {
400 RCC_AHB1ENR |= RCC_AHB1_BIT_GPIOA;
404 init_gpio(GPIOA, 5, 1);
405 init_gpio(GPIOA, 6, 1);
406 init_gpio(GPIOA, 7, 1);
408 RCC_APB2ENR |= RCC_APB2_BIT_SPI1;
409 }
else if(dev == &spi2_device) {
410 RCC_AHB1ENR |= RCC_AHB1_BIT_GPIOB;
412 RCC_AHB1ENR |= RCC_AHB1_BIT_GPIOC;
417 init_gpio(GPIOB, 10, 0);
419 init_gpio(GPIOB, 13, 0);
422 init_gpio(GPIOC, 2, 0);
423 init_gpio(GPIOC, 3, 0);
425 init_gpio(GPIOB, 14, 0);
426 init_gpio(GPIOB, 15, 0);
429 RCC_APB1ENR |= RCC_APB1_BIT_SPI2;
431 SYSERR_PRINT(
"Invalid device(%p)\n", dev);
436 spix->CR1 |= (SPI_CR1_BIT_MSTR |
442 if(dev == &spi2_device) {
443 spix->CR1 |= (SPI_CR1_BIT_CPOL | SPI_CR1_BIT_CPHA);
446 if(dev == &spi2_device) {
447 spix->CR1 &= ~(SPI_CR1_BIT_CPOL | SPI_CR1_BIT_CPHA);
451 spix->I2SCFGR &= ~SPI_I2SCFGR_BIT_I2SMOD;
454 spix->CR1 |= SPI_CR1_BIT_SPE;
456 while((spix->SR & SPI_SR_BIT_TXE) == 0) {
462 if(dev == &spi1_device) {
463 RCC_AHB1ENR |= RCC_AHB1_BIT_DMA2;
465 dmax->Sx[rx_stream].CR &= ~DMA_SxCR_BIT_EN;
466 dmax->Sx[tx_stream].CR &= ~DMA_SxCR_BIT_EN;
468 NVIC_ISER1 |= (1 << ((VECTNUM_DMA2_RX-16) % 32));
469 }
else if(dev == &spi2_device) {
470 RCC_AHB1ENR |= RCC_AHB1_BIT_DMA1;
472 dmax->Sx[rx_stream].CR &= ~DMA_SxCR_BIT_EN;
473 dmax->Sx[tx_stream].CR &= ~DMA_SxCR_BIT_EN;
475 NVIC_ISER0 |= (1 << ((VECTNUM_DMA1_RX-16) % 32));
477 SYSERR_PRINT(
"Invalid device(%p)\n", dev);
483 static int init_driver(
struct st_device *dev)
485 void (* spi_ih)(
unsigned int intnum,
void *sp) = inthdr_spi1;
486 unsigned short spi_vn = VECTNUM_SPI1;
488 void (* dma_ih)(
unsigned int intnum,
void *sp) = inthdr_spi_dma2;
489 unsigned short dma_vn = VECTNUM_DMA2_RX;
492 if(dev == &spi1_device) {
493 spi_vn = VECTNUM_SPI1;
494 ((
struct st_spi_data *)(dev->
private_data))->spi = SPI1;
495 spi_ih = inthdr_spi1;
497 ((
struct st_spi_data *)(dev->
private_data))->dma = DMA2;
498 ((
struct st_spi_data *)(dev->
private_data))->channel = 3;
499 ((
struct st_spi_data *)(dev->
private_data))->rx_stream = 2;
500 ((
struct st_spi_data *)(dev->
private_data))->tx_stream = 3;
501 dma_ih = inthdr_spi_dma2;
502 dma_vn = VECTNUM_DMA2_RX;
505 register_interrupt(dma_vn, dma_ih);
507 "spi1-dma", 0, 0, 0);
513 }
else if(dev == &spi2_device) {
514 spi_vn = VECTNUM_SPI2;
515 ((
struct st_spi_data *)(dev->
private_data))->spi = SPI2;
516 spi_ih = inthdr_spi2;
518 ((
struct st_spi_data *)(dev->
private_data))->dma = DMA1;
519 ((
struct st_spi_data *)(dev->
private_data))->channel = 0;
520 ((
struct st_spi_data *)(dev->
private_data))->rx_stream = 3;
521 ((
struct st_spi_data *)(dev->
private_data))->tx_stream = 4;
522 dma_ih = inthdr_spi_dma1;
523 dma_vn = VECTNUM_DMA1_RX;
526 register_interrupt(dma_vn, dma_ih);
528 "spi2-dma", 0, 0, 0);
535 SYSERR_PRINT(
"Unknown SPI device(%p)\n", dev);
539 register_interrupt(spi_vn, spi_ih);
546 #define SPI_RETRY_TIME 1000000 548 static int spi_readbyte(
struct st_device *dev,
unsigned char *rd)
550 volatile st_reg_spi *spix = ((
struct st_spi_data *)(dev->
private_data))->spi;
551 int i = SPI_RETRY_TIME;
555 while((spix->SR & SPI_SR_BIT_TXE) == 0) {
558 SYSERR_PRINT(
"TXE timeout\n");
563 while((spix->SR & SPI_SR_BIT_RXNE) == 0) {
566 SYSERR_PRINT(
"RXNE timeout\n");
571 while(spix->SR & SPI_SR_BIT_BSY) {
574 SYSERR_PRINT(
"BSY timeout\n");
581 DKPRINTF(0x02,
"SPI1 RD = %02X\n", *rd);
586 #define SPI_WAIT_TIME 500 589 static int spi_transblock(
struct st_device *dev,
unsigned char *rd,
long size,
592 static const unsigned char dummy_data = 0xFF;
594 volatile st_reg_spi *spix = ((
struct st_spi_data *)(dev->
private_data))->spi;
595 volatile st_reg_dma *dmax = ((
struct st_spi_data *)(dev->
private_data))->dma;
596 unsigned int channel = ((
struct st_spi_data *)(dev->
private_data))->channel;
597 int rx_stream = ((
struct st_spi_data *)(dev->
private_data))->rx_stream;
598 int tx_stream = ((
struct st_spi_data *)(dev->
private_data))->tx_stream;
603 DKPRINTF(0x01,
"SPI DMA *data=%p, size=%ld, W(0)/R(1)=%d\n", rd, size, dir_read);
605 while(dmax->Sx[tx_stream].CR & DMA_SxCR_BIT_EN) {
609 spix->CR1 &= ~SPI_CR1_BIT_DFF;
611 tmp = dmax->Sx[rx_stream].CR;
612 tmp &= ~(DMA_SxCR_BIT_CHSEL_ALL | DMA_SxCR_BIT_MBURST_ALL |
613 DMA_SxCR_BIT_PBURST_ALL | DMA_SxCR_BIT_PL_ALL |
614 DMA_SxCR_BIT_MSIZE_ALL | DMA_SxCR_BIT_PSIZE_ALL |
615 DMA_SxCR_BIT_MINC | DMA_SxCR_BIT_PINC |
616 DMA_SxCR_BIT_CIRC | DMA_SxCR_BIT_DIR_ALL);
617 tmp |= ((channel << DMA_SxCR_BIT_CHSEL_SHIFT) |
618 DMA_SxCR_BIT_DIR_P2M |
619 DMA_SxCR_BIT_PSIZE_BYTE |
620 DMA_SxCR_BIT_MSIZE_BYTE |
621 DMA_SxCR_BIT_PL_HIGH |
622 DMA_SxCR_BIT_PBURST_SINGLE |
623 DMA_SxCR_BIT_MBURST_SINGLE);
625 tmp |= DMA_SxCR_BIT_MINC;
627 dmax->Sx[rx_stream].CR = tmp;
629 tmp = dmax->Sx[rx_stream].FCR;
630 tmp &= ~(DMA_SxFCR_BIT_DMDIS | DMA_SxFCR_BIT_FTH_ALL);
631 tmp |= DMA_SxFCR_BIT_FTH_FULL;
632 tmp = dmax->Sx[rx_stream].FCR = tmp;
634 dmax->Sx[rx_stream].NDTR = size;
635 dmax->Sx[rx_stream].PAR = (
unsigned int)&(spix->DR);
637 dmax->Sx[rx_stream].M0AR = (
unsigned int)rd;
639 dmax->Sx[rx_stream].M0AR = (
unsigned int)(&dummy_data);
642 tmp = dmax->Sx[tx_stream].CR;
643 tmp &= ~(DMA_SxCR_BIT_CHSEL_ALL | DMA_SxCR_BIT_MBURST_ALL |
644 DMA_SxCR_BIT_PBURST_ALL | DMA_SxCR_BIT_PL_ALL |
645 DMA_SxCR_BIT_MSIZE_ALL | DMA_SxCR_BIT_PSIZE_ALL |
646 DMA_SxCR_BIT_MINC | DMA_SxCR_BIT_PINC |
647 DMA_SxCR_BIT_CIRC | DMA_SxCR_BIT_DIR_ALL);
648 tmp |= ((channel << DMA_SxCR_BIT_CHSEL_SHIFT) |
649 DMA_SxCR_BIT_DIR_M2P |
650 DMA_SxCR_BIT_PSIZE_BYTE |
651 DMA_SxCR_BIT_MSIZE_BYTE |
652 DMA_SxCR_BIT_PL_HIGH |
653 DMA_SxCR_BIT_PBURST_SINGLE |
654 DMA_SxCR_BIT_MBURST_SINGLE);
656 tmp |= DMA_SxCR_BIT_MINC;
658 dmax->Sx[tx_stream].CR = tmp;
660 tmp = dmax->Sx[tx_stream].FCR;
661 tmp &= ~(DMA_SxFCR_BIT_DMDIS | DMA_SxFCR_BIT_FTH_ALL);
662 tmp |= DMA_SxFCR_BIT_FTH_FULL;
663 dmax->Sx[tx_stream].FCR = tmp;
665 dmax->Sx[tx_stream].NDTR = size;
666 dmax->Sx[tx_stream].PAR = (
unsigned int)&(spix->DR);
668 dmax->Sx[tx_stream].M0AR = (
unsigned int)(&dummy_data);
670 dmax->Sx[tx_stream].M0AR = (
unsigned int)rd;
673 spix->CR2 |= (SPI_CR2_BIT_RXDMAEN | SPI_CR2_BIT_TXDMAEN);
678 dmax->Sx[rx_stream].CR |= (DMA_SxCR_BIT_TCIE | DMA_SxCR_BIT_TEIE);
679 dmax->Sx[rx_stream].CR |= DMA_SxCR_BIT_EN;
680 dmax->Sx[tx_stream].CR |= DMA_SxCR_BIT_EN;
687 SYSERR_PRINT(
"SPI DMA timeout(%ld)\n", rt);
690 if(dev == &spi1_device) {
691 while((dmax->LISR & DMA_LISR_BIT_TCIF3) == 0) {
694 }
else if(dev == &spi2_device) {
695 while((dmax->HISR & DMA_HISR_BIT_TCIF4) == 0) {
699 SYSERR_PRINT(
"Invalid device(%p)\n", dev);
704 dmax->Sx[rx_stream].CR &= ~DMA_SxCR_BIT_EN;
705 dmax->Sx[tx_stream].CR &= ~DMA_SxCR_BIT_EN;
706 spix->CR2 &= ~(SPI_CR2_BIT_RXDMAEN | SPI_CR2_BIT_TXDMAEN);
709 if(dev == &spi1_device) {
710 dmax->LIFCR = DMA_LISR_BIT_TCIF2;
711 }
else if(dev == &spi2_device) {
712 dmax->LIFCR = DMA_LISR_BIT_TCIF3;
714 SYSERR_PRINT(
"Invalid device(%p)\n", dev);
718 if(dev == &spi1_device) {
719 dmax->LIFCR = DMA_LISR_BIT_TCIF3;
720 }
else if(dev == &spi2_device) {
721 dmax->HIFCR = DMA_HISR_BIT_TCIF4;
723 SYSERR_PRINT(
"Invalid device(%p)\n", dev);
730 for(i=0; i<size; i++) {
731 DKPRINTF(0x02,
"%02X ", rd[i]);
743 static int spi_write_cont_word(
struct st_device *dev,
unsigned short data,
746 static const unsigned char dummy_data = 0xFF;
747 volatile unsigned int wdata = data;
749 volatile st_reg_spi *spix = ((
struct st_spi_data *)(dev->
private_data))->spi;
750 volatile st_reg_dma *dmax = ((
struct st_spi_data *)(dev->
private_data))->dma;
751 unsigned int channel = ((
struct st_spi_data *)(dev->
private_data))->channel;
752 int rx_stream = ((
struct st_spi_data *)(dev->
private_data))->rx_stream;
753 int tx_stream = ((
struct st_spi_data *)(dev->
private_data))->tx_stream;
757 while(dmax->Sx[tx_stream].CR & DMA_SxCR_BIT_EN) {
761 spix->CR1 |= SPI_CR1_BIT_DFF;
763 tmp = dmax->Sx[rx_stream].CR;
764 tmp &= ~(DMA_SxCR_BIT_CHSEL_ALL | DMA_SxCR_BIT_MBURST_ALL |
765 DMA_SxCR_BIT_PBURST_ALL | DMA_SxCR_BIT_PL_ALL |
766 DMA_SxCR_BIT_MSIZE_ALL | DMA_SxCR_BIT_PSIZE_ALL |
767 DMA_SxCR_BIT_MINC | DMA_SxCR_BIT_PINC |
768 DMA_SxCR_BIT_CIRC | DMA_SxCR_BIT_DIR_ALL);
769 tmp |= ((channel << DMA_SxCR_BIT_CHSEL_SHIFT) |
770 DMA_SxCR_BIT_DIR_P2M |
771 DMA_SxCR_BIT_PSIZE_WORD |
772 DMA_SxCR_BIT_MSIZE_WORD |
773 DMA_SxCR_BIT_PL_HIGH |
774 DMA_SxCR_BIT_PBURST_SINGLE |
775 DMA_SxCR_BIT_MBURST_SINGLE);
776 dmax->Sx[rx_stream].CR = tmp;
778 tmp = dmax->Sx[rx_stream].FCR;
779 tmp &= ~(DMA_SxFCR_BIT_DMDIS | DMA_SxFCR_BIT_FTH_ALL);
780 tmp |= DMA_SxFCR_BIT_FTH_FULL;
781 tmp = dmax->Sx[rx_stream].FCR = tmp;
783 dmax->Sx[rx_stream].NDTR = size * 2;
784 dmax->Sx[rx_stream].PAR = (
unsigned int)&(spix->DR);
785 dmax->Sx[rx_stream].M0AR = (
unsigned int)(&dummy_data);
787 tmp = dmax->Sx[tx_stream].CR;
788 tmp &= ~(DMA_SxCR_BIT_CHSEL_ALL | DMA_SxCR_BIT_MBURST_ALL |
789 DMA_SxCR_BIT_PBURST_ALL | DMA_SxCR_BIT_PL_ALL |
790 DMA_SxCR_BIT_MSIZE_ALL | DMA_SxCR_BIT_PSIZE_ALL |
791 DMA_SxCR_BIT_MINC | DMA_SxCR_BIT_PINC |
792 DMA_SxCR_BIT_CIRC | DMA_SxCR_BIT_DIR_ALL);
793 tmp |= ((channel << DMA_SxCR_BIT_CHSEL_SHIFT) |
794 DMA_SxCR_BIT_DIR_M2P |
795 DMA_SxCR_BIT_PSIZE_WORD |
796 DMA_SxCR_BIT_MSIZE_WORD |
797 DMA_SxCR_BIT_PL_HIGH |
798 DMA_SxCR_BIT_PBURST_SINGLE |
799 DMA_SxCR_BIT_MBURST_SINGLE);
800 dmax->Sx[tx_stream].CR = tmp;
802 tmp = dmax->Sx[tx_stream].FCR;
803 tmp &= ~(DMA_SxFCR_BIT_DMDIS | DMA_SxFCR_BIT_FTH_ALL);
804 tmp |= DMA_SxFCR_BIT_FTH_FULL;
805 dmax->Sx[tx_stream].FCR = tmp;
807 dmax->Sx[tx_stream].NDTR = size * 2;
808 dmax->Sx[tx_stream].PAR = (
unsigned int)&(spix->DR);
809 dmax->Sx[tx_stream].M0AR = (
unsigned int)&wdata;
811 spix->CR2 |= (SPI_CR2_BIT_RXDMAEN | SPI_CR2_BIT_TXDMAEN);
816 dmax->Sx[rx_stream].CR |= (DMA_SxCR_BIT_TCIE | DMA_SxCR_BIT_TEIE);
817 dmax->Sx[rx_stream].CR |= DMA_SxCR_BIT_EN;
818 dmax->Sx[tx_stream].CR |= DMA_SxCR_BIT_EN;
824 SYSERR_PRINT(
"SPI DMA timeout(%d)\n", rt);
827 if(dev == &spi1_device) {
828 while((dmax->LISR & DMA_LISR_BIT_TCIF3) == 0) {
831 }
else if(dev == &spi2_device) {
832 while((dmax->HISR & DMA_HISR_BIT_TCIF4) == 0) {
836 SYSERR_PRINT(
"Invalid device(%p)\n", dev);
841 dmax->Sx[rx_stream].CR &= ~DMA_SxCR_BIT_EN;
842 dmax->Sx[tx_stream].CR &= ~DMA_SxCR_BIT_EN;
843 spix->CR2 &= ~(SPI_CR2_BIT_RXDMAEN | SPI_CR2_BIT_TXDMAEN);
846 if(dev == &spi1_device) {
847 dmax->LIFCR = DMA_LISR_BIT_TCIF2;
848 }
else if(dev == &spi2_device) {
849 dmax->LIFCR = DMA_LISR_BIT_TCIF3;
852 if(dev == &spi1_device) {
853 dmax->LIFCR = DMA_LISR_BIT_TCIF3;
854 }
else if(dev == &spi2_device) {
855 dmax->HIFCR = DMA_HISR_BIT_TCIF4;
857 SYSERR_PRINT(
"Invalid device(%p)\n", dev);
864 static int spi_writebyte(
struct st_device *dev,
unsigned char data)
866 volatile st_reg_spi *spix = ((
struct st_spi_data *)(dev->
private_data))->spi;
867 int i = SPI_WAIT_TIME;
868 volatile unsigned short tmp;
870 spix->CR1 &= ~SPI_CR1_BIT_DFF;
874 while((spix->SR & SPI_SR_BIT_TXE) == 0) {
877 SYSERR_PRINT(
"TXE timeout\n");
882 while((spix->SR & SPI_SR_BIT_RXNE) == 0) {
885 SYSERR_PRINT(
"RXNE timeout\n");
890 while(spix->SR & SPI_SR_BIT_BSY) {
893 SYSERR_PRINT(
"BSY timeout\n");
904 static int spi_writeword(
struct st_device *dev,
unsigned short data)
906 volatile st_reg_spi *spix = ((
struct st_spi_data *)(dev->
private_data))->spi;
907 int i = SPI_WAIT_TIME;
908 volatile unsigned short tmp;
910 spix->CR1 |= SPI_CR1_BIT_DFF;
914 while((spix->SR & SPI_SR_BIT_TXE) == 0) {
917 SYSERR_PRINT(
"TXE timeout\n");
922 while((spix->SR & SPI_SR_BIT_RXNE) == 0) {
925 SYSERR_PRINT(
"RXNE timeout\n");
930 while(spix->SR & SPI_SR_BIT_BSY) {
933 SYSERR_PRINT(
"BSY timeout\n");
948 static int spi_register(
struct st_device *dev,
char *param)
950 if(init_driver(dev)) {
957 static int spi_getc(
struct st_device *dev,
unsigned char *rd)
963 rtn = spi_readbyte(dev, rd);
970 static int spi_read(
struct st_device *dev,
void *data,
unsigned int size)
978 rtn = spi_transblock(dev, data, size, 1);
982 long rtn = spi_readbyte(dev, data);
986 DKPRINTF(0x02,
"%02X ", *data);
1002 static int spi_putc(
struct st_device *dev,
unsigned char ch)
1008 rtn = spi_writebyte(dev, ch);
1015 static int spi_write(
struct st_device *dev,
const void *data,
unsigned int size)
1023 rtn = spi_transblock(dev, (
unsigned char *)data, size, 0);
1027 long rtn = spi_writebyte(dev, *data);
1046 static int spi_ioctl(
struct st_device *dev,
unsigned int com,
unsigned int arg,
void *param)
1048 volatile st_reg_spi *spix = ((
struct st_spi_data *)(dev->
private_data))->spi;
1056 DKFPRINTF(0x01,
"arg = %ld\n", arg);
1057 if(CLK_FP2 <= arg) {
1059 DKPRINTF(0x01,
"BR = %d(SPEED = %d bps)\n", br, (
int)CLK_FP2);
1061 if((CLK_FP4 <= arg) && (arg < CLK_FP2)) {
1063 DKPRINTF(0x01,
"BR = %d(SPEED = %d bps)\n", br, (
int)CLK_FP4);
1065 if((CLK_FP8 <= arg) && (arg < CLK_FP4)) {
1067 DKPRINTF(0x01,
"BR = %d(SPEED = %d bps)\n", br, (
int)CLK_FP8);
1069 if((CLK_FP16 <= arg) && (arg < CLK_FP8)) {
1071 DKPRINTF(0x01,
"BR = %d(SPEED = %d bps)\n", br, (
int)CLK_FP16);
1073 if((CLK_FP32 <= arg) && (arg < CLK_FP16)) {
1075 DKPRINTF(0x01,
"BR = %d(SPEED = %d bps)\n", br, (
int)CLK_FP32);
1077 if((CLK_FP64 <= arg) && (arg < CLK_FP32)) {
1079 DKPRINTF(0x01,
"BR = %d(SPEED = %d bps)\n", br, (
int)CLK_FP64);
1081 if((CLK_FP128 <= arg) && (arg < CLK_FP64)) {
1083 DKPRINTF(0x01,
"BR = %d(SPEED = %d bps)\n", br, (
int)CLK_FP128);
1085 if(arg < CLK_FP128) {
1087 DKPRINTF(0x01,
"BR = %d(SPEED = %d bps)\n", br, (
int)CLK_FP256);
1090 spix->CR1 &= ~SPI_CR1_BIT_SPE;
1091 spix->CR1 = ((spix->CR1 & ~SPI_CR1_BIT_BR_256) |
1093 spix->CR1 |= SPI_CR1_BIT_SPE;
1094 DKPRINTF(0x01,
"SPIx_CR1 = %08X\n", (
int)spix->CR1);
1102 rtn = spi_writeword(dev, arg & 0xffff);
1106 rtn = spi_write_cont_word(dev, arg & 0xffff,
1107 (arg >> 16) & 0xffff);
1111 SYSERR_PRINT(
"Unknown ioctl(%08lX)\n", com);
1120 static int spi_suspend(
struct st_device *dev)
1125 static int spi_resume(
struct st_device *dev)
1134 .explan =
"STM32F4 SPI1",
1135 .private_data = (
void *)&spi_data[0],
1136 .register_dev = spi_register,
1148 .explan =
"STM32F4 SPI2",
1149 .private_data = (
void *)&spi_data[1],
1150 .register_dev = spi_register,
#define IOCMD_SPI_WRITE_CONT_WORD
2バイトデータを読み出す
void mutex_register(struct st_mutex *mutex, const char *name)
MUTEXを登録する
void eventqueue_register(struct st_event *evtque, const char *name, void *args, unsigned int size, int count)
イベントキューを登録する
void * private_data
ドライバ固有データポインタ
#define IOCMD_SPI_SPEED
com : 転送速度を設定する, arg : 転送速度(bps)
int mutex_lock(struct st_mutex *mutex, unsigned int timeout)
MUTEXをロックする
int suspend(void)
全デバイスを休止状態にする
int mutex_unlock(struct st_mutex *mutex)
MUTEXをアンロックする
#define IOCMD_SPI_WRITE_WORD
2バイトデータを書き込む
#define DEF_DEV_NAME_SPI
標準SPIマスターコントローラデバイス名
void event_clear(struct st_event *evtque)
イベントキューに登録されているイベントを削除する
int resume(void)
全デバイスを活性化する
void event_set_ISR(void *sp, struct st_event *evtque)
イベント待ちタスクを起動する
#define IOCMD_SPI_FORCE_UNLOCK
強制的にアンロック
char name[MAX_DEVNAMELRN]
デバイス名文字列
int event_wait(struct st_event *evtque, void *argp, unsigned int timeout)
タスクをイベント待ち状態にする