RK3399双屏

http://wiki.t-firefly.com/zh_CN/Firefly-RK3399/ubuntu_support.html
//普通串口
root@firefly:~# ls /dev/ttyS*
ttyS0  ttyS1  ttyS2  ttyS3

//SPI转串口
root@firefly:~# ls /dev/ttysWK*
ttysWK0  ttysWK1  ttysWK2  ttysWK3
root@firefly:~# stty -F /dev/ttyS4
speed 9600 baud; line = 0;
-brkint -imaxbel
//设置波特率为115200
root@firefly:~# stty -F /dev/ttyS4 ospeed 115200 ispeed 115200 cs8

//查看确认是否已经修改
root@firefly:~# stty -F /dev/ttyS4
speed 115200 baud; line = 0;
-brkint -imaxbel
root@firefly:~#
//关闭回显示
root@firefly:~# stty -F /dev/ttyS4 -echo -echoe -echok

//查看所有功能的配置,检查是否已经关闭。“-”号代表该功能已经关闭
root@firefly:~# stty -F /dev/ttyS4 -a | grep echo
isig icanon iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc

root@NanoPC-T4:~# ./000000000000 
No usable crtc/encoder pair for connector "DP1"
Could not set cursor on screen HDMI1: -6
2
Could not set cursor on screen HDMI1: -6
Could not set cursor on screen HDMI1: -6
Could not set cursor on screen HDMI1: -6
Could not set cursor on screen HDMI1: -6
 

root@NanoPC-T4:~# ./000000000000 
No usable crtc/encoder pair for connector "DP1"
Could not set cursor on screen HDMI1: -6
2
Could not set cursor on screen HDMI1: -6
Could not set cursor on screen HDMI1: -6
Could not set cursor on screen HDMI1: -6
Could not set cursor on screen HDMI1: -6
 

2、

。/0000

