Linux LittlevGL 使用

                                                  Linux  LittlevGL 使用

           LittlevGL 是一个开源免费的GUI,支持触摸屏操作,移植简单方便,开发者一直在不断完善更新。LittlevGL 自带了丰富的控件:窗口、按键、标签、list、图表等,还可以自定义控件;支持很多特效:透明、阴影、自动显示隐藏滚动条、界面切换动画、图标打开关闭动画、平滑的拖拽控件、分层显示、反锯齿、仅耗少量内存的字体等等。 

        本文主要把LittlevGL移植到linux平台使用,在linux平台主要是通过 framebuffer实现的,在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0 设备,并通过mmap 系统调用进行地址映射,随后用 memset 将屏幕清空,然后就可以对这段内存进行读写操作了。

   编写基本的CMakeLists.txt文件,这里只加了一个main.c文件,该文件在/build目录下,cmake.sh 自动插入文件在../上一级目录生成一个CMakeLists.txt。

cmake_minimum_required(VERSION 3.12)
project(lvglv)

#set(CMAKE_C_STANDARD 11)
SET(CROSS_COMPILE 1)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER "/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc")

SET(TOOLCHAIN_DIR "/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin/")
SET(CMAKE_FIND_ROOT_PATH  "/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf
" "/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf
/lib" "/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf
/include")
#include_directories(/home/zh/LICHEE/linux-licheepi-zero/include) //添加相关包含文件
link_directories(/home/zh/linux/nfs/rootfs/lib)//添加相关库文件

aux_source_directory(. DIR_SRCS)
 
set(CMAKE_INCLUDE_PATH "/home/zh/LVGL/build/lvgl")
#add_definitions(-D LV_LVGL_H_INCLUDE_SIMPLE)
#add_definitions(-D LV_CONF_INCLUDE_SIMPLE)
include_directories(${CMAKE_SOURCE_DIR}/build) 

add_executable(lvglv
main.c
)

配置cmake.sh 参数 配置CMakeLists.txt的程序文件。

rm -rf CMakeCache.txt CMakeFiles/
rm -rf ../CMakeLists.txt
cp CMakeLists.txt ../
chmod 777 ../CMakeLists.txt
find lv_drivers/* -name "*.c"  |sort > lv_drivers.txt 
find lv_examples/* -name "*.c"  |sort > lv_examples.txt
find lvgl/* -name "*.c"  |sort > lvgl.txt
sed -i '/add_executable/r lv_drivers.txt' ../CMakeLists.txt
sed -i '/add_executable/r lv_examples.txt' ../CMakeLists.txt
sed -i '/add_executable/r lvgl.txt' ../CMakeLists.txt
rm -rf lv_drivers.txt lv_examples.txt lvgl.txt
cmake ..
make
cp lvglv /home/zh/linux/nfs/rootfs/lib

执行./cmake.sh,生成新的CMakeLists.txt

cmake_minimum_required(VERSION 3.12)
project(lvglv)

#set(CMAKE_C_STANDARD 11)
SET(CROSS_COMPILE 1)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER "/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc")

SET(TOOLCHAIN_DIR "/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin/")
SET(CMAKE_FIND_ROOT_PATH  "/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf
" "/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf
/lib" "/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf
/include")
#include_directories(/home/zh/LICHEE/linux-licheepi-zero/include)
link_directories(/home/zh/linux/nfs/rootfs/lib)

aux_source_directory(. DIR_SRCS)
 
set(CMAKE_INCLUDE_PATH "/home/zh/LVGL/build/lvgl")
#add_definitions(-D LV_LVGL_H_INCLUDE_SIMPLE)
#add_definitions(-D LV_CONF_INCLUDE_SIMPLE)
include_directories(${CMAKE_SOURCE_DIR}/build) 

add_executable(lvglv
lvgl/examples/porting/lv_port_disp_template.c
lvgl/examples/porting/lv_port_fs_template.c
lvgl/examples/porting/lv_port_indev_template.c
lvgl/src/lv_core/lv_disp.c
lvgl/src/lv_core/lv_group.c
lvgl/src/lv_core/lv_indev.c
lvgl/src/lv_core/lv_obj.c
lvgl/src/lv_core/lv_refr.c
lvgl/src/lv_core/lv_style.c
lvgl/src/lv_draw/lv_draw_arc.c
lvgl/src/lv_draw/lv_draw_blend.c
lvgl/src/lv_draw/lv_draw_img.c
lvgl/src/lv_draw/lv_draw_label.c
lvgl/src/lv_draw/lv_draw_line.c
lvgl/src/lv_draw/lv_draw_mask.c
lvgl/src/lv_draw/lv_draw_rect.c
lvgl/src/lv_draw/lv_draw_triangle.c
lvgl/src/lv_draw/lv_img_buf.c
lvgl/src/lv_draw/lv_img_cache.c
lvgl/src/lv_draw/lv_img_decoder.c
lvgl/src/lv_font/lv_font.c
lvgl/src/lv_font/lv_font_dejavu_16_persian_hebrew.c
lvgl/src/lv_font/lv_font_fmt_txt.c
lvgl/src/lv_font/lv_font_loader.c
lvgl/src/lv_font/lv_font_montserrat_10.c
lvgl/src/lv_font/lv_font_montserrat_12.c
lvgl/src/lv_font/lv_font_montserrat_12_subpx.c
lvgl/src/lv_font/lv_font_montserrat_14.c
lvgl/src/lv_font/lv_font_montserrat_16.c
lvgl/src/lv_font/lv_font_montserrat_18.c
lvgl/src/lv_font/lv_font_montserrat_20.c
lvgl/src/lv_font/lv_font_montserrat_22.c
lvgl/src/lv_font/lv_font_montserrat_24.c
lvgl/src/lv_font/lv_font_montserrat_26.c
lvgl/src/lv_font/lv_font_montserrat_28.c
lvgl/src/lv_font/lv_font_montserrat_28_compressed.c
lvgl/src/lv_font/lv_font_montserrat_30.c
lvgl/src/lv_font/lv_font_montserrat_32.c
lvgl/src/lv_font/lv_font_montserrat_34.c
lvgl/src/lv_font/lv_font_montserrat_36.c
lvgl/src/lv_font/lv_font_montserrat_38.c
lvgl/src/lv_font/lv_font_montserrat_40.c
lvgl/src/lv_font/lv_font_montserrat_42.c
lvgl/src/lv_font/lv_font_montserrat_44.c
lvgl/src/lv_font/lv_font_montserrat_46.c
lvgl/src/lv_font/lv_font_montserrat_48.c
lvgl/src/lv_font/lv_font_montserrat_8.c
lvgl/src/lv_font/lv_font_simsun_16_cjk.c
lvgl/src/lv_font/lv_font_unscii_8.c
lvgl/src/lv_gpu/lv_gpu_nxp_pxp.c
lvgl/src/lv_gpu/lv_gpu_nxp_pxp_osa.c
lvgl/src/lv_gpu/lv_gpu_nxp_vglite.c
lvgl/src/lv_gpu/lv_gpu_stm32_dma2d.c
lvgl/src/lv_hal/lv_hal_disp.c
lvgl/src/lv_hal/lv_hal_indev.c
lvgl/src/lv_hal/lv_hal_tick.c
lvgl/src/lv_misc/lv_anim.c
lvgl/src/lv_misc/lv_area.c
lvgl/src/lv_misc/lv_async.c
lvgl/src/lv_misc/lv_bidi.c
lvgl/src/lv_misc/lv_color.c
lvgl/src/lv_misc/lv_debug.c
lvgl/src/lv_misc/lv_fs.c
lvgl/src/lv_misc/lv_gc.c
lvgl/src/lv_misc/lv_ll.c
lvgl/src/lv_misc/lv_log.c
lvgl/src/lv_misc/lv_math.c
lvgl/src/lv_misc/lv_mem.c
lvgl/src/lv_misc/lv_printf.c
lvgl/src/lv_misc/lv_task.c
lvgl/src/lv_misc/lv_templ.c
lvgl/src/lv_misc/lv_txt_ap.c
lvgl/src/lv_misc/lv_txt.c
lvgl/src/lv_misc/lv_utils.c
lvgl/src/lv_themes/lv_theme.c
lvgl/src/lv_themes/lv_theme_empty.c
lvgl/src/lv_themes/lv_theme_material.c
lvgl/src/lv_themes/lv_theme_mono.c
lvgl/src/lv_themes/lv_theme_template.c
lvgl/src/lv_widgets/lv_arc.c
lvgl/src/lv_widgets/lv_bar.c
lvgl/src/lv_widgets/lv_btn.c
lvgl/src/lv_widgets/lv_btnmatrix.c
lvgl/src/lv_widgets/lv_calendar.c
lvgl/src/lv_widgets/lv_canvas.c
lvgl/src/lv_widgets/lv_chart.c
lvgl/src/lv_widgets/lv_checkbox.c
lvgl/src/lv_widgets/lv_cont.c
lvgl/src/lv_widgets/lv_cpicker.c
lvgl/src/lv_widgets/lv_dropdown.c
lvgl/src/lv_widgets/lv_gauge.c
lvgl/src/lv_widgets/lv_imgbtn.c
lvgl/src/lv_widgets/lv_img.c
lvgl/src/lv_widgets/lv_keyboard.c
lvgl/src/lv_widgets/lv_label.c
lvgl/src/lv_widgets/lv_led.c
lvgl/src/lv_widgets/lv_line.c
lvgl/src/lv_widgets/lv_linemeter.c
lvgl/src/lv_widgets/lv_list.c
lvgl/src/lv_widgets/lv_msgbox.c
lvgl/src/lv_widgets/lv_objmask.c
lvgl/src/lv_widgets/lv_objx_templ.c
lvgl/src/lv_widgets/lv_page.c
lvgl/src/lv_widgets/lv_roller.c
lvgl/src/lv_widgets/lv_slider.c
lvgl/src/lv_widgets/lv_spinbox.c
lvgl/src/lv_widgets/lv_spinner.c
lvgl/src/lv_widgets/lv_switch.c
lvgl/src/lv_widgets/lv_table.c
lvgl/src/lv_widgets/lv_tabview.c
lvgl/src/lv_widgets/lv_textarea.c
lvgl/src/lv_widgets/lv_tileview.c
lvgl/src/lv_widgets/lv_win.c
lvgl/tests/lv_test_assert.c
lvgl/tests/lv_test_core/lv_test_core.c
lvgl/tests/lv_test_core/lv_test_font_loader.c
lvgl/tests/lv_test_core/lv_test_obj.c
lvgl/tests/lv_test_core/lv_test_style.c
lvgl/tests/lv_test_fonts/font_1.c
lvgl/tests/lv_test_fonts/font_2.c
lvgl/tests/lv_test_fonts/font_3.c
lvgl/tests/lv_test_main.c
lvgl/tests/lv_test_widgets/lv_test_label.c
lv_examples/assets/img_cogwheel_alpha16.c
lv_examples/assets/img_cogwheel_argb.c
lv_examples/assets/img_cogwheel_chroma_keyed.c
lv_examples/assets/img_cogwheel_indexed16.c
lv_examples/assets/img_cogwheel_rgb.c
lv_examples/assets/img_hand.c
lv_examples/assets/lv_font_montserrat_12_compr_az.c
lv_examples/assets/lv_font_montserrat_16_compr_az.c
lv_examples/assets/lv_font_montserrat_28_compr_az.c
lv_examples/src/lv_demo_benchmark/lv_demo_benchmark.c
lv_examples/src/lv_demo_keypad_encoder/lv_demo_keypad_encoder.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_icon_bright.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_icon_eco.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_icon_hue.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_icon_pc.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_icon_tel.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_icon_wifi.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_btn_bg_1.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_btn_bg_2.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_btn_bg_3.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_btn_bg_4.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_cloud.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_copy.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_internet.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_mobile.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_no_internet.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_phone.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_print.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_printer2.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_ready.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_scan.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_scan_example.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_setup.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_usb.c
lv_examples/src/lv_demo_printer/images/lv_demo_printer_img_wave.c
lv_examples/src/lv_demo_printer/lv_demo_printer.c
lv_examples/src/lv_demo_printer/lv_demo_printer_theme.c
lv_examples/src/lv_demo_stress/lv_demo_stress.c
lv_examples/src/lv_demo_widgets/lv_demo_widgets.c
lv_examples/src/lv_ex_get_started/lv_ex_get_started_1.c
lv_examples/src/lv_ex_get_started/lv_ex_get_started_2.c
lv_examples/src/lv_ex_get_started/lv_ex_get_started_3.c
lv_examples/src/lv_ex_style/lv_ex_style_10.c
lv_examples/src/lv_ex_style/lv_ex_style_11.c
lv_examples/src/lv_ex_style/lv_ex_style_1.c
lv_examples/src/lv_ex_style/lv_ex_style_2.c
lv_examples/src/lv_ex_style/lv_ex_style_3.c
lv_examples/src/lv_ex_style/lv_ex_style_4.c
lv_examples/src/lv_ex_style/lv_ex_style_5.c
lv_examples/src/lv_ex_style/lv_ex_style_6.c
lv_examples/src/lv_ex_style/lv_ex_style_7.c
lv_examples/src/lv_ex_style/lv_ex_style_8.c
lv_examples/src/lv_ex_style/lv_ex_style_9.c
lv_examples/src/lv_ex_widgets/lv_ex_arc/lv_ex_arc_1.c
lv_examples/src/lv_ex_widgets/lv_ex_arc/lv_ex_arc_2.c
lv_examples/src/lv_ex_widgets/lv_ex_bar/lv_ex_bar_1.c
lv_examples/src/lv_ex_widgets/lv_ex_btn/lv_ex_btn_1.c
lv_examples/src/lv_ex_widgets/lv_ex_btn/lv_ex_btn_2.c
lv_examples/src/lv_ex_widgets/lv_ex_btnmatrix/lv_ex_btnmatrix_1.c
lv_examples/src/lv_ex_widgets/lv_ex_calendar/lv_ex_calendar_1.c
lv_examples/src/lv_ex_widgets/lv_ex_canvas/lv_ex_canvas_1.c
lv_examples/src/lv_ex_widgets/lv_ex_canvas/lv_ex_canvas_2.c
lv_examples/src/lv_ex_widgets/lv_ex_chart/lv_ex_chart_1.c
lv_examples/src/lv_ex_widgets/lv_ex_chart/lv_ex_chart_2.c
lv_examples/src/lv_ex_widgets/lv_ex_checkbox/lv_ex_checkbox_1.c
lv_examples/src/lv_ex_widgets/lv_ex_cont/lv_ex_cont_1.c
lv_examples/src/lv_ex_widgets/lv_ex_cpicker/lv_ex_cpicker_1.c
lv_examples/src/lv_ex_widgets/lv_ex_cpicker/lv_ex_cpicker_2.c
lv_examples/src/lv_ex_widgets/lv_ex_dropdown/lv_ex_dropdown_1.c
lv_examples/src/lv_ex_widgets/lv_ex_dropdown/lv_ex_dropdown_2.c
lv_examples/src/lv_ex_widgets/lv_ex_gauge/lv_ex_gauge_1.c
lv_examples/src/lv_ex_widgets/lv_ex_gauge/lv_ex_gauge_2.c
lv_examples/src/lv_ex_widgets/lv_ex_imgbtn/imgbtn_blue.c
lv_examples/src/lv_ex_widgets/lv_ex_imgbtn/imgbtn_green.c
lv_examples/src/lv_ex_widgets/lv_ex_imgbtn/lv_ex_imgbtn_1.c
lv_examples/src/lv_ex_widgets/lv_ex_img/lv_ex_img_1.c
lv_examples/src/lv_ex_widgets/lv_ex_img/lv_ex_img_2.c
lv_examples/src/lv_ex_widgets/lv_ex_img/lv_ex_img_3.c
lv_examples/src/lv_ex_widgets/lv_ex_keyboard/lv_ex_keyboard_1.c
lv_examples/src/lv_ex_widgets/lv_ex_label/lv_ex_label_1.c
lv_examples/src/lv_ex_widgets/lv_ex_label/lv_ex_label_2.c
lv_examples/src/lv_ex_widgets/lv_ex_label/lv_ex_label_3.c
lv_examples/src/lv_ex_widgets/lv_ex_led/lv_ex_led_1.c
lv_examples/src/lv_ex_widgets/lv_ex_line/lv_ex_line_1.c
lv_examples/src/lv_ex_widgets/lv_ex_linemeter/lv_ex_linemeter_1.c
lv_examples/src/lv_ex_widgets/lv_ex_list/lv_ex_list_1.c
lv_examples/src/lv_ex_widgets/lv_ex_msgbox/lv_ex_msgbox_1.c
lv_examples/src/lv_ex_widgets/lv_ex_msgbox/lv_ex_msgbox_2.c
lv_examples/src/lv_ex_widgets/lv_ex_obj/lv_ex_obj_1.c
lv_examples/src/lv_ex_widgets/lv_ex_objmask/lv_ex_objmask_1.c
lv_examples/src/lv_ex_widgets/lv_ex_objmask/lv_ex_objmask_2.c
lv_examples/src/lv_ex_widgets/lv_ex_page/lv_ex_page_1.c
lv_examples/src/lv_ex_widgets/lv_ex_roller/lv_ex_roller_1.c
lv_examples/src/lv_ex_widgets/lv_ex_slider/lv_ex_slider_1.c
lv_examples/src/lv_ex_widgets/lv_ex_slider/lv_ex_slider_2.c
lv_examples/src/lv_ex_widgets/lv_ex_spinbox/lv_ex_spinbox_1.c
lv_examples/src/lv_ex_widgets/lv_ex_spinner/lv_ex_spinner_1.c
lv_examples/src/lv_ex_widgets/lv_ex_switch/lv_ex_switch_1.c
lv_examples/src/lv_ex_widgets/lv_ex_table/lv_ex_table_1.c
lv_examples/src/lv_ex_widgets/lv_ex_tabview/lv_ex_tabview_1.c
lv_examples/src/lv_ex_widgets/lv_ex_templ.c
lv_examples/src/lv_ex_widgets/lv_ex_textarea/lv_ex_textarea_1.c
lv_examples/src/lv_ex_widgets/lv_ex_textarea/lv_ex_textarea_2.c
lv_examples/src/lv_ex_widgets/lv_ex_textarea/lv_ex_textarea_3.c
lv_examples/src/lv_ex_widgets/lv_ex_tileview/lv_ex_tileview_1.c
lv_examples/src/lv_ex_widgets/lv_ex_win/lv_ex_win_1.c
lv_drivers/display/drm.c
lv_drivers/display/fbdev.c
lv_drivers/display/GC9A01.c
lv_drivers/display/ILI9341.c
lv_drivers/display/monitor.c
lv_drivers/display/R61581.c
lv_drivers/display/SHARP_MIP.c
lv_drivers/display/SSD1963.c
lv_drivers/display/ST7565.c
lv_drivers/display/UC1610.c
lv_drivers/gtkdrv/gtkdrv.c
lv_drivers/indev/AD_touch.c
lv_drivers/indev/evdev.c
lv_drivers/indev/FT5406EE8.c
lv_drivers/indev/keyboard.c
lv_drivers/indev/libinput.c
lv_drivers/indev/mouse.c
lv_drivers/indev/mousewheel.c
lv_drivers/indev/XPT2046.c
lv_drivers/win_drv.c
main.c
)

主程序测试例子:

#include "lvgl/lvgl.h"

/* 添加 fb 支持 */
#include "lv_drivers/display/fbdev.h"

int main(void)
{
    /*LittlevGL init*/
    lv_init();

    /*Linux frame buffer device init*/
    fbdev_init();
        static lv_disp_buf_t draw_buf_dsc_1;
    static lv_color_t draw_buf_1[LV_HOR_RES_MAX * 10];
  //  static lv_disp_buf_t draw_buf_dsc_1;
 // static lv_color_t draw_buf_1[LV_HOR_RES_MAX * 10];                          /*A buffer for 10 rows*/
    lv_disp_buf_init(&draw_buf_dsc_1, draw_buf_1, NULL, LV_HOR_RES_MAX * 10);   /*Initialize the display buffer*/
    /*Add a display the LittlevGL sing the frame buffer driver*/
    lv_disp_drv_t disp_drv;
    memset(&disp_drv,0,sizeof(lv_disp_drv_t));
    lv_disp_drv_init(&disp_drv);
    disp_drv.flush_cb = fbdev_flush;      /*It flushes the internal graphical buffer to the frame buffer*/
    disp_drv.hor_res = 800;
    disp_drv.ver_res = 480;
       disp_drv.buffer=&draw_buf_dsc_1;

   
    lv_disp_drv_register(&disp_drv);

    /* 选择示例启动 */
    //lv_demo_benchmark();
lv_demo_widgets();
//lv_demo_printer();
//lv_demo_keypad_encoder();
    /*Handle LitlevGL tasks (tickless mode)*/
    while(1) {
        lv_tick_inc(5);
        lv_task_handler();
        usleep(5000);
    }

    return 0;
}

 

最终生成:

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值