forked from xuos/xiuos
				
			support Ch376 for xidatong-riscv64 in XiZi Kernel
This commit is contained in:
		
							parent
							
								
									c5872c051e
								
							
						
					
					
						commit
						cd850b90cd
					
				|  | @ -39,9 +39,9 @@ menu "xidatong-riscv64 feature" | |||
|             config MOUNT_SDCARD | ||||
|                 bool "mount cd card" | ||||
|                 default n | ||||
|                 select BSP_USING_SPI | ||||
|                 select BSP_USING_SPI1 | ||||
|                 select RESOURCES_SPI_SD | ||||
|             config MOUNT_USB | ||||
|                 bool "mount usb" | ||||
|                 default n | ||||
|         endmenu | ||||
| 
 | ||||
|     endmenu | ||||
|  |  | |||
|  | @ -58,32 +58,42 @@ extern int IoConfigInit(void); | |||
| extern int HwI2cInit(void); | ||||
| extern int HwTouchInit(void); | ||||
| extern int HwCh438Init(void); | ||||
| extern int HwCh376Init(void); | ||||
| 
 | ||||
| #if defined(FS_VFS) && defined (MOUNT_SDCARD) | ||||
| #ifdef FS_CH376 | ||||
| #include <iot-vfs.h> | ||||
| #include <sd_spi.h> | ||||
| extern SpiSdDeviceType SpiSdInit(struct Bus *bus, const char *dev_name, const char *drv_name, const char *sd_name); | ||||
| #ifdef MOUNT_USB | ||||
| /**
 | ||||
|  * @description: Mount USB | ||||
|  * @return 0 | ||||
|  */ | ||||
| int  MountUSB(void) | ||||
| { | ||||
|     if (MountFilesystem(USB_BUS_NAME, USB_DEVICE_NAME, USB_DRIVER_NAME, FSTYPE_CH376, "/") == 0) | ||||
|         KPrintf("usb mount to '/'\n"); | ||||
|     else | ||||
|         KPrintf("usb mount to '/' failed!\n"); | ||||
|      | ||||
|     return 0; | ||||
| } | ||||
| #endif | ||||
| #ifdef MOUNT_SDCARD | ||||
| /**
 | ||||
|  * @description: Mount SD card | ||||
|  * @return 0 | ||||
|  */ | ||||
| 
 | ||||