qt.qpa.egldeviceintegration: EGL device integration plugin keys: ("eglfs_emu", "eglfs_kms_egldevice", "eglfs_kms", "eglfs_mali")
qt.qpa.egldeviceintegration: EGL device integration plugin keys (sorted): ("eglfs_kms", "eglfs_emu", "eglfs_kms_egldevice", "eglfs_mali")
qt.qpa.egldeviceintegration: Trying to load device EGL integration "eglfs_kms"
qt.qpa.eglfs.kms: New DRM/KMS via GBM integration created
qt.qpa.egldeviceintegration: Using EGL device integration "eglfs_kms"
qt.qpa.eglfs.kms: platformInit: Opening DRM device
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_DRM|Device_VideoMask)
qt.qpa.input: Found matching devices ("/dev/dri/card0")
qt.qpa.eglfs.kms: Found the following video devices: ("/dev/dri/card0")
qt.qpa.eglfs.kms: Using "/dev/dri/card0"
qt.qpa.eglfs.kms: Using backend-provided DRM device /dev/dri/card0
qt.qpa.eglfs.kms: Creating GBM device for file descriptor 5 obtained from "/dev/dri/card0"
qt.qpa.eglfs.kms: Querying EGLDisplay
qt.qpa.eglfs.kms: "eDP1" mode count: 1
qt.qpa.eglfs.kms: mode 0 1920 x 1080 @ 60 hz
qt.qpa.eglfs.kms: Selected mode 0 : 1920 x 1080 @ 60 hz for output "eDP1"
qt.qpa.eglfs.kms: Physical size is QSizeF(256, 144) mm for output "eDP1"
qt.qpa.eglfs.kms: No EDID data for output "eDP1"
qt.qpa.eglfs.kms: Creating new global GBM mouse cursor
qt.qpa.eglfs.kms: Initializing cursor atlas from ":/cursor.json"
qt.qpa.eglfs.kms: "HDMI1" mode count: 26
qt.qpa.eglfs.kms: mode 0 1600 x 900 @ 60 hz
qt.qpa.eglfs.kms: mode 1 1920 x 1080 @ 60 hz
qt.qpa.eglfs.kms: mode 2 1920 x 1080 @ 60 hz
qt.qpa.eglfs.kms: mode 3 1600 x 900 @ 75 hz
qt.qpa.eglfs.kms: mode 4 1280 x 1024 @ 75 hz
qt.qpa.eglfs.kms: mode 5 1280 x 1024 @ 70 hz
qt.qpa.eglfs.kms: mode 6 1280 x 1024 @ 60 hz
qt.qpa.eglfs.kms: mode 7 1440 x 900 @ 60 hz
qt.qpa.eglfs.kms: mode 8 1152 x 864 @ 75 hz
qt.qpa.eglfs.kms: mode 9 1280 x 720 @ 60 hz
qt.qpa.eglfs.kms: mode 10 1280 x 720 @ 60 hz
qt.qpa.eglfs.kms: mode 11 1024 x 768 @ 75 hz
qt.qpa.eglfs.kms: mode 12 1024 x 768 @ 70 hz
qt.qpa.eglfs.kms: mode 13 1024 x 768 @ 60 hz
qt.qpa.eglfs.kms: mode 14 832 x 624 @ 75 hz
qt.qpa.eglfs.kms: mode 15 800 x 600 @ 75 hz
qt.qpa.eglfs.kms: mode 16 800 x 600 @ 72 hz
qt.qpa.eglfs.kms: mode 17 800 x 600 @ 60 hz
qt.qpa.eglfs.kms: mode 18 800 x 600 @ 56 hz
qt.qpa.eglfs.kms: mode 19 720 x 480 @ 60 hz
qt.qpa.eglfs.kms: mode 20 720 x 480 @ 60 hz
qt.qpa.eglfs.kms: mode 21 640 x 480 @ 75 hz
qt.qpa.eglfs.kms: mode 22 640 x 480 @ 73 hz
qt.qpa.eglfs.kms: mode 23 640 x 480 @ 60 hz
qt.qpa.eglfs.kms: mode 24 640 x 480 @ 60 hz
qt.qpa.eglfs.kms: mode 25 720 x 400 @ 70 hz
qt.qpa.eglfs.kms: Selected mode 0 : 1600 x 900 @ 60 hz for output "HDMI1"
qt.qpa.eglfs.kms: Physical size is QSizeF(430, 240) mm for output "HDMI1"
qt.qpa.eglfs.kms: EDID data for output "HDMI1": identifier 'LEN', manufacturer 'Lenovo Group Limited', model 'LEN LS2013wA', serial '05843D36N483', physical size: 430.00x240.00
No usable crtc/encoder pair for connector "DP1"
qt.qpa.eglfs.kms: Sorted screen list: QVector(OrderedScreen(QPlatformScreen=0x55ce070830 ("eDP1") : 2147483647 / QPoint(0,0) / primary: false), OrderedScreen(QPlatformScreen=0x55ce0bca20 ("HDMI1") : 2147483647 / QPoint(0,0) / primary: false))
qt.qpa.eglfs.kms: Adding QPlatformScreen 0x55ce070830 ( "eDP1" ) to QPA with geometry QRect(0,0 1920x1080) and isPrimary= false
qt.qpa.eglfs.kms: Adding QPlatformScreen 0x55ce0bca20 ( "HDMI1" ) to QPA with geometry QRect(0,0 1600x900) and isPrimary= false
qt.qpa.input: evdevkeyboard: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Keyboard)
qt.qpa.input: Found matching devices ("/dev/input/event4", "/dev/input/event2", "/dev/input/event3", "/dev/input/event6")
qt.qpa.input: Adding keyboard at "/dev/input/event4"
qt.qpa.input: Try to create keyboard handler for "/dev/input/event4" ""
qt.qpa.input: Opening keyboard at "/dev/input/event4"
qt.qpa.input: Create keyboard handler with for device "/dev/input/event4"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: Adding keyboard at "/dev/input/event2"
qt.qpa.input: Try to create keyboard handler for "/dev/input/event2" ""
qt.qpa.input: Opening keyboard at "/dev/input/event2"
qt.qpa.input: Create keyboard handler with for device "/dev/input/event2"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: Adding keyboard at "/dev/input/event3"
qt.qpa.input: Try to create keyboard handler for "/dev/input/event3" ""
qt.qpa.input: Opening keyboard at "/dev/input/event3"
qt.qpa.input: Create keyboard handler with for device "/dev/input/event3"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: Adding keyboard at "/dev/input/event6"
qt.qpa.input: Try to create keyboard handler for "/dev/input/event6" ""
qt.qpa.input: Opening keyboard at "/dev/input/event6"
qt.qpa.input: Create keyboard handler with for device "/dev/input/event6"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: evdevmouse: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Mouse|Device_Touchpad)
qt.qpa.input: Found matching devices ("/dev/input/event3")
qt.qpa.input: Adding mouse at "/dev/input/event3"
qt.qpa.input: create mouse handler for "/dev/input/event3" ""
Could not set cursor on screen HDMI1: -6
qt.qpa.input: evdevtouch: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Touchpad|Device_Touchscreen)
qt.qpa.input: Found matching devices ("/dev/input/event1")
qt.qpa.input: evdevtouch: Adding device at "/dev/input/event1"
qt.qpa.input: evdevtouch: Using device /dev/input/event1
qt.qpa.input: evdevtouch: /dev/input/event1: Protocol type B  (multi), filtered=no
qt.qpa.input: evdevtouch: /dev/input/event1: min X: 0 max X: 1920
qt.qpa.input: evdevtouch: /dev/input/event1: min Y: 0 max Y: 1080
qt.qpa.input: evdevtouch: /dev/input/event1: min pressure: 0 max pressure: 0
qt.qpa.input: evdevtouch: /dev/input/event1: device name: EP0790M09
2
qt.qpa.eglfs.kms: Creating window for screen "HDMI1"
Could not set cursor on screen HDMI1: -6
Could not set cursor on screen HDMI1: -6
qt.qpa.eglfs.kms: Creating window for screen "eDP1"
Could not set cursor on screen HDMI1: -6
Could not set cursor on screen HDMI1: -6
qt.qpa.input: evdevtouch: Updating QInputDeviceManager device count: 1  touch devices, 0 pending handler(s)

