В статье на прошлой неделе мы представили самодельное терминальное устройство V3S-PI, поскольку автор хотел изучить Linux.
《Мечтаю вернуться в 2004 год! Я использовал Allwinner V3s для создания портативного терминала, который стоит 100 юаней и имеет функции, сравнимые с MP4.》:Мечтаю вернуться в 2004 год! Я использовал Allwinner V3s для создания портативного терминала, который стоит 100 юаней и имеет функции, сравнимые с MP4. | Онлайн-форум разработчиков Allwinner
Подробно анализируется часть проекта по проектированию аппаратного обеспечения. В этой статье основное внимание будет уделено части проекта по адаптации программного обеспечения и выбрано несколько периферийных функций с высокой универсальностью для внедрения.
V3S-PI — это плата разработки, разработанная на базе Allwinner V3s. Чип V3s содержит специальный видеодвижок для предоставления расширенных мультимедийных приложений и услуг. Экран, аудио и другие интерфейсы зарезервированы в начале разработки платы разработки. На этой плате разработки имеется около 10 дополнительных периферийных устройств и функций: получение прогноза погоды, подключение наушников для воспроизведения музыки, интерфейс Ethernet 10M/100M, подключение к Wi-Fi, вставка SD-карты, регулировка яркости экрана, управление кнопками, подключение к другим внешним устройствам, 1 до 4 USB ЦЕНТР......
После адаптации экрана и пересадки LVGL и различных драйверов периферии,Макетная плата превращается в портативное устройство с функциями, сравнимыми с MP4.
Цветной ЖК-экран использует интерфейс SPI для подключения к основному элементу управления. Поскольку коды инициализации экрана у каждого производителя разные и основаны на исходном файле st7735r.c, нам нужно только изменить код в функции st7735r_pipe_enable.
Модифицированный код см. в файле ниже, а конфигурацию дерева устройств:
&spi0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins>;
display@0 {
compatible = "jianda,jd-t18003-t01";
reg = <0>;
spi-max-frequency = <95000000>;
backlight = <&panel_backlight>;
dc-gpios = <&pio 4 9 0>; // PE9
reset-gpios = <&pio 4 8 0>; // PE8
rotation = <0>;
};
};
Помимо spi необходимо добавить узел подсветки, чтобы подсветкой можно было управлять на уровне пользователя:
panel_backlight: panel-backlight {
compatible = "gpio-backlight";
gpios = <&pio 4 7 GPIO_ACTIVE_HIGH>; // PE7
default-on;
status = "okay";
};
После успешной адаптации к экрану и трансплантации LVGL вы можете почистить слой FB, чтобы добиться высокой скорости кисти в 700 кадров.
В целях обогащения функций автор также реализовал функцию получения информации о погоде через библиотеку libcurl, обработал полученные данные JSON через функцию обратного вызова и использовал библиотеку lvgl для отображения информации о погоде.
Здесь нужна функция обратного вызова для анализа полученной информации о погоде в формате JSON. Сначала он использует библиотеку cJSON для анализа полученных данных и поиска соответствующего поля с информацией о погоде.
// Анализ данных JSON
cJSON * json = cJSON_ParseWithLength(ptr, size * nmemb);
if(!json) {
goto end;
}
json = cJSON_GetObjectItem(json, "now");
if(!json) {
goto end;
}
cJSON * temp = cJSON_GetObjectItem(json, "temp");
cJSON * humidity = cJSON_GetObjectItem(json, "humidity");
cJSON * text = cJSON_GetObjectItem(json, "text");
cJSON * pressure = cJSON_GetObjectItem(json, "pressure");
Затем используйте другие функции для блокировки потоков во избежание многопоточных конфликтов, а затем используйте соответствующие функции библиотеки LVGL, чтобы установить информацию о погоде на соответствующие метки.
pthread_mutex_lock(&mutex);
if(cJSON_IsString(text)) {
lv_label_set_text_fmt(label1, "Текущая погода\n%s", text->valuestring);
}
if(cJSON_IsString(pressure)) {
lv_label_set_text_fmt(label2, "Атмосферное давление\n%s hPa", pressure->valuestring);
}
if(cJSON_IsString(temp)) {
lv_label_set_text_fmt(label3, "Наружная температура\n%s ℃", temp->valuestring);
}
if(cJSON_IsString(humidity)) {
lv_label_set_text_fmt(label4, "Влажность\n%s %%", humidity->valuestring);
}
pthread_mutex_unlock(&mutex);
cJSON_Delete(json);
end:
return size * nmemb;
Функция get_now_weather сначала определяет строку URL, которая содержит адрес и параметры, необходимые для получения информации о погоде. Затем создайте объект CURL через curl_easy_init и настройте соответствующие параметры, такие как установка URL-адреса, отключение информации о ходе выполнения, игнорирование проверки сертификата SSL, настройка функций обратного вызова и т. д. Затем используйте curl_easy_perform для выполнения запроса и проверки возвращаемых результатов. Наконец, используйте Curl_easy_cleanup для очистки объекта CURL.
char * url =
"https://devapi.qweather.com/v7/weather/now?location=" LOCATION "&key=xxx";
CURL * curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, now_weather_cb);
curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip");
Необходимо изменить в соответствии с реальной ситуациейURLв строкеLOCATION
иxxx
,И выполнить необходимые операции, такие как настройка параметров и авторизация в соответствии с требованиями API погоды.
Alsa интегрирована в Buildroot. Звук звуковой карты по умолчанию отключен. Откройте терминал, введите alsamixer и сначала включите его.
В текущем интерфейсе выберите «Наушники», затем нажмите клавишу M, чтобы включить звук, затем с помощью клавиатуры ↑ отрегулируйте громкость до нужного размера. Информацию об интерфейсе см. в разделе:
После завершения настройки введите имя файла mpv --no-video, подключите наушники и можно будет воспроизводить музыку:
[root@buildroot ~]# mpv 2.flac --no-video
Video --vid=1 [P] (mjpeg 500x500 1.000fps)
(+) Audio --aid=1 (flac 2ch 48000Hz)
File tags:
Album: Ищем его в западной камере.
Title: Ищем его в западной камере.
Track: 1
AO: [alsa] 48000Hz stereo 2ch s32
A: 00:00:04 / 00:03:43 (2%)
Exiting... (Quit)
В командной строке отображается текущий каталог, отредактируйте файл /etc/profile, добавьте строку, а затем экспортируйте /etc/profile, чтобы перезагрузить конфигурацию:
export PS1='[\u@\h \w]\$ '