chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

龍芯2K500先鋒板試用體驗,驅(qū)動OLED小屏播放視頻

電子發(fā)燒友開源社區(qū) ? 來源:未知 ? 2023-02-04 12:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、硬件準備

硬件部分主要包括:

  • 龍芯2K500先鋒板
  • 0.96寸OLED

OLED屏幕參數(shù):

開發(fā)板選擇使用I2C1,和OLED屏接線參考下圖:

efc7c83c-a446-11ed-bfe3-dac502259ad0.png

開發(fā)板和OLED小屏的連接關(guān)系為:

  • 3號針(I2C1_SCL)連接到OLED屏的SCL腳

  • 4號針(I2C1_SDA)連接到OLED屏的SDA腳

  • 23號針(GND)連接到OLED屏的GND腳

  • 24號針(P3V3)連接到OLED屏的VCC腳

二、背景知識

開始之前,先簡單介紹一些背景知識。

2.1 Linux內(nèi)核I2C驅(qū)動配置

龍芯2K0500內(nèi)核默認已經(jīng)打開了I2C驅(qū)動,啟動后使用如下命令可以看到:

ls /dev/i2c-*

(左右移動查看全部內(nèi)容)

已經(jīng)有i2c設(shè)備了。

2.2 Linux用戶空間I2C API

參考這個文檔:https://www.kernel.org/doc/html/latest/i2c/dev-interface.html

用戶空間使用I2C,首先需要包含頭文件:

#include 
#include 

(左右移動查看全部內(nèi)容)

然后,打開設(shè)備文件:

int file;
int adapter_nr = 2; /* probably dynamically determined */
char filename[20];


snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);
file = open(filename, O_RDWR);
if (file < 0) {
 /* ERROR HANDLING; you can check errno to see what went wrong */
 exit(1);
}

(左右移動查看全部內(nèi)容)

打開設(shè)備之后,需要指定需要通信的從設(shè)備地址:

int addr = 0x40; /* The I2C address */


if (ioctl(file, I2C_SLAVE, addr) < 0) {
 /* ERROR HANDLING; you can check errno to see what went wrong */
 exit(1);
}

(左右移動查看全部內(nèi)容)

好了,接下來就可以進行I2C通信了:

/*
 * Using I2C Write, equivalent of
 * i2c_smbus_write_word_data(file, reg, 0x6543)
 */
buf[0] = reg;
buf[1] = 0x43;
buf[2] = 0x65;
if (write(file, buf, 3) != 3) {
 /* ERROR HANDLING: I2C transaction failed */
}


/* Using I2C Read, equivalent of i2c_smbus_read_byte(file) */
if (read(file, buf, 1) != 1) {
 /* ERROR HANDLING: I2C transaction failed */
} else {
 /* buf[0] contains the read byte */
}

(左右移動查看全部內(nèi)容)

以上幾個代碼段,都來自于kernel.org的文檔。

三、移植SSD1306驅(qū)動庫

3.1 選擇SSD1306驅(qū)動庫

之前移植過的一個STM32的SSD1306驅(qū)動庫,原始開源項目鏈接:https://github.com/afiskon/stm32-ssd1306

移植后的開源項目連接:https://gitee.com/hihopeorg/harmonyos-ssd1306

這個移植版本主要修改包括:

  • 適配了OpenHarmony 1.0的WIFI_IOT硬件接口;

  • 添加了一個用于繪制矩形位圖的接口,可用于繪制漢字;

  • 優(yōu)化了I2C全屏刷新速率;

這里使用移植版本作為基礎(chǔ)。

3.2 移植SSD1306驅(qū)動庫

主要修改點包括:

  • 初始化函數(shù)ssd1306_Reset中,添加打開I2C設(shè)備的代碼;

  • 發(fā)送數(shù)據(jù)函數(shù)ssd1306_SendData中,修改為使用I2C用戶空間接口的代碼;

  • 延時函數(shù)HAL_Delay,修改為使用ulseep實現(xiàn);

  • 計時函數(shù)HAL_GetTick,修改為使用gettimeofday實現(xiàn);

  • 添加了關(guān)閉函數(shù)ssd1306_Finish,用于關(guān)閉初始化時打開的I2C設(shè)備;

