2 * Copyright (C) 2017 C-SKY Microsystems Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 /******************************************************************************
19 * @brief source file for the devices
21 * @date 24. August 2017
22 ******************************************************************************/
25 #include <drv_usart.h>
26 #include <drv_timer.h>
32 #include <drv_eflash.h>
42 ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
44 #define writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
54 const sg_gpio_config[CONFIG_GPIO_NUM] = {
55 {CSKY_GPIO0_BASE, GPIOA_IRQn, 28, PORTA},
56 {CSKY_GPIO1_BASE, GPIOB_IRQn, 4, PORTB},
61 uint32_t cfg_idx; //idx of sg_gpio_config[]
63 const static gpio_pin_map_t s_gpio_pin_map[] = {
64 {PA0_TRIG0_ACMP1P_TCK, 0},
65 {PA1_TRIG1_ACMP1N_TMS, 0},
66 {PA2_TXD0_SPI0MISO, 0},
67 {PA3_RXD0_SPI0MOSI, 0},
68 {PA4_CTS0_PWM0_SPI0SCK_TRIG0, 0},
69 {PA5_RTS0_PWM1_SPI0SSN_TRIG1, 0},
71 {PB0_SCL0_PWM2_I2SMCLK, 1},
72 {PB1_SDA0_PWM3_I2SSCK, 1},
73 {PB2_SPI0SCK_PWM4_I2SWS, 1},
74 {PB3_SPI0MISO_PWM5_I2SSD, 1},
76 {PA6_SPI0MOSI_PWM6_SCL0, 0},
77 {PA7_SPI0SSN_PWM7_SDA0, 0},
78 {PA8_WKUP_ADC0_ACMP0P, 0},
79 {PA9_BOOT_ADC1_PWMFAULT, 0},
81 {PA11_ACMP0N_ADC3_RXD0, 0},
82 {PA12_PWM8_TCK_ADC4, 0},
83 {PA13_PWM9_TMS_ADC5, 0},
88 {PA18_SPI1SSN0_ACMP0O, 0},
89 {PA19_SPI1SSN1_ACMP1O, 0},
90 {PA20_SPI1SSN2_TRIG0_RXD1, 0},
91 {PA21_SPI1SCK_TRIG1_TXD1, 0},
92 {PA22_SPI1MISO_PWM0_ADC10, 0},
93 {PA23_SPI1MOSI_PWM1_ADC11, 0},
94 {PA24_TXD2_I2SMCLK_SPI1SSN0, 0},
95 {PA25_RXD2_I2SSCK_SPI1SSN1, 0},
96 {PA26_CTS2_I2SWS_ADC12, 0},
97 {PA27_RTS2_I2SSD_ADC13, 0}
100 int32_t target_gpio_port_init(port_name_t port, uint32_t *base, uint32_t *irq, uint32_t *pin_num)
104 for (i = 0; i < CONFIG_GPIO_NUM; i++) {
105 if (sg_gpio_config[i].port == port) {
106 *base = sg_gpio_config[i].base;
107 *irq = sg_gpio_config[i].irq;
108 *pin_num = sg_gpio_config[i].pin_num;
116 \param[in] instance idx, must not exceed return value of target_get_gpio_count()
117 \brief get gpio instance.
118 \return pointer to gpio instance
120 int32_t target_gpio_pin_init(pin_t gpio_pin, uint32_t *port_idx)
124 for (idx = 0; idx < sizeof(s_gpio_pin_map) / sizeof(gpio_pin_map_t); idx++) {
125 if (s_gpio_pin_map[idx].gpio_pin == gpio_pin) {
126 *port_idx = s_gpio_pin_map[idx].cfg_idx;
128 pin_mux(s_gpio_pin_map[idx].gpio_pin, 0xff);
131 } else if (idx >= 6) {
149 const sg_timer_config[CONFIG_TIMER_NUM] = {
150 {CSKY_TIM0_BASE, TIMA0_IRQn},
151 {CSKY_TIM0_BASE + 0x14, TIMA1_IRQn},
152 {CSKY_TIM1_BASE, TIMB0_IRQn},
153 {CSKY_TIM1_BASE + 0x14, TIMB1_IRQn}
157 int32_t target_get_timer_count(void)
159 return CONFIG_TIMER_NUM;
162 int32_t target_get_timer(int32_t idx, uint32_t *base, uint32_t *irq)
164 if (idx >= target_get_timer_count()) {
168 *base = sg_timer_config[idx].base;
169 *irq = sg_timer_config[idx].irq;
180 const sg_pmu_config[CONFIG_PMU_NUM] = {
181 {CSKY_CLKGEN_BASE, POWM_IRQn}
184 int32_t target_get_pmu(int32_t idx, uint32_t *base, uint32_t *irq)
186 if (idx > CONFIG_PMU_NUM) {
189 *base = sg_pmu_config[idx].base;
190 *irq = sg_pmu_config[idx].irq;
197 #define CSKY_PMU_BASE 0x40002000
203 const sg_rtc_config[CONFIG_RTC_NUM] = {
204 {CSKY_RTC0_BASE, RTC_IRQn},
205 {CSKY_RTC1_BASE, RTC1_IRQn}
209 int32_t target_get_rtc_count(void)
211 return CONFIG_RTC_NUM;
214 int32_t target_get_rtc(int32_t idx, uint32_t *base, uint32_t *irq)
218 if (idx >= target_get_rtc_count()) {
222 value = readl(CSKY_PMU_BASE);
224 writel(value, CSKY_PMU_BASE);
226 *base = sg_rtc_config[idx].base;
227 *irq = sg_rtc_config[idx].irq;
237 const sg_trng_config[CONFIG_TRNG_NUM] = {
242 \brief get trng instance count.
243 \return trng instance count
245 int32_t target_get_trng_count(void)
247 return CONFIG_TRNG_NUM;
251 \param[in] instance idx, must not exceed return value of target_get_trng_count()
252 \brief get trng instance.
253 \return pointer to trng instance
255 int32_t target_get_trng(int32_t idx, uint32_t *base)
257 if (idx >= target_get_trng_count()) {
261 *base = sg_trng_config[idx].base;
271 const sg_crc_config[CONFIG_CRC_NUM] = {
276 \brief get crc instance count.
277 \return crc instance count
279 int32_t target_get_crc_count(void)
281 return CONFIG_CRC_NUM;
285 \param[in] instance idx, must not exceed return value of target_get_crc_count()
286 \brief get crc instance.
287 \return pointer to crc instance
289 int32_t target_get_crc(int32_t idx, uint32_t *base)
291 if (idx >= target_get_crc_count()) {
295 *base = sg_crc_config[idx].base;
306 const sg_usart_config[CONFIG_USART_NUM] = {
307 {CSKY_UART0_BASE, UART0_IRQn},
308 {CSKY_UART1_BASE, UART1_IRQn},
309 {CSKY_UART2_BASE, UART2_IRQn},
316 uint16_t cfg_idx; //idx of sg_usart_config[]
319 const static usart_pin_map_t s_usart_pin_map[] = {
330 PA11_ACMP0N_ADC3_RXD0,
345 PA21_SPI1SCK_TRIG1_TXD1,
346 PA20_SPI1SSN2_TRIG0_RXD1,
353 PA24_TXD2_I2SMCLK_SPI1SSN0,
354 PA25_RXD2_I2SSCK_SPI1SSN1,
355 PA26_CTS2_I2SWS_ADC12,
356 PA27_RTS2_I2SSD_ADC13,
363 \param[in] instance idx, must not exceed return value of target_get_usart_count()
364 \brief get usart instance.
365 \return pointer to usart instance
367 int32_t target_usart_init(pin_t tx, pin_t rx, uint32_t *base, uint32_t *irq)
371 for (idx = 0; idx < sizeof(s_usart_pin_map) / sizeof(usart_pin_map_t); idx++) {
372 if (s_usart_pin_map[idx].tx == tx && s_usart_pin_map[idx].rx == rx) {
373 *base = sg_usart_config[s_usart_pin_map[idx].cfg_idx].base;
374 *irq = sg_usart_config[s_usart_pin_map[idx].cfg_idx].irq;
376 pin_mux(s_usart_pin_map[idx].tx, s_usart_pin_map[idx].function);
377 pin_mux(s_usart_pin_map[idx].rx, s_usart_pin_map[idx].function);
378 return s_usart_pin_map[idx].cfg_idx;
386 \brief control usart flow.
387 \param[in] tx_flow The TX flow pin name
388 \param[in] rx_flow The RX flow pin name
389 \param[in] flag 0-disable, 1-enable.
390 \return 0 if setting ready ,negative for error code
392 int32_t target_usart_flowctrl_init(pin_t tx_flow, pin_t rx_flow, uint32_t flag)
396 for (idx = 0; idx < sizeof(s_usart_pin_map) / sizeof(usart_pin_map_t); idx++) {
397 if ((s_usart_pin_map[idx].cts == tx_flow) &&(s_usart_pin_map[idx].rts == rx_flow))
401 if (idx >= sizeof(s_usart_pin_map) / sizeof(usart_pin_map_t)) {
405 if ((s_usart_pin_map[idx].cts == tx_flow) && flag) {
406 pin_mux(s_usart_pin_map[idx].cts, s_usart_pin_map[idx].function);
407 } else if ((s_usart_pin_map[idx].cts == tx_flow) && (flag == 0)) {
408 pin_mux(s_usart_pin_map[idx].cts, 0xff);
413 if ((s_usart_pin_map[idx].rts == rx_flow) && flag) {
414 pin_mux(s_usart_pin_map[idx].rts, s_usart_pin_map[idx].function);
415 } else if ((s_usart_pin_map[idx].rts == rx_flow) && (flag == 0)) {
416 pin_mux(s_usart_pin_map[idx].rts, 0xff);
432 const sg_spi_config[CONFIG_SPI_NUM] = {
433 {CSKY_SPI0_BASE, SPI0_IRQn},
434 {CSKY_SPI1_BASE, SPI1_IRQn}
441 uint32_t cfg_idx; //idx of sg_iic_config[]
444 const static spi_pin_map_t s_spi_pin_map[] = {
448 PA4_CTS0_PWM0_SPI0SCK_TRIG0,
449 PA5_RTS0_PWM1_SPI0SSN_TRIG1,
454 PB3_SPI0MISO_PWM5_I2SSD,
455 PA6_SPI0MOSI_PWM6_SCL0,
456 PB2_SPI0SCK_PWM4_I2SWS,
457 PA7_SPI0SSN_PWM7_SDA0,
462 PA22_SPI1MISO_PWM0_ADC10,
463 PA23_SPI1MOSI_PWM1_ADC11,
464 PA21_SPI1SCK_TRIG1_TXD1,
465 PA18_SPI1SSN0_ACMP0O,
472 \param[in] instance idx, must not exceed return value of target_get_spi_count()
473 \brief get spi instance.
474 \return pointer to spi instance
476 int32_t target_spi_init(pin_t mosi, pin_t miso, pin_t sclk, pin_t ssel, uint32_t *base, uint32_t *irq)
480 for (idx = 0; idx < sizeof(s_spi_pin_map) / sizeof(spi_pin_map_t); idx++) {
481 if (s_spi_pin_map[idx].mosi == mosi && s_spi_pin_map[idx].miso == miso
482 && s_spi_pin_map[idx].sclk == sclk && s_spi_pin_map[idx].ssel == ssel) {
483 *base = sg_spi_config[s_spi_pin_map[idx].cfg_idx].base;
484 *irq = sg_spi_config[s_spi_pin_map[idx].cfg_idx].irq;
486 pin_mux(s_spi_pin_map[idx].mosi, s_spi_pin_map[idx].function);
487 pin_mux(s_spi_pin_map[idx].miso, s_spi_pin_map[idx].function);
488 pin_mux(s_spi_pin_map[idx].sclk, s_spi_pin_map[idx].function);
489 pin_mux(s_spi_pin_map[idx].ssel, s_spi_pin_map[idx].function);
491 return s_spi_pin_map[idx].cfg_idx;
506 const sg_aes_config[CONFIG_AES_NUM] = {
507 {CSKY_AES_BASE, AES_IRQn}
511 \brief get aes instance count.
512 \return aes instance count
514 int32_t target_get_aes_count(void)
516 return CONFIG_AES_NUM;
520 \param[in] instance idx, must not exceed return value of target_get_aes_count()
521 \brief get aes instance.
522 \return pointer to aes instance
524 int32_t target_get_aes(int32_t idx, uint32_t *base, uint32_t *irq)
526 if (idx >= target_get_aes_count()) {
530 *base = sg_aes_config[idx].base;
531 *irq = sg_aes_config[idx].irq;
542 const sg_rsa_config[CONFIG_RSA_NUM] = {
543 {CSKY_RSA_BASE, RSA_IRQn}
547 \brief get rsa instance count.
548 \return rsa instance count
550 int32_t target_get_rsa_count(void)
552 return CONFIG_RSA_NUM;
556 \param[in] instance idx, must not exceed return value of target_get_rsa_count()
557 \brief get rsa instance.
558 \return pointer to rsa instance
560 int32_t target_get_rsa(int32_t idx, uint32_t *base, uint32_t *irq)
562 if (idx >= target_get_rsa_count()) {
566 *base = sg_rsa_config[idx].base;
567 *irq = sg_rsa_config[idx].irq;
578 const sg_eflash_config[CONFIG_EFLASH_NUM] = {
579 {CSKY_EFLASH_CONTROL_BASE, {0x10000000, 0x1003f800, 0x1fc}}
583 \brief get eflash instance count.
584 \return eflash instance count
586 int32_t target_get_eflash_count(void)
588 return CONFIG_EFLASH_NUM;
592 \param[in] instance idx, must not exceed return value of target_get_eflash_count()
593 \brief get eflash instance.
594 \return pointer to eflash instance
596 int32_t target_get_eflash(int32_t idx, uint32_t *base, eflash_info_t *info)
598 if (idx >= target_get_eflash_count()) {
602 *base = sg_eflash_config[idx].base;
603 info->start = sg_eflash_config[idx].info.start;
604 info->end = sg_eflash_config[idx].info.end;
605 info->sector_count = sg_eflash_config[idx].info.sector_count;
616 const sg_wdt_config[CONFIG_WDT_NUM] = {
617 {CSKY_WDT_BASE, WDT_IRQn}
620 int32_t target_get_wdt_count(void)
622 return CONFIG_WDT_NUM;
625 int32_t target_get_wdt(int32_t idx, uint32_t *base, uint32_t *irq)
627 if (idx >= target_get_wdt_count()) {
631 *base = sg_wdt_config[idx].base;
632 *irq = sg_wdt_config[idx].irq;
642 const sg_dmac_config[CONFIG_DMAC_NUM] = {
643 {CSKY_DMAC0_BASE, SEU_DMAC_IRQn},
644 {CSKY_DMAC1_BASE, NONSEU_DMAC_IRQn}
647 int32_t target_get_dmac_count(void)
649 return CONFIG_DMAC_NUM;
652 int32_t target_get_dmac(int32_t idx, uint32_t *base, uint32_t *irq)
654 if (idx >= target_get_dmac_count()) {
658 *base = sg_dmac_config[idx].base;
659 *irq = sg_dmac_config[idx].irq;
671 const sg_iic_config[CONFIG_IIC_NUM] = {
672 {CSKY_I2C0_BASE, I2C0_IRQn},
673 {CSKY_I2C1_BASE, I2C1_IRQn}
680 uint16_t cfg_idx; //idx of sg_iic_config[]
683 const static iic_pin_map_t s_iic_pin_map[] = {
685 PB0_SCL0_PWM2_I2SMCLK,
686 PB1_SDA0_PWM3_I2SSCK,
691 PA6_SPI0MOSI_PWM6_SCL0,
692 PA7_SPI0SSN_PWM7_SDA0,
697 PC0_SCL1_CTS1_PWM10_ADC14,
698 PC1_SDA1_RTS1_PWM11_ADC15,
706 \param[in] instance idx, must not exceed return value of target_get_iic_count()
707 \brief get iic instance.
708 \return pointer to iic instance
710 int32_t target_iic_init(pin_t scl, pin_t sda, uint32_t *base, uint32_t *irq)
714 for (idx = 0; idx < sizeof(s_iic_pin_map) / sizeof(iic_pin_map_t); idx++) {
715 if (s_iic_pin_map[idx].scl == scl && s_iic_pin_map[idx].sda == sda) {
716 *base = sg_iic_config[s_iic_pin_map[idx].cfg_idx].base;
717 *irq = sg_iic_config[s_iic_pin_map[idx].cfg_idx].irq;
719 if (s_iic_pin_map[idx].cfg_idx == 0) {
720 pin_mux(s_iic_pin_map[idx].scl, s_iic_pin_map[idx].function);
721 pin_mux(s_iic_pin_map[idx].sda, s_iic_pin_map[idx].function);
723 return s_iic_pin_map[idx].cfg_idx;
737 const sg_pwm_config[CONFIG_PWM_NUM] = {
738 {CSKY_PWM_BASE, PWM_IRQn},
743 uint32_t cfg_idx; //idx of sg_pwm_config[]
747 const static pwm_pin_map_t s_pwm_pin_map[] = {
748 {PA4_CTS0_PWM0_SPI0SCK_TRIG0, 0, 0, 1},
749 {PA5_RTS0_PWM1_SPI0SSN_TRIG1, 0, 0, 1},
750 {PB0_SCL0_PWM2_I2SMCLK, 0, 1, 1},
751 {PB1_SDA0_PWM3_I2SSCK, 0, 1, 1},
753 {PB2_SPI0SCK_PWM4_I2SWS, 0, 2, 1},
754 {PB3_SPI0MISO_PWM5_I2SSD, 0, 2, 1},
755 {PA6_SPI0MOSI_PWM6_SCL0, 0, 3, 1},
756 {PA7_SPI0SSN_PWM7_SDA0, 0, 3, 1},
758 {PA12_PWM8_TCK_ADC4, 0, 4, 0},
759 {PA13_PWM9_TMS_ADC5, 0, 4, 0},
760 {PA14_PWM10_ADC6, 0, 5, 0},
761 {PA15_PWM11_ADC7, 0, 5, 0},
763 {PA22_SPI1MISO_PWM0_ADC10, 0, 0, 1},
764 {PA23_SPI1MOSI_PWM1_ADC11, 0, 0, 1},
765 {PC0_SCL1_CTS1_PWM10_ADC14, 0, 5, 2},
766 {PC1_SDA1_RTS1_PWM11_ADC15, 0, 5, 2}
771 \param[in] instance idx, must not exceed return value of target_get_pwm_count()
772 \brief get pwm instance.
773 \return pointer to pwm instance
775 int32_t target_pwm_init(pin_t pwm_pin, uint32_t *ch_num, uint32_t *base, uint32_t *irq)
779 for (idx = 0; idx < sizeof(s_pwm_pin_map) / sizeof(pwm_pin_map_t); idx++) {
780 if (s_pwm_pin_map[idx].pwm_pin == pwm_pin) {
781 *base = sg_pwm_config[s_pwm_pin_map[idx].cfg_idx].base;
782 *irq = sg_pwm_config[s_pwm_pin_map[idx].cfg_idx].irq;
783 *ch_num = s_pwm_pin_map[idx].ch_num;
785 pin_mux(s_pwm_pin_map[idx].pwm_pin, s_pwm_pin_map[idx].function);
786 return s_pwm_pin_map[idx].cfg_idx;
800 const sg_sha_config[CONFIG_SHA_NUM] = {
801 {CSKY_SHA_BASE, SHA_IRQn}
805 \brief get sha instance count.
806 \return sha instance count
808 int32_t target_get_sha_count(void)
810 return CONFIG_SHA_NUM;
814 \param[in] instance idx, must not exceed return value of target_get_sha_count()
815 \brief get sha instance.
816 \return pointer to sha instance
818 int32_t target_get_sha(int32_t idx, uint32_t *base, uint32_t *irq)
820 if (idx >= target_get_sha_count()) {
824 *base = sg_sha_config[idx].base;
825 *irq = sg_sha_config[idx].irq;