diff --git a/bsp/mini2440/SConstruct b/bsp/mini2440/SConstruct index f93b4acd33..8d6ae425bd 100644 --- a/bsp/mini2440/SConstruct +++ b/bsp/mini2440/SConstruct @@ -42,7 +42,10 @@ if rtconfig.RT_USING_RTGUI: objs = objs + SConscript(RTT_ROOT + '/rtgui/SConscript', variant_dir='build/rtgui', duplicate=0) objs = objs + SConscript(RTT_ROOT + '/examples/gui/SConscript', variant_dir='build/examples/gui', duplicate=0) -src_bsp = ['application.c', 'startup.c', 'board.c', 'rtc_calendar.c' ] +if rtconfig.RT_USING_MODBUS: + objs = objs + SConscript(RTT_ROOT + '/net/freemodbus/SConscript', variant_dir='build/net/freemodbus', duplicate=0) + +src_bsp = ['application.c', 'startup.c', 'board.c', 'rtc_calendar.c', 'info.c', 'today.c', 'picture.c', 'osc.c', 'device_info.c', 'run_module.c'] src_drv = ['console.c', 'led.c'] if rtconfig.RT_USING_DFS: diff --git a/bsp/mini2440/mini2440_ram.ld b/bsp/mini2440/mini2440_ram.ld index 95856f2688..9eb287ffd6 100644 --- a/bsp/mini2440/mini2440_ram.ld +++ b/bsp/mini2440/mini2440_ram.ld @@ -22,6 +22,12 @@ SECTIONS KEEP(*(VSymTab)) __vsymtab_end = .; . = ALIGN(4); + + /* section information for modules */ + . = ALIGN(4); + __rtmsymtab_start = .; + KEEP(*(RTMSymTab)) + __rtmsymtab_end = .; } . = ALIGN(4); diff --git a/bsp/mini2440/network.xpm b/bsp/mini2440/network.xpm new file mode 100644 index 0000000000..6e47ce1fa6 --- /dev/null +++ b/bsp/mini2440/network.xpm @@ -0,0 +1,172 @@ +/* XPM */ +static char * network_xpm[] = { +"24 24 145 2", +" c None", +". c #6C6E6A", +"+ c #676965", +"@ c #6B6D6A", +"# c #C6C8C4", +"$ c #F0F1F0", +"% c #F1F1F0", +"& c #C8CAC6", +"* c #646662", +"= c #446795", +"- c #27508B", +"; c #2A538D", +"> c #2E558F", +", c #315890", +"' c #355B92", +") c #385E94", +"! c #3C6196", +"~ c #5C7BA2", +"{ c #F2F3F2", +"] c #626460", +"^ c #F2F2F2", +"/ c #3E6297", +"( c #86ACD5", +"_ c #88AED6", +": c #8BB0D7", +"< c #8DB1D7", +"[ c #8CB1D7", +"} c #8CB0D6", +"| c #8DAED6", +"1 c #5B7AA7", +"2 c #F4F4F4", +"3 c #61635F", +"4 c #30578F", +"5 c #88ADD6", +"6 c #8EB1D7", +"7 c #92B3D8", +"8 c #96B6D8", +"9 c #92B2D6", +"0 c #8CADD3", +"a c #84A7CF", +"b c #5F615D", +"c c #204A87", +"d c #6694C7", +"e c #6391C5", +"f c #618FC3", +"g c #5E8CC1", +"h c #5B8ABF", +"i c #5887BD", +"j c #5684BB", +"k c #5D5F5B", +"l c #5D8CC0", +"m c #5A89BE", +"n c #5886BD", +"o c #5584BB", +"p c #5281B9", +"q c #4F7FB7", +"r c #4D7CB5", +"s c #5C5E5A", +"t c #5482BA", +"u c #5180B8", +"v c #4F7EB6", +"w c #4C7BB4", +"x c #4979B2", +"y c #4676B1", +"z c #4373AF", +"A c #5A5C58", +"B c #406492", +"C c #31527F", +"D c #656D70", +"E c #5E605B", +"F c #C3C4C1", +"G c #80827F", +"H c #C8CAC7", +"I c #545651", +"J c #5E605C", +"K c #6A6E68", +"L c #72756F", +"M c #7B7E79", +"N c #848781", +"O c #8D908A", +"P c #969993", +"Q c #9FA29C", +"R c #416593", +"S c #244E89", +"T c #29518C", +"U c #2D558E", +"V c #325991", +"W c #375C93", +"X c #3B6096", +"Y c #5D7BA3", +"Z c #555753", +"` c #D0D2CE", +" . c #BBBEB7", +".. c #BABDB6", +"+. c #F2F2F1", +"@. c #345A92", +"#. c #81A8D3", +"$. c #83ABD4", +"%. c #8AAFD6", +"&. c #8FB3D8", +"*. c #92B4DA", +"=. c #5978A6", +"-. c #D2D4D1", +";. c #2C548E", +">. c #85ACD5", +",. c #92B5DA", +"'. c #98B9DB", +"). c #95B6DA", +"!. c #90B2D7", +"~. c #88ACD3", +"{. c #464644", +"]. c #719ECE", +"^. c #6E9BCC", +"/. c #6A98C9", +"(. c #6794C7", +"_. c #608EC2", +":. c #5C8BC0", +"<. c #757773", +"[. c #DADAD9", +"}. c #6391C4", +"|. c #5F8DC2", +"1. c #5C8ABF", +"2. c #5181B8", +"3. c #7F817C", +"4. c #ECECEA", +"5. c #5B89BF", +"6. c #5483BA", +"7. c #4D7DB6", +"8. c #4A7AB3", +"9. c #4776B1", +"0. c #80827D", +"a. c #EEEEEC", +"b. c #3F6392", +"c. c #82847F", +"d. c #848680", +"e. c #7F817D", +"f. c #7D7F7B", +"g. c #666863", +"h. c #A8ACA5", +"i. c #B1B3AC", +"j. c #E1E1DE", +"k. c #EDEDEB", +"l. c #E0E0DE", +"m. c #565854", +"n. c #767874", +" ", +" . + + + + + + + + + . ", +" @ # $ % % % % % % % $ & @ ", +" * $ = - ; > , ' ) ! ~ { * ", +" ] ^ / ( _ : < [ } | 1 2 ] ", +" 3 % 4 5 6 7 8 9 0 a ) % 3 ", +" b % c d e f g h i j c % b ", +" k % c l m n o p q r c % k ", +" s % c t u v w x y z c % s ", +" A $ B c c c c c c C D + + + + + + + + + . ", +" E F $ % % % % % % G # $ % % % % % % % $ H @ ", +" I J K L M N O P Q * $ R c S T U V W X Y { * ", +" Z ` .............] +.@.#.$.( %.[ &.*.=.2 ] ", +" Z -.+.+.+.+.+.+.+.3 % ;.>.: ,.'.).!.~.W % 3 ", +" {.Z Z Z Z Z Z Z Z b % c ].^./.(.e _.:.c % b ", +" <.[.<. k % c d }.|.1.i o 2.c % k ", +" 3.4.3. s % c 5.i 6.u 7.8.9.c % s ", +" 0.a.0. A $ B c c c c c c c b.$ A ", +" c...c. E F $ % % % % % % % $ F E ", +" 0.a.0.d.0.e.f.g.J K L M N O P Q h.i.J I ", +" 0.j.a...a.k.l.m.` ............... .` Z ", +" 0.0.c.0.3.n.Z -.+.+.+.+.+.+.+.+.+.-.Z ", +" {.Z Z Z Z Z Z Z Z Z Z Z {. ", +" "}; diff --git a/bsp/mini2440/network_disconnect.xpm b/bsp/mini2440/network_disconnect.xpm new file mode 100644 index 0000000000..4b9ba17e15 --- /dev/null +++ b/bsp/mini2440/network_disconnect.xpm @@ -0,0 +1,98 @@ +/* XPM */ +static char * network_disconnect_xpm[] = { +"24 24 71 1", +" c None", +". c #191918", +"+ c #181817", +"@ c #808080", +"# c #EDEDED", +"$ c #6B6B6A", +"% c #161615", +"& c #D8D8D8", +"* c #484848", +"= c #A4A4A4", +"- c #E6E6E6", +"; c #F3F3F3", +"> c #F5F5F6", +", c #C0C0C5", +"' c #F3F3F4", +") c #F0F0F0", +"! c #B7B4C3", +"~ c #B7B5C4", +"{ c #F5F5F5", +"] c #A19DB2", +"^ c #EEEEEE", +"/ c #B6B4C3", +"( c #B7B5C3", +"_ c #B3B1C1", +": c #B5B3C1", +"< c #EAEAEB", +"[ c #EFEFEF", +"} c #A19EB2", +"| c #A09CB1", +"1 c #928FA2", +"2 c #676571", +"3 c #D3D3D3", +"4 c #2A2A2A", +"5 c #090909", +"6 c #8B8B8B", +"7 c #0F0F0E", +"8 c #2A2A29", +"9 c #70706F", +"0 c #898988", +"a c #A8A8A8", +"b c #0E0E0D", +"c c #D1D1D1", +"d c #ECECEC", +"e c #EBEBEB", +"f c #D9D9D9", +"g c #C1C1C1", +"h c #B7B7B7", +"i c #BCBCBC", +"j c #141413", +"k c #7F7F7E", +"l c #B6B6B5", +"m c #C8C8C7", +"n c #C0C0C0", +"o c #949494", +"p c #E5E5E5", +"q c #5D5D5C", +"r c #242423", +"s c #9A9A99", +"t c #C8C8C8", +"u c #C5C5C5", +"v c #E8E8E8", +"w c #BABABA", +"x c #DEDEDE", +"y c #D5D5D5", +"z c #C2C2C2", +"A c #B3B3B3", +"B c #909090", +"C c #B6B6B6", +"D c #C4C4C4", +"E c #1F1F1D", +"F c #000000", +" ", +" .........+ ", +" +@#########$% ", +" .#&*******=-. ", +" .;*>,,>,,'*). ", +" .)*!~~~>{]*). ", +" .^*/(_:<<]*[. ", +" .^*}}|}<<]*^. ", +" .#*]]]]]12.........+ ", +" .;3*****4@#########$% ", +" 56######.#&*******=-. ", +" 7890aaaa.;*>,,>,,'*). ", +" b;)cdeee.)*!~~~>{]*). ", +" bfghiiii.^*/(_:<<]*[. ", +" j........^*}}|}<<]*^. ", +" klk .#*]]]]]]]*#. ", +" kmk .;3*******n#. ", +" k3k 56#########o. ", +" kpk 7890aaaa09q.r ", +" kpskkkkb;)cdeeetuuv. ", +" kwxyzABbfghiiiiCcyD. ", +" kkkkkkE...........F ", +" ", +" "}; diff --git a/bsp/mini2440/osc.c b/bsp/mini2440/osc.c new file mode 100644 index 0000000000..b2cd90439a --- /dev/null +++ b/bsp/mini2440/osc.c @@ -0,0 +1,131 @@ +#include +#include +#include + +#include +#include + +#define POINT_LENGTH 320 +static rt_uint8_t points[POINT_LENGTH]; +static rt_uint8_t old_point, fudu = 1; +static rt_uint16_t current_point = 0; + +static rtgui_view_t *osc_view = RT_NULL; +static rtgui_timer_t *osc_timer; + +#include + +void osc_timeout(struct rtgui_timer* timer, void* parameter) +{ + struct rtgui_dc* dc; + rtgui_color_t saved; + const double PI=3.141592653589793238462643383279; + + dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(osc_view)); + if (dc == RT_NULL) return ; + + saved = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(osc_view)); + RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(osc_view)) = + RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(osc_view)); + if (current_point != 0) + rtgui_dc_draw_line(dc, current_point - 1, old_point, current_point, points[current_point]); + else + rtgui_dc_draw_point(dc, current_point, points[current_point]); + + RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(osc_view)) = saved; + + old_point = points[current_point]; + points[current_point] = 100 * sin((current_point * 4 * fudu) * PI / POINT_LENGTH) + 100; + if (current_point != 0) + rtgui_dc_draw_line(dc, current_point - 1, points[current_point - 1], current_point, points[current_point]); + else + rtgui_dc_draw_point(dc, current_point, points[current_point]); + + current_point ++; + if (current_point == POINT_LENGTH) + { + current_point = 0; + fudu ++; + if (fudu == 4) fudu = 1; + } + + rtgui_dc_end_drawing(dc); +} + +static rt_bool_t osc_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) +{ + switch (event->type) + { + case RTGUI_EVENT_PAINT: + { + struct rtgui_dc* dc; + struct rtgui_rect rect; + int index; + + dc = rtgui_dc_begin_drawing(widget); + if (dc == RT_NULL) return RT_FALSE; + rtgui_widget_get_rect(widget, &rect); + + rtgui_dc_fill_rect(dc, &rect); + for (index = 0; index < 320; index ++) + rtgui_dc_draw_point(dc, index, points[index]); + rtgui_dc_end_drawing(dc); + + return RT_FALSE; + } + + case RTGUI_EVENT_KBD: + { + struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; + if ((ekbd->type == RTGUI_KEYDOWN) && (ekbd->key == RTGUIK_RETURN)) + { + rtgui_workbench_t* workbench; + + /* stop timer */ + rtgui_timer_destory(osc_timer); + /* clean points */ + rt_memset(points, 0xff, sizeof(points)); + current_point = 0; + + /* close this view */ + workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(osc_view)->parent); + rtgui_workbench_remove_view(workbench, osc_view); + rtgui_view_destroy(osc_view); + + osc_view = RT_NULL; + fudu = 0; + return RT_FALSE; + } + } + } + + return rtgui_view_event_handler(widget, event); +} + +rtgui_view_t *osc_view_create(struct rtgui_workbench* workbench) +{ + if (osc_view != RT_NULL) + { + rtgui_view_show(osc_view, RT_FALSE); + } + else + { + /* create picture view */ + osc_view = rtgui_view_create("Oscilloscope"); + rtgui_widget_set_event_handler(RTGUI_WIDGET(osc_view), + osc_view_event_handler); + + rtgui_workbench_add_view(workbench, osc_view); + /* this view can be focused */ + RTGUI_WIDGET(osc_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; + + rt_memset(points, 0xff, sizeof(points)); + + osc_timer = rtgui_timer_create(8, + RT_TIMER_FLAG_PERIODIC, + osc_timeout, RT_NULL); + rtgui_timer_start(osc_timer); + } + + return osc_view; +} diff --git a/bsp/mini2440/osc.o b/bsp/mini2440/osc.o new file mode 100644 index 0000000000..32a5831fa4 Binary files /dev/null and b/bsp/mini2440/osc.o differ diff --git a/bsp/mini2440/picture.c b/bsp/mini2440/picture.c new file mode 100644 index 0000000000..3575a7c1a6 --- /dev/null +++ b/bsp/mini2440/picture.c @@ -0,0 +1,300 @@ +#include +#include +#include + +#include +#include +#include +#include + +enum picture_view_mode +{ + VIEW_SINGLE_MODE, + VIEW_DIR_MODE, + VIEW_FN_LIST_MODE +}; + +static rtgui_view_t* picture_view = RT_NULL; +static enum picture_view_mode view_mode = VIEW_SINGLE_MODE; + +/* current picture file name */ +static char current_fn[32] = {0}; +static const char** picture_fn_list; +static rt_uint8_t picture_fn_list_size, picture_fn_list_current; + +static void picture_show_prev() +{ + DIR* dir; + struct dirent* entry; + rt_bool_t is_last; + char fn[32]; + + fn[0] = '\0'; + is_last = RT_FALSE; + + dir = opendir("/"); + if (dir == RT_NULL) + { + rt_kprintf("open directory failed\n"); + return; + } + + do + { + entry = readdir(dir); + if (entry != RT_NULL) + { + if (strstr(entry->d_name, ".hdc") != RT_NULL || + strstr(entry->d_name, ".HDC") != RT_NULL) + { + /* it's a HDC image */ + if ((strcmp(entry->d_name, current_fn) == 0) && + is_last != RT_TRUE) + { + if (fn[0] == '\0') + { + /* it should be the last image */ + is_last = RT_TRUE; + } + else + { + /* display image */ + strcpy(current_fn, fn); + rtgui_widget_update(RTGUI_WIDGET(picture_view)); + closedir(dir); + return; + } + } + strcpy(fn, entry->d_name); + } + } + } while(entry != RT_NULL); + + /* close directory */ + closedir(dir); + + if ((is_last == RT_TRUE) && fn[0] != '\0') + { + strcpy(current_fn, fn); + rtgui_widget_update(RTGUI_WIDGET(picture_view)); + } +} + +static void picture_show_next() +{ + DIR* dir; + struct dirent* entry; + rt_bool_t found, has_image; + + found = RT_FALSE; has_image = RT_FALSE; + +__restart: + dir = opendir("/"); + if (dir == RT_NULL) + { + rt_kprintf("open directory failed\n"); + return; + } + + do + { + entry = readdir(dir); + if (entry != RT_NULL) + { + if (strstr(entry->d_name, ".hdc") != RT_NULL || + strstr(entry->d_name, ".HDC") != RT_NULL) + { + /* this directory includes image */ + has_image = RT_TRUE; + + if (found == RT_TRUE || current_fn[0] == '\0') + { + strcpy(current_fn, entry->d_name); + rtgui_widget_update(RTGUI_WIDGET(picture_view)); + + closedir(dir); + return; + } + + /* it's a HDC image */ + if (strcmp(entry->d_name, current_fn) == 0) + found = RT_TRUE; + } + } + } while(entry != RT_NULL); + + /* close directory */ + closedir(dir); + + if (has_image != RT_TRUE) return; + current_fn[0] = '\0'; + goto __restart; +} + +static rt_bool_t picture_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) +{ + if (event->type == RTGUI_EVENT_PAINT) + { + struct rtgui_dc* dc; + struct rtgui_rect rect; + struct rtgui_image* image; + char fn[32]; + + dc = rtgui_dc_begin_drawing(widget); + if (dc == RT_NULL) return RT_FALSE; + rtgui_widget_get_rect(widget, &rect); + + /* open image */ + rt_sprintf(fn, "/%s", current_fn); + image = rtgui_image_create_from_file("hdc", + fn, RT_FALSE); + if (image != RT_NULL) + { + /* blit image */ + rtgui_image_blit(image, dc, &rect); + /* destroy image */ + rtgui_image_destroy(image); + } + else + { + rtgui_dc_fill_rect(dc, &rect); + rtgui_dc_draw_text(dc, "没有文件被打开", &rect); + } + rtgui_dc_end_drawing(dc); + + return RT_FALSE; + } + else if (event->type == RTGUI_EVENT_KBD) + { + struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event; + if (ekbd->type == RTGUI_KEYDOWN) + { + switch (ekbd->key) + { + case RTGUIK_UP: + if (view_mode == VIEW_DIR_MODE) picture_show_next(); + else if (view_mode == VIEW_FN_LIST_MODE) + { + picture_fn_list_current ++; + if (picture_fn_list_current == picture_fn_list_size) + { + picture_fn_list_current = 0; + } + strcpy(current_fn, picture_fn_list[picture_fn_list_current]); + rtgui_widget_update(RTGUI_WIDGET(picture_view)); + } + break; + case RTGUIK_DOWN: + if (view_mode == VIEW_DIR_MODE) picture_show_prev(); + else if (view_mode == VIEW_FN_LIST_MODE) + { + if (picture_fn_list_current == 0) + { + picture_fn_list_current = picture_fn_list_size - 1; + } + else picture_fn_list_current --; + + strcpy(current_fn, picture_fn_list[picture_fn_list_current]); + rtgui_widget_update(RTGUI_WIDGET(picture_view)); + } + break; + case RTGUIK_RETURN: + { + rtgui_view_t* view; + rtgui_workbench_t* workbench; + + /* close this view */ + current_fn[0] = '\0'; + + /* remove view in workbench */ + view = RTGUI_VIEW(widget); + workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(view)->parent); + rtgui_workbench_remove_view(workbench, view); + rtgui_view_destroy(view); + + picture_view = RT_NULL; + } + break; + } + } + return RT_FALSE; + } + + return rtgui_view_event_handler(widget, event); +} + +rtgui_view_t *picture_view_create(struct rtgui_workbench* workbench) +{ + if (picture_view != RT_NULL) + { + rtgui_view_show(picture_view, RT_FALSE); + } + else + { + /* create picture view */ + picture_view = rtgui_view_create("Picture Presentation"); + rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view), + picture_view_event_handler); + + rtgui_workbench_add_view(workbench, picture_view); + /* this view can be focused */ + RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; + } + + return picture_view; +} + +rtgui_view_t *picture_view_create_view_file(struct rtgui_workbench* workbench, + const char* filename) +{ + if (picture_view != RT_NULL) + { + rtgui_view_show(picture_view, RT_FALSE); + } + else + { + strcpy(current_fn, filename); + + /* create picture view */ + picture_view = rtgui_view_create("Picture Presentation"); + rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view), + picture_view_event_handler); + + rtgui_workbench_add_view(workbench, picture_view); + /* this view can be focused */ + RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; + + view_mode = VIEW_SINGLE_MODE; + } + + return picture_view; +} + +rtgui_view_t *picture_view_create_view_list(struct rtgui_workbench* workbench, + const char* list[], rt_uint8_t size) +{ + if (picture_view != RT_NULL) + { + rtgui_view_show(picture_view, RT_FALSE); + } + else + { + picture_fn_list = list; + picture_fn_list_size = size; + picture_fn_list_current = 0; + strcpy(current_fn, picture_fn_list[picture_fn_list_current]); + + /* create picture view */ + picture_view = rtgui_view_create("Picture Presentation"); + rtgui_widget_set_event_handler(RTGUI_WIDGET(picture_view), + picture_view_event_handler); + + rtgui_workbench_add_view(workbench, picture_view); + /* this view can be focused */ + RTGUI_WIDGET(picture_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; + + view_mode = VIEW_FN_LIST_MODE; + } + + return picture_view; +} diff --git a/bsp/mini2440/picture.h b/bsp/mini2440/picture.h new file mode 100644 index 0000000000..867b9837ec --- /dev/null +++ b/bsp/mini2440/picture.h @@ -0,0 +1,8 @@ +#ifndef __PICTURE_H__ +#define __PICTURE_H__ + +rtgui_view_t *picture_view_create(struct rtgui_workbench* workbench); +rtgui_view_t *picture_view_create_view_file(struct rtgui_workbench* workbench, const char* fn); +rtgui_view_t *picture_view_create_view_list(struct rtgui_workbench* workbench, const char* list[], rt_uint8_t size); + +#endif diff --git a/bsp/mini2440/rtconfig.h b/bsp/mini2440/rtconfig.h index 7bb66c8f82..469e2fb845 100644 --- a/bsp/mini2440/rtconfig.h +++ b/bsp/mini2440/rtconfig.h @@ -63,6 +63,9 @@ /* Using Device System */ #define RT_USING_DEVICE +/* Using Module System */ +#define RT_USING_MODULE + /* SECTION: Console options */ /* the buffer size of console */ #define RT_CONSOLEBUF_SIZE 128 @@ -84,7 +87,7 @@ /* SECTION: Device filesystem support */ /* using DFS support */ #define RT_USING_DFS -#define RT_USING_DFS_ELMFATFS +#define RT_USING_DFS_ELMFAT /* #define RT_USING_DFS_YAFFS2 */ /* #define DFS_USING_WORKDIR */ @@ -96,6 +99,9 @@ /* the max number of cached sector */ #define DFS_CACHE_MAX_NUM 4 +/* Enable freemodbus protocal stack*/ +/* #define RT_USING_MODBUS */ + /* SECTION: lwip, a lighwight TCP/IP protocol stack */ /* Using lighweight TCP/IP protocol stack */ #define RT_USING_LWIP @@ -158,7 +164,7 @@ #define RT_LWIP_TCPTHREAD_PRIORITY 128 /* mail box size of tcpip thread to wait for */ -#define RT_LWIP_TCPTHREAD_MBOX_SIZE 8 +#define RT_LWIP_TCPTHREAD_MBOX_SIZE 32 /* thread stack size of tcpip thread */ #define RT_LWIP_TCPTHREAD_STACKSIZE 4096 diff --git a/bsp/mini2440/run_module.c b/bsp/mini2440/run_module.c new file mode 100644 index 0000000000..d7fd62e2bf --- /dev/null +++ b/bsp/mini2440/run_module.c @@ -0,0 +1,41 @@ +/* + * File : module.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2010-04-12 yi.qiu first version + */ + +#include +#include + +#ifdef RT_USING_FINSH +#include +static char buffer[4096]; + +void run_module(const char* filename) +{ + int fd, length; + struct dfs_stat s; + + fd = open(filename, O_RDONLY, 0); + length = read(fd, buffer, 4096); + if (length == 0) + { + rt_kprintf("check: read file failed\n"); + close(fd); + return; + } + + rt_module_load(buffer, filename); +} + +FINSH_FUNCTION_EXPORT(run_module, run module from file); +#endif + diff --git a/bsp/mini2440/startup.c b/bsp/mini2440/startup.c index 288b72ef31..4632ee9fcb 100644 --- a/bsp/mini2440/startup.c +++ b/bsp/mini2440/startup.c @@ -139,6 +139,11 @@ void rtthread_startup(void) rt_device_init_all(); #endif +#ifdef RT_USING_MODULE + /* init module system */ + rt_system_module_init(); +#endif + /* init application */ rt_application_init(); diff --git a/bsp/mini2440/today.c b/bsp/mini2440/today.c new file mode 100644 index 0000000000..2ee6a4e599 --- /dev/null +++ b/bsp/mini2440/today.c @@ -0,0 +1,213 @@ +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "picture.h" + +static rtgui_image_t *background = RT_NULL; +rtgui_image_t *selected_image = RT_NULL; + +static struct rtgui_view* function_view; +static struct rtgui_view* home_view; +static struct rtgui_workbench* workbench; + +const char *introduction_list[] = +{ + "/rtt/01.hdc", + "/rtt/02.hdc", + "/rtt/03.hdc", + "/rtt/04.hdc", + "/rtt/05.hdc", + "/rtt/06.hdc", + "/rtt/07.hdc", + "/rtt/08.hdc", +}; + +void function_introduction(void* parameter) +{ + rtgui_view_t *view; + + view = picture_view_create_view_list(workbench, introduction_list, + sizeof(introduction_list)/sizeof(char*)); + if (view != RT_NULL) + { + rtgui_view_show(view, RT_FALSE); + } + + return; +} + +void function_filelist(void* parameter) +{ + rtgui_rect_t rect; + rtgui_view_t *view; + + rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); + view = (rtgui_view_t*)rtgui_filelist_view_create(workbench, "/", "*.*", &rect); + if (view != RT_NULL) + { + rtgui_view_show(view, RT_FALSE); + } + + return; +} + +void function_osc(void* parameter) +{ + rtgui_view_t *view; + extern rtgui_view_t *osc_view_create(rtgui_workbench_t *workbench); + + view = osc_view_create(workbench); + if (view != RT_NULL) + { + rtgui_view_show(view, RT_FALSE); + } + + return; +} + +void function_device(void* parameter) +{ + rtgui_view_t *view; + extern rtgui_view_t *device_view_create(rtgui_workbench_t *workbench); + + view = device_view_create(workbench); + if (view != RT_NULL) + { + rtgui_view_show(view, RT_FALSE); + } + + return; +} + +void function_action(void* parameter) +{ + rt_kprintf("item action!\n"); + return; +} + +struct rtgui_list_item function_list[] = +{ + {"RT-Thread介绍", RT_NULL, function_introduction, RT_NULL}, + {"文件浏览", RT_NULL, function_filelist, RT_NULL}, + {"波形演示", RT_NULL, function_osc, RT_NULL}, + {"设备信息", RT_NULL, function_device, RT_NULL}, +}; + +static rt_bool_t home_view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) +{ + if (event->type == RTGUI_EVENT_PAINT) + { + struct rtgui_dc* dc; + struct rtgui_rect rect; + + dc = rtgui_dc_begin_drawing(widget); + if (dc == RT_NULL) return RT_FALSE; + rtgui_widget_get_rect(widget, &rect); + + /* draw background */ + background = rtgui_image_create_from_file("hdc", + "/resource/bg.hdc", RT_FALSE); + if (background != RT_NULL) + { + rtgui_image_blit(background, dc, &rect); + rtgui_image_destroy(background); + + background = RT_NULL; + } + else + { + rtgui_dc_fill_rect(dc, &rect); + } + rtgui_dc_end_drawing(dc); + + return RT_FALSE; + } + else if (event->type == RTGUI_EVENT_MOUSE_BUTTON) + { + struct rtgui_event_mouse* emouse = (struct rtgui_event_mouse*)event; + if (emouse->button == RTGUI_MOUSE_BUTTON_UP | RTGUI_MOUSE_BUTTON_LEFT) + { + rtgui_view_show(function_view, RT_FALSE); + } + return RT_FALSE; + } + + return rtgui_view_event_handler(widget, event); +} + +rt_bool_t today_workbench_event_handler(rtgui_widget_t *widget, rtgui_event_t *event) +{ + if (event->type == RTGUI_EVENT_MOUSE_BUTTON) + { + struct rtgui_event_mouse* emouse = (struct rtgui_event_mouse*)event; + //if (emouse->button == RTGUI_MOUSE_BUTTON_UP | RTGUI_MOUSE_BUTTON_LEFT) + if(0) + { + /* active home view */ + if (workbench->current_view != home_view) + { + rtgui_view_show(home_view, RT_FALSE); + return RT_FALSE; + } + } + } + + return rtgui_workbench_event_handler(widget, event); +} + +static void today_entry(void* parameter) +{ + rt_mq_t mq; + rtgui_rect_t rect; + + mq = rt_mq_create("qToday", 256, 4, RT_IPC_FLAG_FIFO); + rtgui_thread_register(rt_thread_self(), mq); + + selected_image = rtgui_image_create_from_file("hdc", + "/resource/select.hdc", RT_FALSE); + + workbench = rtgui_workbench_create("main", "workbench"); + if (workbench == RT_NULL) return; + rtgui_widget_set_event_handler(RTGUI_WIDGET(workbench), today_workbench_event_handler); + + /* add home view */ + home_view = rtgui_view_create("Home"); + rtgui_widget_set_event_handler(RTGUI_WIDGET(home_view), home_view_event_handler); + + rtgui_workbench_add_view(workbench, home_view); + /* this view can be focused */ + RTGUI_WIDGET(home_view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE; + /* set widget focus */ + rtgui_widget_focus(RTGUI_WIDGET(home_view)); + + rtgui_view_show(home_view, RT_FALSE); + + /* add function view */ + rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); + function_view = (struct rtgui_view*)rtgui_list_view_create(function_list, + sizeof(function_list)/sizeof(struct rtgui_list_item), &rect); + rtgui_workbench_add_view(workbench, function_view); + + rtgui_workbench_event_loop(workbench); + + rtgui_thread_deregister(rt_thread_self()); + rt_mq_delete(mq); +} + +void today_init() +{ + rt_thread_t tid; + + tid = rt_thread_create("today", + today_entry, RT_NULL, + 2048, 25, 10); + + if (tid != RT_NULL) rt_thread_startup(tid); +} diff --git a/bsp/mini2440/touch.c b/bsp/mini2440/touch.c index 0e3f245414..8aef45a23b 100644 --- a/bsp/mini2440/touch.c +++ b/bsp/mini2440/touch.c @@ -95,7 +95,7 @@ void report_touch_input(int updown) } /* rt_kprintf("touch %s: ts.x: %d, ts.y: %d, count:%d\n", updown? "down" : "up", - xp, yp, ts.count); */ + xp, yp, ts.count); */ emouse.button |= RTGUI_MOUSE_BUTTON_LEFT; @@ -122,7 +122,7 @@ static void touch_timer_fire(void) ADCCON |= S3C2410_ADCCON_ENABLE_START; } -void s3c2410_adc_stylus_action() +void s3c2410_adc_stylus_action(void) { rt_uint32_t data0; rt_uint32_t data1; @@ -148,7 +148,7 @@ void s3c2410_adc_stylus_action() } } -void s3c2410_intc_stylus_updown() +void s3c2410_intc_stylus_updown(void) { rt_uint32_t data0; rt_uint32_t data1; @@ -186,13 +186,13 @@ void s3c2410_intc_stylus_updown() void rt_touch_handler(int irqno) { - if (SUBSRCPND & (1 << 10)) + if (SUBSRCPND & BIT_SUB_ADC) { /* INT_SUB_ADC */ s3c2410_adc_stylus_action(); } - if (SUBSRCPND & (1 << 9)) + if (SUBSRCPND & BIT_SUB_TC) { /* INT_SUB_TC */ s3c2410_intc_stylus_updown(); @@ -202,7 +202,7 @@ void rt_touch_handler(int irqno) INTPND |= (rt_uint32_t)(1 << INTADC); } -void rt_hw_touch_init() +void rt_hw_touch_init(void) { /* init touch screen structure */ rt_memset(&ts, 0, sizeof(struct s3c2410ts)); @@ -233,3 +233,4 @@ void rt_hw_touch_init() first_down_report = 1; } + diff --git a/components/hello/hello.c b/components/hello/hello.c index c4653793a4..6b6402de1c 100644 --- a/components/hello/hello.c +++ b/components/hello/hello.c @@ -1,6 +1,22 @@ #include -void hello() +static int a = 0; +int b = 1000000; + +void function(int count1, int count2) { - rt_kprintf("Hello RT-Thread\n"); + rt_kprintf("Hello RT-Thread %d %d\n", count1, count2); +} + +int rtm_main(void) +{ + int i; + for(i=0; i<1000; i++) + { + a++; + b--; + function(a, b); + } + + return 0; } diff --git a/components/hello/mk.bat b/components/hello/mk.bat new file mode 100644 index 0000000000..8f906a3af7 --- /dev/null +++ b/components/hello/mk.bat @@ -0,0 +1,3 @@ +set PATH="E:\Program Files\CodeSourcery\Sourcery G++ Lite\bin";%PATH% +arm-none-eabi-gcc -c hello.c -o hello.o -DRT_MODULE "-I..\..\include" "-I..\..\bsp\mini2440" +arm-none-eabi-gcc -o hello.mo -r -d -e rtm_main -nostdlib hello.o \ No newline at end of file diff --git a/components/thread/mk.bat b/components/thread/mk.bat new file mode 100644 index 0000000000..2eaedccc6f --- /dev/null +++ b/components/thread/mk.bat @@ -0,0 +1,3 @@ +set PATH="E:\Program Files\CodeSourcery\Sourcery G++ Lite\bin";%PATH% +arm-none-eabi-gcc -c module_thread_dynamic.c -o module_thread_dynamic.o -DRT_MODULE "-I..\..\include" "-I..\..\bsp\mini2440" +arm-none-eabi-gcc -o dynamic.mo -r -d -e rtm_main -nostdlib module_thread_dynamic.o \ No newline at end of file diff --git a/components/thread/module_thread_dynamic.c b/components/thread/module_thread_dynamic.c index 7a5d3238ce..d4ac0f6716 100644 --- a/components/thread/module_thread_dynamic.c +++ b/components/thread/module_thread_dynamic.c @@ -1,5 +1,9 @@ #include +#define THREAD_PRIORITY 25 +#define THREAD_STACK_SIZE 512 +#define THREAD_TIMESLICE 5 + static void thread_entry(void* parameter) { rt_kprintf("thread dynamicly created ok\n"); @@ -16,8 +20,6 @@ int rtm_main() THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid != RT_NULL) rt_thread_startup(tid); - else - tc_stat(TC_STAT_END | TC_STAT_FAILED); return 0; } \ No newline at end of file diff --git a/finsh/cmd.c b/finsh/cmd.c index 5e576b275d..023ea5a38b 100644 --- a/finsh/cmd.c +++ b/finsh/cmd.c @@ -336,6 +336,28 @@ int list_device() FINSH_FUNCTION_EXPORT(list_device, list device in system) #endif +#ifdef RT_USING_MODULE +int list_module() +{ + struct rt_module *module; + struct rt_list_node *list, *node; + + list = &rt_object_container[RT_Object_Class_Module].object_list; + + rt_kprintf("module entry stack size\n"); + rt_kprintf("-------- ---------- ----------\n"); + for (node = list->next; node != list; node = node->next) + { + module = (struct rt_device*)(rt_list_entry(node, struct rt_object, list)); + rt_kprintf("%-8s 0x%08x 0x%08x \n", module->parent.name, (rt_uint32_t)module->module_entry, + module->stack_size); + } + + return 0; +} +FINSH_FUNCTION_EXPORT(list_module, list module in system) +#endif + int list() { struct finsh_syscall_item* syscall_item; diff --git a/src/kservice.c b/src/kservice.c index cdd0a60907..e1aa3ffb51 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -977,9 +977,4 @@ char *strdup(const char *s) __attribute__((weak, alias("rt_strdup"))); #endif #endif -#ifdef RT_USING_MODULE -#include -/* some buildin kernel symbol */ -RTM_EXPORT(rt_kprintf) -#endif /*@}*/ diff --git a/src/module.c b/src/module.c index 4316d171d6..a2958cc66b 100644 --- a/src/module.c +++ b/src/module.c @@ -19,6 +19,19 @@ #include "module.h" #include "kservice.h" +/* #define RT_MODULE_DEBUG */ + +#define elf_module ((Elf32_Ehdr *)module_ptr) +#define shdr ((Elf32_Shdr *)((rt_uint8_t *)module_ptr + elf_module->e_shoff)) + +#define IS_PROG(s) (s.sh_type == SHT_PROGBITS) +#define IS_NOPROG(s) (s.sh_type == SHT_NOBITS) +#define IS_REL(s) (s.sh_type == SHT_REL) +#define IS_RELA(s) (s.sh_type == SHT_RELA) +#define IS_ALLOC(s) (s.sh_flags == SHF_ALLOC) +#define IS_AX(s) ((s.sh_flags & SHF_ALLOC) && (s.sh_flags & SHF_EXECINSTR)) +#define IS_AW(s) ((s.sh_flags & SHF_ALLOC) && (s.sh_flags & SHF_WRITE)) + #ifdef RT_USING_MODULE rt_list_t rt_module_symbol_list; struct rt_module* rt_current_module; @@ -55,17 +68,6 @@ rt_uint32_t rt_module_symbol_find(const rt_uint8_t* sym_str) return 0; } -#define elf_module ((Elf32_Ehdr *)module_ptr) -#define shdr ((Elf32_Shdr *)((rt_uint8_t *)module_ptr + elf_module->e_shoff)) - -#define IS_PROG(s) (s.sh_type == SHT_PROGBITS) -#define IS_NOPROG(s) (s.sh_type == SHT_NOBITS) -#define IS_REL(s) (s.sh_type == SHT_REL) -#define IS_RELA(s) (s.sh_type == SHT_RELA) -#define IS_ALLOC(s) (s.sh_flags == SHF_ALLOC) -#define IS_AX(s) ((s.sh_flags & SHF_ALLOC) && (s.sh_flags & SHF_EXECINSTR)) -#define IS_AW(s) ((s.sh_flags & SHF_ALLOC) && (s.sh_flags & SHF_WRITE)) - int rt_module_arm_relocate(struct rt_module* module, Elf32_Rel *rel, Elf32_Addr sym_val, rt_uint32_t module_addr) { Elf32_Addr *where, tmp; @@ -79,7 +81,9 @@ int rt_module_arm_relocate(struct rt_module* module, Elf32_Rel *rel, Elf32_Addr case R_ARM_ABS32: *where += (Elf32_Addr)sym_val; +#ifdef RT_MODULE_DEBUG rt_kprintf("R_ARM_ABS32: %x -> %x\n", where, *where); +#endif break; case R_ARM_PC24: @@ -92,7 +96,9 @@ int rt_module_arm_relocate(struct rt_module* module, Elf32_Rel *rel, Elf32_Addr tmp = sym_val - (Elf32_Addr)where + (addend << 2); tmp >>= 2; *where = (*where & 0xff000000) | (tmp & 0x00ffffff); +#ifdef RT_MODULE_DEBUG rt_kprintf("R_ARM_PC24: %x -> %x\n", where, *where); +#endif break; default: @@ -275,7 +281,9 @@ struct rt_module* rt_module_load(void* module_ptr, const rt_uint8_t* name) for (i = 0; i < nr_reloc; i ++) { Elf32_Sym *sym = &symtab[ELF32_R_SYM(rel->r_info)]; +#ifdef RT_MODULE_DEBUG rt_kprintf("relocate symbol: %s\n", strtab + sym->st_name); +#endif if (sym->st_shndx != STN_UNDEF) { if(ELF_ST_TYPE(sym->st_info) == STT_SECTION) @@ -310,7 +318,9 @@ struct rt_module* rt_module_load(void* module_ptr, const rt_uint8_t* name) } else { +#ifdef RT_MODULE_DEBUG rt_kprintf("unresolved relocate symbol: %s\n", strtab + sym->st_name); +#endif /* need to resolve symbol in kernel symbol table */ Elf32_Addr addr = rt_module_symbol_find(strtab + sym->st_name); if (addr != (Elf32_Addr)RT_NULL) diff --git a/src/object.c b/src/object.c index 7ad0540255..3843326b61 100644 --- a/src/object.c +++ b/src/object.c @@ -21,6 +21,10 @@ #include "kservice.h" +#ifdef RT_USING_MODULE +extern struct rt_module* rt_current_module; +#endif + #define _OBJ_CONTAINER_LIST_INIT(c) \ {&(rt_object_container[c].object_list), &(rt_object_container[c].object_list)} struct rt_object_information rt_object_container[RT_Object_Class_Unknown] = @@ -249,8 +253,14 @@ rt_object_t rt_object_allocate(enum rt_object_class_type type, const char* name) register rt_base_t temp; struct rt_object_information* information; +#ifdef RT_USING_MODULE + /* get module object information */ + information = (rt_current_module != RT_NULL) ? + &rt_current_module->module_object[type] : &rt_object_container[type]; +#else /* get object information */ information = &rt_object_container[type]; +#endif object = (struct rt_object*)rt_malloc(information->object_size); if (object == RT_NULL) diff --git a/src/rtm.c b/src/rtm.c new file mode 100644 index 0000000000..309891af7d --- /dev/null +++ b/src/rtm.c @@ -0,0 +1,36 @@ +/* + * File : module.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2010-04-12 yi.qiu first version + */ + +#include +#include + +/* some buildin kernel symbol */ + +/* thread symbol */ +RTM_EXPORT(rt_thread_init) +RTM_EXPORT(rt_thread_detach) +RTM_EXPORT(rt_thread_create) +RTM_EXPORT(rt_thread_self) +RTM_EXPORT(rt_thread_find) +RTM_EXPORT(rt_thread_startup) +RTM_EXPORT(rt_thread_delete) +RTM_EXPORT(rt_thread_yield) +RTM_EXPORT(rt_thread_delay) +RTM_EXPORT(rt_thread_control) +RTM_EXPORT(rt_thread_suspend) +RTM_EXPORT(rt_thread_resume) +RTM_EXPORT(rt_thread_timeout) + +/* kservice symbol */ +RTM_EXPORT(rt_kprintf) diff --git a/src/scheduler.c b/src/scheduler.c index c570b3dbbc..a414840850 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -35,6 +35,9 @@ rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]; struct rt_thread* rt_current_thread; rt_uint8_t rt_current_priority; +#ifdef RT_USING_MODULE +extern struct rt_module* rt_current_module; +#endif #if RT_THREAD_PRIORITY_MAX > 32 /* maximun priority level, 256 */ @@ -260,6 +263,11 @@ void rt_schedule() from_thread = rt_current_thread; rt_current_thread = to_thread; +#ifdef RT_USING_MODULE + if(rt_current_thread->module_parent != RT_NULL) + rt_current_module = rt_current_thread->module_parent; +#endif + #ifdef RT_USING_HOOK if (rt_scheduler_hook != RT_NULL) rt_scheduler_hook(from_thread, to_thread); #endif diff --git a/src/thread.c b/src/thread.c index 875a00aedb..b8859f9a0c 100644 --- a/src/thread.c +++ b/src/thread.c @@ -32,6 +32,10 @@ extern rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX]; extern struct rt_thread* rt_current_thread; extern rt_uint8_t rt_current_priority; +#ifdef RT_USING_MODULE +extern struct rt_module* rt_current_module; +#endif + #ifdef RT_USING_HEAP extern rt_list_t rt_thread_defunct; #endif @@ -78,7 +82,8 @@ static rt_err_t _rt_thread_init(struct rt_thread* thread, #ifdef RT_USING_MODULE /* init module parent */ - thread->module_parent = RT_NULL; + thread->module_parent = + (rt_current_module != RT_NULL) ? rt_current_module : RT_NULL; #endif /* init user data */ @@ -228,12 +233,12 @@ rt_err_t rt_thread_startup (rt_thread_t thread) static void rt_thread_exit() { struct rt_thread* thread; - register rt_base_t temp; + register rt_base_t temp; - /* disable interrupt */ - temp = rt_hw_interrupt_disable(); + /* disable interrupt */ + temp = rt_hw_interrupt_disable(); - /* get current thread */ + /* get current thread */ thread = rt_current_thread; /* remove from schedule */ @@ -628,21 +633,4 @@ rt_thread_t rt_thread_find(char* name) return thread; } -#ifdef RT_USING_MODULE -#include -/* some buildin kernel symbol */ -RTM_EXPORT(rt_thread_init) -RTM_EXPORT(rt_thread_detach) -RTM_EXPORT(rt_thread_create) -RTM_EXPORT(rt_thread_self) -RTM_EXPORT(rt_thread_find) -RTM_EXPORT(rt_thread_startup) -RTM_EXPORT(rt_thread_delete) -RTM_EXPORT(rt_thread_yield) -RTM_EXPORT(rt_thread_delay) -RTM_EXPORT(rt_thread_control) -RTM_EXPORT(rt_thread_suspend) -RTM_EXPORT(rt_thread_resume) -RTM_EXPORT(rt_thread_timeout) -#endif /*@}*/