修改之后,這幾個函數(shù)的主要代碼為:

static int g_i2c = -1;


static uint64_t g_start_ms = 0;


#define TV2MS(tv) ((tv).tv_sec * 1000 + (tv).tv_usec / 1000)


void ssd1306_Reset(void)
{
  char path[128] = {0};
  snprintf(path, sizeof(path), "/dev/i2c-%d", SSD1306_DEV_NO);


  g_i2c = open(path, O_RDWR);
  if (g_i2c < 0) {
    printf("open %s failed, %s!
", path, strerror(errno));
  }


  if (ioctl(g_i2c, I2C_SLAVE, SSD1306_DEV_ADDR) < 0) {
    /* ERROR HANDLING; you can check errno to see what went wrong */
    printf("ioctl %s I2C_SLAVE failed, %s!
", path, strerror(errno));
    exit(1);
  }


  struct timeval start_tv = {0};
  if (gettimeofday(&start_tv, NULL) != 0) {
    printf("gettimeofday failed!
");
  }
  g_start_ms = TV2MS(start_tv);
}


void ssd1306_Finish(void)
{
  if (g_i2c >= 0) {
    close(g_i2c);
  }
}


void HAL_Delay(uint32_t ms)
{
  usleep(ms * 1000);
}


uint32_t HAL_GetTick(void)
{
  struct timeval now_tv = {0};
  if (gettimeofday(&now_tv, NULL) != 0) {
    printf("gettimeofday failed!
");
  }


  return TV2MS(now_tv) - g_start_ms;
}


uint32_t HAL_GetTickFreq(void)
{
  return 1000;
}


static uint32_t ssd1306_SendData(uint8_t* data, size_t size)
{
  struct i2c_msg msg = {0};
  msg.addr = SSD1306_DEV_ADDR;
  msg.buf = data;
  msg.len = size;


  if (g_i2c >= 0) {
    struct i2c_rdwr_ioctl_data data = {0};
    data.msgs = &msg;
    data.nmsgs = 1;
    return ioctl(g_i2c, I2C_RDWR, &data) < 0 ? -1 : 0;
  }
  return -1;
}

(左右移動查看全部內(nèi)容)

3.3 添加CMake構(gòu)建規(guī)則文件

接下來添加CMake構(gòu)建規(guī)則CMakeLists.txt文件,分別到ssd1306目錄和examples目錄。

ssd1306目錄的CMakeLists.txt用于編譯驅(qū)動庫,內(nèi)容為:

set(sources
  ssd1306.c
  ssd1306_fonts.c
)


add_library(ssd1306 STATIC ${sources})
include_directories(.)

(左右移動查看全部內(nèi)容)

3.4 移植SSD1306測試程序

之前移植版的測試程序適配的是OpenHarmony 1.0,這里也需要修改,主要修改點:

  • ssd1306_demo.c文件中,移除和OpenHarmony相關(guān)的代碼;

  • 添加main函數(shù)作為入口;

examples目錄的CMakeLists.txt用于編譯測試程序,內(nèi)容為:

set(sources
  ssd1306_demo.c
  ssd1306_tests.c
)


add_executable(oled_test ${sources})
add_definitions(-DUSE_MAIN)
target_link_libraries(oled_test ssd1306)
target_link_libraries(oled_test m)
include_directories(../ssd1306)

(左右移動查看全部內(nèi)容)

3.5 LoongArch CMake構(gòu)建參數(shù)

頂層的CMakeLists.txt文件內(nèi)容如下:

cmake_minimum_required(VERSION 3.21.0) # 網(wǎng)上看到消息稱這個版本的cmake才支持loongarch


set(CMAKE_SYSTEM_PROCESSOR loongarch)
set(CMAKE_C_COMPILER loongarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER loongarch64-linux-gnu-g++)
set(CMAKE_C_FLAGS -Wall)


project(ssd1306_oled)


add_subdirectory(ssd1306)
add_subdirectory(examples)

(左右移動查看全部內(nèi)容)

由于這里我添加了CMAKE_SYSTEM_PROCESSOR、CMAKE_C_COMPILER、CMAKE_CXX_COMPILER三個參數(shù),因此可以直接編譯出LoongArch的可執(zhí)行程序了。

如果不在CMakeLists.txt文件中指定這幾個參數(shù),通過命令行參數(shù)指定也是可以的:

cmake -B build -DCMAKE_SYSTEM_PROCESSOR=loongarch -DCMAKE_C_COMPILER=loongarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=loongarch64-linux-gnu-g++

(左右移動查看全部內(nèi)容)

3.6 編譯、運行SSD1306測試程序

完成以上步驟后,就可以編譯SSD1306測試程序了。編譯:

# 生成 Makefile ,build 為生成的目錄
cmake -B build


# 編譯 ,或者 cd build && make 也可以
cmake --build build

(左右移動查看全部內(nèi)容)

編譯完成后,build/examples目錄下生成了oled_test二進制文件,將其拷貝到開發(fā)板上。運行測試程序:

./oeld_test

(左右移動查看全部內(nèi)容)

不出意外的話,就可以看到OLED上正常顯示各種測試畫面了:

efdbb9dc-a446-11ed-bfe3-dac502259ad0.png

四、實現(xiàn)SSD1306播放視頻

4.1 準備視頻文件

首先需要準備一個視頻文件,例如,我這里找的是蔡徐坤的“雞你太美”視頻;

4.2 轉(zhuǎn)換視頻格式

前面測試發(fā)現(xiàn)最大幀率接近 8 fps,接下來需要使用ffmpeg將視頻轉(zhuǎn)換為幀率 8 fps。轉(zhuǎn)換命令為:

ffmpeg -i input.mp4 -r 10 output.mp4

(左右移動查看全部內(nèi)容)

之后再使用Python腳本將視頻轉(zhuǎn)換為原始幀的二進制文件:

./video2bin.py output.mp4 out.bin

(左右移動查看全部內(nèi)容)

這里的bin文件包含若干個連續(xù)的原始幀數(shù)據(jù),每個原始幀占用1KB(128x64/8=1024);

完整的視頻轉(zhuǎn)換python腳本,

#!/usr/bin/env python3
import sys
import cv2 as cv


TARGET_WIDTH = 128
TARGET_HEIGHT = 64
PIXEL_PER_BYTE = 8
WIDTH_BYTES = int(TARGET_WIDTH/PIXEL_PER_BYTE)
PIXEL_THRESHOLD = 128.0


# 將多個灰度像素打包到一個整數(shù)中
def pack_pixels(pixels, threshold):
  value = 0
  for gray in pixels:
    bit = 1 if gray >= threshold else 0 # 二值化
    value = (value << 1) + bit # 多個二值化像素值拼接為一個字節(jié)值
  return value


frameCount = 0
def resize_and_binarize_image(frame, width, height, threshold):
  data = []
  # count = 0 # for debug
  frame = cv2.resize(frame, (width, height)) # 縮放
  frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) # 轉(zhuǎn)為灰度圖
  _, binary = cv2.threshold(frame, threshold, 255, cv2.THRESH_BINARY) # 二值化


  for r in range(height):
    for b in range(int(width / PIXEL_PER_BYTE)):
      colStart = b * PIXEL_PER_BYTE
      pixels = frame[r, colStart: colStart + PIXEL_PER_BYTE]
      byte = pack_pixels(pixels, threshold)
      data.append(byte)
  return bytes(data)


def convert_frame_to_bytes(frame):
  return resize_and_binarize_image(frame, TARGET_WIDTH, TARGET_HEIGHT, PIXEL_THRESHOLD)


def convert_video_to_bin(videoFile, binFile):
  cap = cv.VideoCapture(videoFile)
  frameCount = cap.get(cv.CAP_PROP_FRAME_COUNT)
  print('frame count:', frameCount)
  print('frame width:', cap.get(cv.CAP_PROP_FRAME_WIDTH))
  print('frame height:', cap.get(cv.CAP_PROP_FRAME_HEIGHT))
  lastPercent = 0
  with open(binFile, 'wb+') as f:
    while True:
      retval, frame = cap.read()
      if not retval:
        print('video done!')
        break
      bitmap = convert_frame_to_bytes(frame)
      f.write(bitmap)
      pos = cap.get(cv.CAP_PROP_POS_FRAMES)
      percent = pos / frameCount * 100
      if percent - lastPercent >= 1:
        lastPercent = percent
        sys.stdout.write('=')
        sys.stdout.flush()
  print('convert all frames done!')
  cap.release()


def main():
  if len(sys.argv) < 3:
    print("Usage: {} videoFile binFile
	".format(sys.argv[0]))
    exit(-1)


  try:
    videoFile = sys.argv[1]
    binFile = sys.argv[2]
    convert_video_to_bin(videoFile, binFile)
  except Exception as e:
    print('exception raised:', e)


if __name__ == "__main__":
  main()

(左右移動查看全部內(nèi)容)

4.3 實現(xiàn)視頻播放

在examples目錄下,添加ssd1306_play.cpp文件,代碼如下:

#include "ssd1306.h"


#include 
#include 
#include 
#include 


int play(char* video_bin)
{
  std::unique_ptrdecltype,>(&fclose)> fptr{fopen(video_bin, "rb"), fclose};


  uint32_t count = 0;
  uint8_t frame[SSD1306_BUFFER_SIZE] = {0};


  ssd1306_Init();
  uint32_t beg = HAL_GetTick();
  for(;;) {
    size_t nbytes = fread(frame, 1, sizeof(frame), fptr.get());
    if (ferror(fptr.get())) {
      printf("Error: %s
", strerror(errno));
      return -1;
    }
    if (feof(fptr.get())) {
      break;
    }


    ssd1306_Fill(Black);
    ssd1306_DrawBitmap(frame, sizeof(frame));
    ssd1306_UpdateScreen();
    count++;
  }
  uint32_t end = HAL_GetTick();


  ssd1306_Fill(Black);
  ssd1306_UpdateScreen();
  ssd1306_Finish();


  float cost = (end - beg) / (float) HAL_GetTickFreq();
  printf("Total frames : %d
", count);
  printf("Total time(s): %.3f
", cost);
  printf("Average FPS : %.3f
", count / cost);
  return 0;
}


int main(int argc, char* argv[])
{
  if (argc <= 1) {
    printf("Usage: %s video.bin
", argv[0]);
    return 1;
  }


  return play(argv[1]);
}

(左右移動查看全部內(nèi)容)

這段代碼實現(xiàn)了播放原始視頻二進制文件;

4.4 添加構(gòu)建規(guī)則

examples目錄的CMakeLists.txt中添加:

add_executable(oled_play ssd1306_play.cpp)
target_link_libraries(oled_play ssd1306)
include_directories(../ssd1306)

(左右移動查看全部內(nèi)容)

4.5 播放視頻文件

完成以上操作后,重新編譯,再次運行:

./oled_play ikun.bin

(左右移動查看全部內(nèi)容)

效果如下:

五、源碼倉庫

本文所有代碼均已在碼云開源,鏈接為:https://gitee.com/swxu/linux-ssd1306

六、參考鏈接

  • Implementing I2C device drivers in userspace — The Linux Kernel documentation:https://www.kernel.org/doc/html/latest/i2c/dev-interface.html

  • 一個STM32 SSD1306驅(qū)動庫:https://github.com/afiskon/stm32-ssd1306

  • 【只因太美】用龍芯2K0500驅(qū)動小屏放視頻:https://www.bilibili.com/video/BV1Gv4y1i7nW/

更多熱點文章閱讀
  • 基于 OpenHarmony 的智能電磁炮
  • 【我的2022】堅果:我和OpenHarmony的這一年
  • OpenHarmony小型系統(tǒng)兼容性測試指南
  • 玩轉(zhuǎn)OpenHarmony社交場景:即時通訊平臺
  • 龍芯 2K500 開發(fā)板 Linux環(huán)境基礎(chǔ)調(diào)教和使用

提示:本文由電子發(fā)燒友社區(qū)發(fā)布,轉(zhuǎn)載請注明以上來源。如需社區(qū)合作及入群交流,請?zhí)砑游⑿臙EFans0806,或者發(fā)郵箱liuyong@huaqiu.com。


原文標題:龍芯2K500先鋒板試用體驗,驅(qū)動OLED小屏播放視頻

文章出處:【微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 電子發(fā)燒友
    +關(guān)注

    關(guān)注

    33

    文章

    577

    瀏覽量

    33861
  • 開源社區(qū)
    +關(guān)注

    關(guān)注

    0

    文章

    95

    瀏覽量

    712

原文標題:龍芯2K500先鋒板試用體驗,驅(qū)動OLED小屏播放視頻

文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    喜訊 | 眺望電子2K3000工控系列入選龍芯中科伙伴產(chǎn)品

    電子同時,眺望電子2K3000系列的核心,工控和工控機也成功入選龍芯2K3000芯片在工控應(yīng)用領(lǐng)域的首款伙伴產(chǎn)品,為工控嵌入式市場用戶提
    的頭像 發(fā)表于 07-25 08:31 ?571次閱讀
    喜訊 | 眺望電子<b class='flag-5'>2K</b>3000工控系列入選<b class='flag-5'>龍芯</b>中科伙伴產(chǎn)品

    全方位解析,眺望電子2K3000核心參數(shù)與設(shè)計

    前言:6月26日,廣州眺望電子作為龍芯硬件生態(tài)在大灣區(qū)的核心合作伙伴,在北京中關(guān)村國際創(chuàng)新中心舉行的2025龍芯產(chǎn)品發(fā)布會暨用戶大會上登臺展示基于龍芯2K3000核心
    的頭像 發(fā)表于 07-04 14:02 ?1067次閱讀
    全方位解析,眺望電子<b class='flag-5'>2K</b>3000核心<b class='flag-5'>板</b>參數(shù)與設(shè)計

    4K和8K顯示器驅(qū)動的區(qū)別

    前面我們有講到lhdh4k 4KUSB3.0顯示方案以及驅(qū)動出現(xiàn)噪音應(yīng)該如何解決?,今天我們來聊一聊有關(guān)
    的頭像 發(fā)表于 06-06 11:18 ?1140次閱讀

    龍芯2K0300蜂鳥試用】固件更新與測試

    龍芯2K0300蜂鳥試用】固件更新與測試 本文介紹了龍芯2K300蜂鳥開發(fā)板實現(xiàn)官方固件更新
    發(fā)表于 06-06 04:52

    龍芯2K0300開發(fā)軟件資料-新世界更新

    【資料更新】正點原子龍芯2K0300開發(fā)資料更新! 龍芯2K0300開發(fā)軟件資料-新世界更新
    發(fā)表于 04-22 14:16

    基于龍芯2K0300-I的工業(yè)級核心

    格欣以龍芯工業(yè)級微處理器芯片LS2K0300-I為核心設(shè)計的工業(yè)級核心(AH2300)已經(jīng)面向市場發(fā)布,受到廣泛關(guān)注。 LS2K0300-I具有一些鮮明特點:1、LS
    發(fā)表于 04-19 18:24

    基于龍芯2K0300處理器 龍芯中科攜手正點原子發(fā)布龍芯ATK-DL2K0300B開發(fā)

    龍芯中科攜手正點原子發(fā)布龍芯ATK-DL2K0300B開發(fā)。該開發(fā)為正點原子發(fā)布的首款龍芯
    的頭像 發(fā)表于 02-25 15:29 ?1141次閱讀
    基于<b class='flag-5'>龍芯</b><b class='flag-5'>2K</b>0300處理器 <b class='flag-5'>龍芯</b>中科攜手正點原子發(fā)布<b class='flag-5'>龍芯</b>ATK-DL<b class='flag-5'>2K</b>0300B開發(fā)<b class='flag-5'>板</b>

    龍芯2K0300開發(fā)及資料來襲,開啟國產(chǎn)芯片新篇章!

    正點原子攜手龍芯正式發(fā)布首款龍芯開發(fā):ATK-DL2K0300開發(fā)!基于龍芯LS
    發(fā)表于 02-24 15:04

    廣東龍芯2K300先鋒派&amp;鋒鳥新世界BSP

    /docs-2k0300 說明文檔見這里 https://gitee.com/open-loongarch/build-2k0300 一鍵拉取源碼和交叉工具鏈見這里 廣東龍芯2K300
    發(fā)表于 02-14 17:03

    迅為電子推出基于龍芯2K0300的HMI產(chǎn)品

    2024年6月,龍芯中科發(fā)布了又一款重磅產(chǎn)品龍芯2K0300,龍芯2K0300芯片是一款基于LA264處理器核的多功能SoC芯片,可廣泛適用
    的頭像 發(fā)表于 02-13 14:30 ?801次閱讀
    迅為電子推出基于<b class='flag-5'>龍芯</b><b class='flag-5'>2K</b>0300的HMI產(chǎn)品

    迅為龍芯2K1000開發(fā)/核心介紹

    視頻教程 新增龍芯2K1000開發(fā)環(huán)境搭建系列、系統(tǒng)編譯與燒寫系列、PMON基礎(chǔ)知識及啟動流程分析系列、pmon移植教程系列視頻教程。更多視頻
    發(fā)表于 02-08 11:01

    自主可控的全國產(chǎn)方案,基于龍芯LS2K1000LA-i!

    龍芯LS2K1000LA-i產(chǎn)品簡介 LS2K1000LA-i是龍芯雙核LoongArch LA264自主架構(gòu)處理器。創(chuàng)龍科技基于LS2K1
    的頭像 發(fā)表于 01-24 09:26 ?800次閱讀
    自主可控的全國產(chǎn)方案,基于<b class='flag-5'>龍芯</b>LS<b class='flag-5'>2K</b>1000LA-i!

    【迅為電子】龍芯LS2K1000LA和LS2K1000有何區(qū)別?

    【迅為電子】龍芯LS2K1000LA和LS2K1000有何區(qū)別?
    的頭像 發(fā)表于 11-13 14:13 ?992次閱讀
    【迅為電子】<b class='flag-5'>龍芯</b>LS<b class='flag-5'>2K</b>1000LA和LS<b class='flag-5'>2K</b>1000有何區(qū)別?

    使用dp接口播放4K視頻的技巧

    在數(shù)字時代,4K視頻已經(jīng)成為家庭娛樂和專業(yè)領(lǐng)域中越來越常見的格式。4K視頻提供了比傳統(tǒng)1080p視頻更高的分辨率和更豐富的細節(jié),為觀眾帶來了
    的頭像 發(fā)表于 10-30 13:56 ?2413次閱讀

    新品發(fā)布 | 龍芯2K0300系列正式開售

    產(chǎn)嵌入式生態(tài)建設(shè)上攜手合作,堅定推動國產(chǎn)自主可控的發(fā)展路線。當(dāng)前已合作平臺有:龍芯2K0300蜂鳥派核心,龍芯2K0300蜂鳥派工控
    的頭像 發(fā)表于 10-25 08:07 ?1938次閱讀
    新品發(fā)布 | <b class='flag-5'>龍芯</b><b class='flag-5'>2K</b>0300系列正式開售