1 /* 2 * File : zstart.c 3 * the implemention of zmodem protocol. 4 * Change Logs: 5 * Date Author Notes 6 * 2011-03-29 itspy 7 */ 8 9 #include <rtthread.h> 10 #include <finsh.h> 11 #include <shell.h> 12 #include <dfs.h> 13 #include <dfs_file.h> 14 #include "zdef.h" 15 16 17 18 struct zmodemf zmodem; 19 20 rt_err_t zmodem_rx_ind(rt_device_t dev, rt_size_t size) 21 { 22 /* release semaphore */ 23 rt_sem_release(&zmodem.zsem); 24 25 return RT_EOK; 26 } 27 28 void finsh_rz(void *parameter) 29 { 30 char *path; 31 rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size); 32 rt_uint8_t flag; 33 34 flag = RT_DEVICE_FLAG_STREAM; 35 zmodem.device->flag &=(~flag); 36 rt_sem_init(&(zmodem.zsem), "zsem", 0, 0); 37 path = rt_thread_self()->parameter; 38 /* save old rx_indicate */ 39 rx_indicate = zmodem.device->rx_indicate; 40 /* set new rx_indicate */ 41 rt_device_set_rx_indicate(zmodem.device, RT_NULL); 42 /* start receive remote files */ 43 zr_start(path); 44 zmodem.device->flag |=flag; 45 /* recovery old rx_indicate */ 46 rt_device_set_rx_indicate(zmodem.device, rx_indicate); 47 /* finsh>> */ 48 rt_kprintf(FINSH_PROMPT); 49 } 50 void finsh_sz(void *parameter) 51 { 52 char *path; 53 rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size); 54 rt_uint8_t flag; 55 56 flag = RT_DEVICE_FLAG_STREAM; 57 zmodem.device->flag &=(~flag); 58 rt_sem_init(&(zmodem.zsem), "zsem", 0, 0); 59 path = rt_thread_self()->parameter; 60 /* save old rx_indicate */ 61 rx_indicate = zmodem.device->rx_indicate; 62 /* set new rx_indicate */ 63 rt_device_set_rx_indicate(zmodem.device, zmodem_rx_ind); 64 zs_start(path); 65 zmodem.device->flag |=flag; 66 /* recovery old rx_indicate */ 67 rt_device_set_rx_indicate(zmodem.device, rx_indicate); 68 /* finsh>> */ 69 rt_kprintf(FINSH_PROMPT); 70 } 71 72 #ifdef RT_USING_FINSH 73 #include <finsh.h> 74 #include <shell.h> 75 76 static void rz(char *para) 77 { 78 rt_thread_t init_thread; 79 rt_device_t device; 80 const char* device_name = finsh_get_device(); 81 82 device = rt_device_find(device_name); 83 if( device == RT_NULL ) 84 { 85 rt_kprintf("%s not find\r\n",device_name); 86 } 87 zmodem.device = device; 88 init_thread = rt_thread_create("rz", 89 finsh_rz, 90 (void*)para, 91 2048, 92 rt_thread_self()->current_priority+1, 93 20); 94 95 if (init_thread != RT_NULL) rt_thread_startup(init_thread); 96 } 97 FINSH_FUNCTION_EXPORT(rz, receive files by zmodem protocol) 98 static void sz(char *para) 99 { 100 rt_thread_t init_thread; 101 rt_device_t device; 102 const char* device_name = finsh_get_device(); 103 104 device = rt_device_find(device_name); 105 if( device == RT_NULL ) 106 { 107 rt_kprintf("%s not find\r\n",device_name); 108 } 109 zmodem.device = device; 110 init_thread = rt_thread_create("sz", 111 finsh_sz, 112 (void*)para, 113 2048, 114 rt_thread_self()->current_priority+1, 115 20); 116 117 if (init_thread != RT_NULL) rt_thread_startup(init_thread); 118 } 119 FINSH_FUNCTION_EXPORT(sz, send files by zmodem protocol) 120 #endif 121