| int  MountSDCard(void) | ||||
| { | ||||
|     struct Bus *spi_bus; | ||||
|     spi_bus = BusFind(SPI_BUS_NAME_1); | ||||
| 
 | ||||
|     if (NONE == SpiSdInit(spi_bus, SPI_1_DEVICE_NAME_0, SPI_1_DRV_NAME, SPI_SD_NAME)) { | ||||
|         KPrintf("MountSDCard SpiSdInit error!\n"); | ||||
|         return 0; | ||||
|     } | ||||
|      | ||||
|     if (EOK == MountFilesystem(SPI_BUS_NAME_1, SPI_SD_NAME, SPI_1_DRV_NAME, FSTYPE_FATFS, "/")) | ||||
|         KPrintf("SPI SD card fatfs mounted\n"); | ||||
|     if (MountFilesystem(SDIO_BUS_NAME,SDIO_DEVICE_NAME ,SDIO_DRIVER_NAME , FSTYPE_CH376, "/") == 0) | ||||
|         KPrintf("sd card mount to '/'\n"); | ||||
|     else | ||||
|         KPrintf("sd card mount to '/' failed!\n"); | ||||
|      | ||||
|     return 0; | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| void InitBss(void) | ||||
| { | ||||
|  | @ -164,6 +174,12 @@ struct InitSequenceDesc _board_init[] = | |||
| #ifdef BSP_USING_I2C | ||||
|     { "hw_i2c", HwI2cInit }, | ||||
| #endif | ||||
| #ifdef BSP_USING_SDIO | ||||
|     { "hw_sdio", HwCh376Init}, | ||||
| #endif | ||||
| #ifdef BSP_USING_USB | ||||
|     { "hw_usb", HwCh376Init}, | ||||
| #endif | ||||
| #ifdef BSP_USING_TOUCH | ||||
|     {"touch", HwTouchInit }, | ||||
| #endif | ||||
|  |  | |||
|  | @ -1,3 +1,12 @@ | |||
| menuconfig BSP_USING_CH376 | ||||
| bool "Using CH376 device" | ||||
| default n | ||||
| select FS_VFS | ||||
| select FS_CH376 | ||||
| if BSP_USING_CH376 | ||||
| source "$BSP_DIR/third_party_driver/ch376/Kconfig" | ||||
| endif | ||||
| 
 | ||||
| menuconfig BSP_USING_CH438 | ||||
| bool "Using CH438 device" | ||||
| default n | ||||
|  |  | |||
|  | @ -1,5 +1,9 @@ | |||
| SRC_FILES := sleep.c | ||||
| 
 | ||||
| ifeq ($(CONFIG_BSP_USING_CH376),y) | ||||
|   SRC_DIR += ch376 | ||||
| endif | ||||
| 
 | ||||
| ifeq ($(CONFIG_BSP_USING_CH438),y) | ||||
|   SRC_DIR += ch438 | ||||
| endif | ||||
|  |  | |||
|  | @ -0,0 +1,37 @@ | |||
| menuconfig BSP_USING_SDIO | ||||
| bool "Using CH376 SD card" | ||||
| default n | ||||
| select RESOURCES_SDIO | ||||
| select MOUNT_SDCARD | ||||
| if BSP_USING_SDIO | ||||
| config SDIO_BUS_NAME | ||||
|     string "sdio bus name" | ||||
|     default "sdio" | ||||
| 
 | ||||
| config SDIO_DRIVER_NAME | ||||
|     string "sdio driver name" | ||||
|     default "sdio_drv" | ||||
| 
 | ||||
| config SDIO_DEVICE_NAME | ||||
|     string "sdio device name" | ||||
|     default "sdio_dev" | ||||
| endif | ||||
| 
 | ||||
| menuconfig BSP_USING_USB | ||||
| bool "Using CH376 USB" | ||||
| default n | ||||
| select RESOURCES_USB | ||||
| select MOUNT_USB | ||||
| if BSP_USING_USB | ||||
| config USB_BUS_NAME | ||||
|     string "USB bus name" | ||||
|     default "usb" | ||||
| 
 | ||||
| config USB_DRIVER_NAME | ||||
|     string "USB driver name" | ||||
|     default "usb_drv" | ||||
| 
 | ||||
| config USB_DEVICE_NAME | ||||
|     string "USB device name" | ||||
|     default "usb_dev" | ||||
| endif | ||||
|  | @ -0,0 +1,4 @@ | |||
| SRC_FILES := connect_ch376.c | ||||
| 
 | ||||
| 
 | ||||
| include $(KERNEL_ROOT)/compiler.mk | ||||
|  | @ -0,0 +1,224 @@ | |||
| /*
 | ||||
| * Copyright (c) 2020 AIIT XUOS Lab | ||||
| * XiUOS is licensed under Mulan PSL v2. | ||||
| * You can use this software according to the terms and conditions of the Mulan PSL v2. | ||||
| * You may obtain a copy of Mulan PSL v2 at: | ||||
| *        http://license.coscl.org.cn/MulanPSL2
 | ||||
| * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, | ||||
| * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, | ||||
| * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. | ||||
| * See the Mulan PSL v2 for more details. | ||||
| */ | ||||
| 
 | ||||
| /**
 | ||||
| * @file connect_ch376.c | ||||
| * @brief support to register ch376 pointer and function | ||||
| * @version 2.0  | ||||
| * @author AIIT XUOS Lab | ||||
| * @date 2022-09-28 | ||||
| */ | ||||
| 
 | ||||
| #include <ch376fs.h> | ||||
| #include <connect_ch376.h> | ||||
| 
 | ||||
| static struct HwCh376 ch376; | ||||
| 
 | ||||
| static uint32 Ch376Configure(void *drv, struct BusConfigureInfo *configure_info) | ||||
| { | ||||
|     NULL_PARAM_CHECK(drv); | ||||
|     NULL_PARAM_CHECK(configure_info); | ||||
| 
 | ||||
|     uint8 temp[2]; | ||||
|     temp[0] = 0x57; | ||||
|     temp[1] = 0xab; | ||||
|     MdelayKTask(100); | ||||
| 
 | ||||
|     struct BusBlockWriteParam write_param; | ||||
|     write_param.pos = 0; | ||||
|     write_param.buffer = (void *)temp; | ||||
|     write_param.size = 2; | ||||
|     BusDevWriteData(ch376.dev, &write_param); | ||||
| 
 | ||||
|     write_param.pos = 0; | ||||
|     write_param.buffer = &configure_info->configure_cmd; | ||||
|     write_param.size = 1; | ||||
|     BusDevWriteData(ch376.dev, &write_param); | ||||
| 
 | ||||
|     return EOK; | ||||
| } | ||||
| 
 | ||||
| static int HwCh376RxInd(void *dev, x_size_t length) | ||||
| { | ||||
|     ch376.msg_len += length; | ||||
|     KSemaphoreAbandon(ch376.sem); | ||||
| 
 | ||||
|     return EOK; | ||||
| } | ||||
| 
 | ||||
| static uint32 Ch376Open(void *dev) | ||||
| { | ||||
|     NULL_PARAM_CHECK(dev); | ||||
| 
 | ||||
|     ch376.sem = KSemaphoreCreate(0); | ||||
|     if (ch376.sem < 0) { | ||||
|         KPrintf("CH376 open fail\n"); | ||||
|         return -ERROR; | ||||
|     } | ||||
| 
 | ||||
|     struct Bus *bus = BusFind(SERIAL_BUS_NAME_3); | ||||
|     struct Driver *bus_driver = BusFindDriver(bus, SERIAL_DRV_NAME_3); | ||||
|     ch376.dev = BusFindDevice(bus, SERIAL_3_DEVICE_NAME_0); | ||||
|     if (!ch376.dev) { | ||||
|         KPrintf("CH376 open fail\n"); | ||||
|         return -ERROR; | ||||
|     } | ||||
| 
 | ||||
|     struct SerialCfgParam serial_cfg; | ||||
|     memset(&serial_cfg, 0, sizeof(struct SerialCfgParam)); | ||||
|     serial_cfg.data_cfg.serial_buffer_size = 512; | ||||
|     struct BusConfigureInfo cfg; | ||||
|     cfg.configure_cmd = OPE_INT; | ||||
|     cfg.private_data = &serial_cfg; | ||||
| 
 | ||||
|     BusDrvConfigure(bus_driver, &cfg); | ||||
| 
 | ||||
|     bus->match(bus_driver, ch376.dev); | ||||
| 
 | ||||
|     struct SerialDevParam *serial_dev_param = (struct SerialDevParam *)ch376.dev->private_data; | ||||
|     serial_dev_param->serial_set_mode = SIGN_OPER_INT_RX; | ||||
|     BusDevOpen(ch376.dev); | ||||
| 
 | ||||
|     BusDevRecvCallback(ch376.dev, HwCh376RxInd); | ||||
| 
 | ||||
|     KPrintf("CH376 open done\n"); | ||||
| 
 | ||||
|     return EOK; | ||||
| } | ||||
| 
 | ||||
| static uint32 Ch376Close(void *dev) | ||||
| { | ||||
|     BusDevClose(ch376.dev); | ||||
|     KSemaphoreDelete(ch376.sem); | ||||
| 
 | ||||
|     return EOK; | ||||
| } | ||||
| 
 | ||||
| static uint32 Ch376Write(void *dev, struct BusBlockWriteParam *write_param) | ||||
| { | ||||
|     if (EOK == BusDevWriteData(ch376.dev, write_param)) | ||||
|         return EOK; | ||||
| 
 | ||||
|     return -ERROR; | ||||
| } | ||||
| 
 | ||||
| static uint32 Ch376Read(void *dev, struct BusBlockReadParam *read_param) | ||||
| { | ||||
|     if (KSemaphoreObtain(ch376.sem, WAITING_FOREVER) == EOK) { | ||||
|         while(KSemaphoreObtain(ch376.sem, TICK_PER_SECOND) != -ETIMEOUT); | ||||
|         read_param->size = ch376.msg_len; | ||||
|         BusDevReadData(ch376.dev, read_param); | ||||
|         ch376.msg_len = 0; | ||||
|     } | ||||
|      | ||||
|     return read_param->read_length; | ||||
| } | ||||
| 
 | ||||
| #ifdef BSP_USING_SDIO | ||||
| static struct SdioDevDone sdio_done =  | ||||
| { | ||||
|     Ch376Open, | ||||
|     Ch376Close, | ||||
|     Ch376Write, | ||||
|     Ch376Read, | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| #ifdef BSP_USING_USB | ||||
| static struct UsbDevDone usb_done =  | ||||
| { | ||||
|     Ch376Open, | ||||
|     Ch376Close, | ||||
|     Ch376Write, | ||||
|     Ch376Read, | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| int HwCh376Init(void) | ||||
| { | ||||
|     x_err_t ret = EOK; | ||||
| 
 | ||||
| #ifdef BSP_USING_SDIO | ||||
|     static struct SdioBus sdio_bus; | ||||
|     static struct SdioDriver sdio_drv; | ||||
|     static struct SdioHardwareDevice sdio_dev; | ||||
| 
 | ||||
|     ret = SdioBusInit(&sdio_bus,SDIO_BUS_NAME ); | ||||
|     if (ret != EOK) { | ||||
|         KPrintf("Sdio bus init error %d\n", ret); | ||||
|         return -ERROR; | ||||
|     } | ||||
| 
 | ||||
|     sdio_drv.configure = &Ch376Configure; | ||||
|     ret = SdioDriverInit(&sdio_drv, SDIO_DRIVER_NAME); | ||||
|     if (ret != EOK) { | ||||
|         KPrintf("Sdio driver init error %d\n", ret); | ||||
|         return -ERROR; | ||||
|     } | ||||
| 
 | ||||
|     ret = SdioDriverAttachToBus( SDIO_DRIVER_NAME, SDIO_BUS_NAME); | ||||
|     if (ret != EOK) { | ||||
|         KPrintf("Sdio driver attach error %d\n", ret); | ||||
|         return -ERROR; | ||||
|     } | ||||
| 
 | ||||
|     sdio_dev.dev_done = &sdio_done; | ||||
|     ret = SdioDeviceRegister(&sdio_dev, SDIO_DEVICE_NAME); | ||||
|     if (ret != EOK) { | ||||
|         KPrintf("Sdio device register error %d\n", ret); | ||||
|         return -ERROR; | ||||
|     } | ||||
| 
 | ||||
|     ret = SdioDeviceAttachToBus(SDIO_DEVICE_NAME, SDIO_BUS_NAME); | ||||
|     if (ret != EOK) { | ||||
|         KPrintf("Sdio device register error %d\n", ret); | ||||
|         return -ERROR; | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef BSP_USING_USB | ||||
|     static struct UsbBus usb_bus; | ||||
|     static struct UsbDriver usb_drv; | ||||
|     static struct UsbHardwareDevice usb_dev; | ||||
|      | ||||
|     ret = UsbBusInit(&usb_bus, USB_BUS_NAME); | ||||
|     if (ret != EOK) { | ||||
|         KPrintf("USB bus init error %d\n", ret); | ||||
|         return -ERROR; | ||||
|     } | ||||
| 
 | ||||
|     usb_drv.configure = &Ch376Configure; | ||||
|     ret = UsbDriverInit(&usb_drv, USB_DRIVER_NAME); | ||||
|     if (ret != EOK) { | ||||
|         KPrintf("USB driver init error %d\n", ret); | ||||
|         return -ERROR; | ||||
|     } | ||||
|     ret = UsbDriverAttachToBus(USB_DRIVER_NAME, USB_BUS_NAME); | ||||
|     if (ret != EOK) { | ||||
|         KPrintf("USB driver attach error %d\n", ret); | ||||
|         return -ERROR; | ||||
|     } | ||||
| 
 | ||||
|     usb_dev.dev_done = &usb_done; | ||||
|     ret = USBDeviceRegister(&usb_dev, NONE, USB_DEVICE_NAME); | ||||
|     if (ret != EOK) { | ||||
|         KPrintf("USB device register error %d\n", ret); | ||||
|         return -ERROR; | ||||
|     } | ||||
|     ret = USBDeviceAttachToBus(USB_DEVICE_NAME, USB_BUS_NAME); | ||||
|     if (ret != EOK) { | ||||
|         KPrintf("USB device register error %d\n", ret); | ||||
|         return -ERROR; | ||||
|     } | ||||
| #endif | ||||
|     return ret; | ||||
| } | ||||
|  | @ -71,8 +71,8 @@ static struct io_config | |||
|     IOCONFIG(BSP_UART2_RXD_PIN, FUNC_UART2_RX), | ||||
| #endif | ||||
| #ifdef BSP_USING_UART3 | ||||
|     IOCONFIG(BSP_UART3_TXD_PIN, FUNC_UART3_TX), | ||||
|     IOCONFIG(BSP_UART3_RXD_PIN, FUNC_UART3_RX), | ||||
|     IOCONFIG(BSP_UART3_TXD_PIN, FUNC_UART3_RX), | ||||
|     IOCONFIG(BSP_UART3_RXD_PIN, FUNC_UART3_TX), | ||||
| #endif | ||||
| #ifdef BSP_USING_I2C1 | ||||
|     IOCONFIG(BSP_I2C_SDA, FUNC_GPIO3), | ||||
|  |  | |||
|  | @ -0,0 +1,36 @@ | |||
| /*
 | ||||
| * Copyright (c) 2020 AIIT XUOS Lab | ||||
| * XiUOS is licensed under Mulan PSL v2. | ||||
| * You can use this software according to the terms and conditions of the Mulan PSL v2. | ||||
| * You may obtain a copy of Mulan PSL v2 at: | ||||
| *        http://license.coscl.org.cn/MulanPSL2
 | ||||
| * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, | ||||
| * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, | ||||
| * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. | ||||
| * See the Mulan PSL v2 for more details. | ||||
| */ | ||||
|   | ||||
| /**
 | ||||
| * @file connect_ch376.h | ||||
| * @brief define xidatong-riscv64 ch376 function and struct | ||||
| * @version 2.0  | ||||
| * @author AIIT XUOS Lab | ||||
| * @date 2022-09-28 | ||||
| */ | ||||
| 
 | ||||
| #ifndef CONNECT_CH376_H | ||||
| #define CONNECT_CH376_H | ||||
| 
 | ||||
| #include <device.h> | ||||
| 
 | ||||
| struct HwCh376 | ||||
| { | ||||
|     HardwareDevType dev; | ||||
|     x_size_t msg_len; | ||||
|     int sem; | ||||
|     KTaskDescriptorType task; | ||||
| }; | ||||
| 
 | ||||
| int HwCh376Init(void); | ||||
| 
 | ||||
| #endif | ||||
		Loading…
	
		Reference in New Issue