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