////////////////////////////////////////////////////////

qt.qpa.egldeviceintegration: EGL device integration plugin keys: ("eglfs_emu", "eglfs_kms_egldevice", "eglfs_kms", "eglfs_mali")
qt.qpa.egldeviceintegration: EGL device integration plugin keys (sorted): ("eglfs_kms", "eglfs_emu", "eglfs_kms_egldevice", "eglfs_mali")
qt.qpa.egldeviceintegration: Trying to load device EGL integration "eglfs_kms"
qt.qpa.eglfs.kms: New DRM/KMS via GBM integration created
qt.qpa.egldeviceintegration: Using EGL device integration "eglfs_kms"
qt.qpa.eglfs.kms: platformInit: Opening DRM device
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_DRM|Device_VideoMask)
qt.qpa.input: Found matching devices ("/dev/dri/card0")
qt.qpa.eglfs.kms: Found the following video devices: ("/dev/dri/card0")
qt.qpa.eglfs.kms: Using "/dev/dri/card0"
qt.qpa.eglfs.kms: Using backend-provided DRM device /dev/dri/card0
qt.qpa.eglfs.kms: Creating GBM device for file descriptor 5 obtained from "/dev/dri/card0"
qt.qpa.eglfs.kms: Querying EGLDisplay
qt.qpa.eglfs.kms: "eDP1" mode count: 1
qt.qpa.eglfs.kms: mode 0 1920 x 1080 @ 60 hz
qt.qpa.eglfs.kms: Selected mode 0 : 1920 x 1080 @ 60 hz for output "eDP1"
qt.qpa.eglfs.kms: Physical size is QSizeF(256, 144) mm for output "eDP1"
qt.qpa.eglfs.kms: No EDID data for output "eDP1"
qt.qpa.eglfs.kms: Creating new global GBM mouse cursor
qt.qpa.eglfs.kms: Initializing cursor atlas from ":/cursor.json"
qt.qpa.eglfs.kms: "HDMI1" mode count: 26
qt.qpa.eglfs.kms: mode 0 1600 x 900 @ 60 hz
qt.qpa.eglfs.kms: mode 1 1920 x 1080 @ 60 hz
qt.qpa.eglfs.kms: mode 2 1920 x 1080 @ 60 hz
qt.qpa.eglfs.kms: mode 3 1600 x 900 @ 75 hz
qt.qpa.eglfs.kms: mode 4 1280 x 1024 @ 75 hz
qt.qpa.eglfs.kms: mode 5 1280 x 1024 @ 70 hz
qt.qpa.eglfs.kms: mode 6 1280 x 1024 @ 60 hz
qt.qpa.eglfs.kms: mode 7 1440 x 900 @ 60 hz
qt.qpa.eglfs.kms: mode 8 1152 x 864 @ 75 hz
qt.qpa.eglfs.kms: mode 9 1280 x 720 @ 60 hz
qt.qpa.eglfs.kms: mode 10 1280 x 720 @ 60 hz
qt.qpa.eglfs.kms: mode 11 1024 x 768 @ 75 hz
qt.qpa.eglfs.kms: mode 12 1024 x 768 @ 70 hz
qt.qpa.eglfs.kms: mode 13 1024 x 768 @ 60 hz
qt.qpa.eglfs.kms: mode 14 832 x 624 @ 75 hz
qt.qpa.eglfs.kms: mode 15 800 x 600 @ 75 hz
qt.qpa.eglfs.kms: mode 16 800 x 600 @ 72 hz
qt.qpa.eglfs.kms: mode 17 800 x 600 @ 60 hz
qt.qpa.eglfs.kms: mode 18 800 x 600 @ 56 hz
qt.qpa.eglfs.kms: mode 19 720 x 480 @ 60 hz
qt.qpa.eglfs.kms: mode 20 720 x 480 @ 60 hz
qt.qpa.eglfs.kms: mode 21 640 x 480 @ 75 hz
qt.qpa.eglfs.kms: mode 22 640 x 480 @ 73 hz
qt.qpa.eglfs.kms: mode 23 640 x 480 @ 60 hz
qt.qpa.eglfs.kms: mode 24 640 x 480 @ 60 hz
qt.qpa.eglfs.kms: mode 25 720 x 400 @ 70 hz
qt.qpa.eglfs.kms: Selected mode 0 : 1600 x 900 @ 60 hz for output "HDMI1"
qt.qpa.eglfs.kms: Physical size is QSizeF(430, 240) mm for output "HDMI1"
qt.qpa.eglfs.kms: EDID data for output "HDMI1": identifier 'LEN', manufacturer 'Lenovo Group Limited', model 'LEN LS2013wA', serial '05843D36N483', physical size: 430.00x240.00
No usable crtc/encoder pair for connector "DP1"
qt.qpa.eglfs.kms: Sorted screen list: QVector(OrderedScreen(QPlatformScreen=0x5576034c00 ("eDP1") : 2147483647 / QPoint(0,0) / primary: false), OrderedScreen(QPlatformScreen=0x5576077d00 ("HDMI1") : 2147483647 / QPoint(0,0) / primary: false))
qt.qpa.eglfs.kms: Adding QPlatformScreen 0x5576034c00 ( "eDP1" ) to QPA with geometry QRect(0,0 1920x1080) and isPrimary= false
qt.qpa.eglfs.kms: Adding QPlatformScreen 0x5576077d00 ( "HDMI1" ) to QPA with geometry QRect(0,0 1600x900) and isPrimary= false
qt.qpa.input: evdevkeyboard: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Keyboard)
qt.qpa.input: Found matching devices ("/dev/input/event4", "/dev/input/event2", "/dev/input/event3", "/dev/input/event6")
qt.qpa.input: Adding keyboard at "/dev/input/event4"
qt.qpa.input: Try to create keyboard handler for "/dev/input/event4" ""
qt.qpa.input: Opening keyboard at "/dev/input/event4"
qt.qpa.input: Create keyboard handler with for device "/dev/input/event4"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: Adding keyboard at "/dev/input/event2"
qt.qpa.input: Try to create keyboard handler for "/dev/input/event2" ""
qt.qpa.input: Opening keyboard at "/dev/input/event2"
qt.qpa.input: Create keyboard handler with for device "/dev/input/event2"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: Adding keyboard at "/dev/input/event3"
qt.qpa.input: Try to create keyboard handler for "/dev/input/event3" ""
qt.qpa.input: Opening keyboard at "/dev/input/event3"
qt.qpa.input: Create keyboard handler with for device "/dev/input/event3"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: Adding keyboard at "/dev/input/event6"
qt.qpa.input: Try to create keyboard handler for "/dev/input/event6" ""
qt.qpa.input: Opening keyboard at "/dev/input/event6"
qt.qpa.input: Create keyboard handler with for device "/dev/input/event6"
qt.qpa.input: Unload current keymap and restore built-in
qt.qpa.input: numlock=0 , capslock=0, scrolllock=0
qt.qpa.input: evdevmouse: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Mouse|Device_Touchpad)
qt.qpa.input: Found matching devices ("/dev/input/event3")
qt.qpa.input: Adding mouse at "/dev/input/event3"
qt.qpa.input: create mouse handler for "/dev/input/event3" ""
Could not set cursor on screen HDMI1: -6
qt.qpa.input: evdevtouch: Using device discovery
qt.qpa.input: udev device discovery for type QFlags<QDeviceDiscovery::QDeviceType>(Device_Touchpad|Device_Touchscreen)
qt.qpa.input: Found matching devices ("/dev/input/event1")
qt.qpa.input: evdevtouch: Adding device at "/dev/input/event1"
Application sees 2 screens
(QScreen(0x55760830f0, name="eDP1"), QScreen(0x557605ba10, name="HDMI1"))
Creating new QQuickView for screen 0x55760830f0
qt.scenegraph.general: threaded render loop
qt.scenegraph.general: Using sg animation driver
qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms
qt.qpa.input: evdevtouch: Using device /dev/input/event1
qt.qpa.input: evdevtouch: /dev/input/event1: Protocol type B  (multi), filtered=no
qt.qpa.input: evdevtouch: /dev/input/event1: min X: 0 max X: 1920
qt.qpa.input: evdevtouch: /dev/input/event1: min Y: 0 max Y: 1080
qt.qpa.input: evdevtouch: /dev/input/event1: min pressure: 0 max pressure: 0
qt.qpa.input: evdevtouch: /dev/input/event1: device name: EP0790M09
qt.qpa.eglfs.kms: Creating window for screen "eDP1"
qt.scenegraph.general: Using sg animation driver
qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms
qt.scenegraph.general: texture atlas dimensions: 2048x2048
qt.scenegraph.general: R/G/B/A Buffers:    8 8 8 0
qt.scenegraph.general: Depth Buffer:       24
qt.scenegraph.general: Stencil Buffer:     8
qt.scenegraph.general: Samples:            0
qt.scenegraph.general: GL_VENDOR:          ARM
qt.scenegraph.general: GL_RENDERER:        Mali-T860
qt.scenegraph.general: GL_VERSION:         OpenGL ES 3.2 v1.r14p0-01rel0-git(966ed26).2e3fa7564ebca70897f04bd9fb7bc67e
qt.scenegraph.general: GL_EXTENSIONS:      GL_KHR_texture_compression_astc_hdr GL_EXT_color_buffer_half_float GL_EXT_sRGB GL_OES_standard_derivatives GL_ARM_shader_framebuffer_fetch_depth_stencil GL_OES_depth_texture_cube_map GL_EXT_disjoint_timer_query GL_EXT_color_buffer_float GL_EXT_geometry_shader GL_OVR_multiview GL_KHR_debug GL_OES_vertex_half_float GL_EXT_gpu_shader5 GL_OES_depth24 GL_OES_EGL_sync GL_EXT_tessellation_shader GL_OES_primitive_bounding_box GL_OES_mapbuffer GL_EXT_texture_type_2_10_10_10_REV GL_EXT_shader_pixel_local_storage GL_OES_EGL_image GL_ARM_mali_shader_binary GL_OES_surfaceless_context GL_EXT_robustness GL_OVR_multiview2 GL_OES_draw_elements_base_vertex GL_EXT_YUV_target GL_OES_texture_compression_astc GL_ARM_rgba8 GL_EXT_shadow_samplers GL_KHR_texture_compression_astc_ldr GL_OES_texture_npot GL_ARM_mali_program_binary GL_OES_texture_cube_map_array GL_EXT_shader_io_blocks GL_OES_tessellation_shader GL_OES_depth_texture GL_OES_fbo_render_mipmap GL_OES_texture_border_clamp GL_OES_EGL_image_external GL_OES_packed_depth_stencil GL_EXT_sRGB_write_control GL_OES_shader_multisample_interpolation GL_EXT_texture_sRGB_decode GL_EXT_texture_storage GL_EXT_primitive_bounding_box GL_EXT_occlusion_query_boolean GL_OES_texture_storage_multisample_2d_array GL_EXT_texture_border_clamp GL_EXT_multisampled_render_to_texture GL_OES_texture_stencil8 GL_ANDROID_extension_pack_es31a GL_OES_compressed_paletted_texture GL_KHR_robustness GL_OES_sample_variables GL_KHR_robust_buffer_access_behavior GL_EXT_discard_framebuffer GL_OES_texture_3D GL_KHR_blend_equation_advanced GL_OES_draw_buffers_indexed GL_OES_element_index_uint GL_OES_geometry_shader  GL_EXT_texture_cube_map_array GL_OES_compressed_ETC1_RGB8_texture GL_OES_EGL_image_external_essl3 GL_EXT_texture_format_BGRA8888 GL_OES_vertex_array_object GL_EXT_draw_buffers_indexed GL_EXT_draw_elements_base_vertex GL_OES_rgb8_rgba8 GL_OES_sample_shading GL_EXT_texture_buffer GL_OES_get_program_binary GL_OES_copy_image GL_OES_gpu_shader5 GL_OES_shader_image_atomic GL_EXT_read_format_bgra GL_KHR_blend_equation_advanced_coherent GL_OES_shader_io_blocks GL_ARM_shader_framebuffer_fetch GL_OES_texture_buffer GL_EXT_texture_rg GL_KHR_texture_compression_astc_sliced_3d GL_OVR_multiview_multisampled_render_to_texture GL_EXT_blend_minmax GL_OES_required_internalformat GL_EXT_copy_image
qt.scenegraph.general: Max Texture Size:  8192
qt.scenegraph.general: Debug context:     false
Creating new QQuickView for screen 0x557605ba10
qt.qpa.eglfs.kms: Creating window for screen "HDMI1"
qt.scenegraph.general: Using sg animation driver
qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms
qt.scenegraph.general: texture atlas dimensions: 2048x1024
qt.qpa.input: evdevtouch: Updating QInputDeviceManager device count: 1  touch devices, 0 pending handler(s)
 

发布了165 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42269817/article/details/103343494
今日推荐