123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- #include "tftp.h"
- struct tftp_context bms_tftp;
- TFTP_Handler tftp_handler;
- FIL tftp_object;
- void *bms_tftp_open(const char *fname, const char *mode, INT8U write)
- {
- INT8U res = FR_OK, err = 0; //, len = 0;
- INT8U name[MAX_FILENAME_LEN] = {0}; //, file_head[]="0:";
- // len = snprintf((char *)name, MAX_FILENAME_LEN, "0:");
- strcpy((char *)name, "0:");
- strcat((char *)name, fname);
- OSMutexPend(sd_mutex, 0, &err);
- if (write)
- {
- DeleteFile(name);
- res = f_open(&tftp_object, (const char *)name, FA_OPEN_ALWAYS | FA_WRITE);
- }
- else
- {
- res = f_open(&tftp_object, (const char *)name, FA_OPEN_EXISTING | FA_READ);
- }
- if (res == FR_OK)
- {
- tftp_handler.write = write;
- tftp_handler.type = 0;
- tftp_handler.Open_OK = TRUE;
- return &tftp_handler;
- }
- else
- {
- OSMutexPost(sd_mutex);
- return 0;
- }
- }
- void bms_tftp_close(void *handle)
- {
- // INT8U res = 0;
- if (((TFTP_Handler *)handle)->Open_OK == TRUE)
- {
- f_close(&tftp_object);
- tftp_handler.Open_OK = FALSE;
- OSMutexPost(sd_mutex);
- }
- }
- // 入参中bytes固定为512
- int bms_tftp_read(void *handle, void *buf, int bytes)
- {
- INT8U res = 0;
- INT32U bys = 0;
- if (((TFTP_Handler *)handle)->Open_OK != TRUE)
- {
- // OSMutexPost(sd_mutex);
- return -1;
- }
- res = f_read(&tftp_object, (INT8U *)buf, bytes, &bys);
- if (res == FR_OK)
- {
- return bys;
- }
- else
- {
- // OSMutexPost(sd_mutex);
- return -1;
- }
- }
- int bms_tftp_write(void *handle, struct pbuf *p)
- {
- INT8U res = 0;
- INT32U bys = 0;
- struct pbuf *q = p;
- if (((TFTP_Handler *)handle)->Open_OK != TRUE)
- {
- // OSMutexPost(sd_mutex);
- return -1;
- }
- while (q != NULL)
- {
- res = f_write(&tftp_object, q->payload, q->len, &bys);
- if (res == FR_OK)
- {
- q = q->next;
- }
- else
- {
- break;
- }
- }
- // res = f_write(&tftp_object, p->payload, p->len, &bys);
- if (res == FR_OK)
- {
- return 0;
- }
- else
- {
- // OSMutexPost(sd_mutex);
- return -1;
- }
- }
- void tftp_context_init(void)
- {
- tftp_handler.Open_OK = FALSE;
- bms_tftp.close = bms_tftp_close;
- bms_tftp.open = bms_tftp_open;
- bms_tftp.read = bms_tftp_read;
- bms_tftp.write = bms_tftp_write;
- tftp_init(&bms_tftp);
- }
|