понедельник, 23 февраля 2015 г.

Android graphic system


Summary (good slide)

https://source.android.com/devices/graphics/

1) system/core

2) frameworks/native

SurfaceFlinger
-  window manager

surfaceflinger + libsurfaceflinger.so

/services/surfaceflinger

3) vendor specific library

GPU blobs:
libMali.so
pvr libs

hwcomposer.PLATFORM.so
gralloc.PLATFORM.so

HWComposer

Gralloc

- gralloc alloc: allocates graphic buffers
- gralloc framebuffer: interface to Linux framebuffer device, e.g. /dev/graphics/fb0

- gralloc alloc allocates all graphic buffers using a kernel memory manager, typically ION


4) hardware/libhardware/include/hardware/
gralloc.h
hwcomposer.h


Details

About all
http://events.linuxfoundation.org/sites/events/files/slides/android-graphics-abs-2014_0.pdf

About surfaceflinger, BufferQueue, GraphiBuffer
https://charleszblog.wordpress.com/2014/02/23/understanding-android-internals-surfaceflinger-iii/

About EGL, eglSwapBuffers
https://katatunix.wordpress.com/2014/09/17/lets-talk-about-eglmakecurrent-eglswapbuffers-glflush-glfinish/

Debug

setprop debug.egl.trace 1

show all gl call

пятница, 20 февраля 2015 г.

Портирование ядра mtk

Портирование ядра

Узнать инфу об устройстве

Самый простой способ установить мою программу Device Info HW, в настройках включить адреса i2c, если есть root, то включить и его, требуется для дисплея и для полной ифнормациии для новых устройств с android 7.0+

Старый вариант:

а) Чтобы узнать для какого оборудования собрано ядро в mtk, можно посмотреть ProjectConfig.mk, расположенный в /system/data/misc/

б) На каких шинах i2c висят устройства /sys/bus/i2c/drivers

в) свой lcm, если в проекте несколько
cat /proc/cmdline

Сборка ядра

Скачиваем исходники:

git clone https://github.com/andr7e/acer_v370_kk

и компилятор gcc:
https://android-build.…toolchain-4.9-2014.04/
(архив tar.gz)

Распаковать в /home/user/kernel_build

cd исходники
./build_fly446.sh 

Структура исходников

/mediatek
custom/common/kernel - общие исходники (драйвера...)
custom/$project/kernel - для вашего устройства (cust'ы)
config/$project    ProjectConfig.mk

$project = fly89_iq446_wet_kk

custom/$project/kernel/dct/dct/codegen.dws
GPIO пины, клавиши

Адаптация

mtk 6589

Отладка

Ядро

adb shell
su
dmesg

cat /proc/kmsg

Android
adb logcat > logcat.log
Запускаем только после того, как обнаружилось устройство.

Дисплей

Добавляем LCM драйвер для вашего дисплея

common/kernel/lcm

Прописываем в
 
common/kernel/lcm/mt65xx_lcm_list.c 

В новых устройствах используется lk, и если название драйвера отличается от родного, загрузка не пойдет.

Клавиши

Смотрим лог dmesg при нажатии кнопки громкости "-" у нас так:
[0:swapper/0]kpd: (pressed) HW keycode = 10
[0:swapper/0]kpd: Linux keycode = 0

Нужно прописать правильное соответствие кодов.
Запускаем в wine DrvGen.exe, выбираем codegen.dws, на вкладке keypad settngs вводим в нужную ячейку.

Посмотреть, что получилось можно так: запускаем генерацию и смотрим в файле project_name/kernel/dct/cust_kpd.h

 /* HW keycode [0 ~ 71] -> Linux keycode */
 #define KPD_INIT_KEYMAP()      \
 {      \
       [1] = KEY_VOLUMEUP,             \
       [10] = KEY_VOLUMEDOWN,          \
 } 

KEY_VOLUMEUP прописано в ядре Linux

Дополнительный вариант:
<4>[ 297.333097] (0)[38:pmic_6325_threa]kpd: PMIC reset Key generate, pressed=0
<4>[ 297.333160] (0)[38:pmic_6325_threa]kpd: (released) HW keycode =115 using PMIC

Надо было прописать напротив Home key (в коде идет как KPD_PMIC_RSTKEY_MAP)

Тачскрин

GT9XX

В исходниках tpd_custom_gt9xx надо вписать конфиг, можно взять в /proc/gt9xx_config

Подсветка

проект/kernel/leds/mt65xx/cust_leds.c

В новых используется стандартный PWM, в более старых отдельный контроллер (Для него нужна cust ф-ция через GPIO)

Зарядка
 
bq24158 на mt6752 добавляем драйвер в power.

Датчики

Проверяем, чтобы i2c адрес соответствовал (одинаковый в пределах платформы)

Акселерометр
прописываем direction (отвечает за пересчет координат x, y, z)

Освещенности, приближения (alsps)
Шкала освещенности
Границы для датчика приближения

Камера

У меня получилось заставить работать основную камеры ov8830_raw + fm50af

Вот небольшая инструкция:

1) Добавляем поддержку в ядро
а) Вписываем в ProjectConfig.mk свои камеры

б) Включение камеры прописано в custom/your_project/camera/kd_camera_hw.c
Если вашей модели нет, берем из других исходников, желательно этой же платформы.

Подача питания, биты, GPIO.

Обычно достаточно стандартной инициализации для этой модели.

Если в логе видим id камеры, значит камеру завелась. (camera open id = 0x8830 (Для ov8830))

Затем прописываем автофокус (lens)

2) Сборка libcameracustom

Берем исходники из шапки - eastaeon89

Я просто добавил свои камеры в ProjectConfig.mk (оставить только свои, иначе может не работать)

Собираем

./mk проект dr libcameracustom

Проверяем, чтобы функции с вашей камерой были в libcameracustom.so (можно через nano)

3*

Если не получилось, поиском можно найти, где встречается дефолтная и сделать также для вашей (лучше по имени SENSOR_DRVNAME_OV8830_RAW)

Там мест 7 будет, но в большинстве уже есть поддержка:

kernel/imgsensor

hal/imgsensor

Для фронтальной ov9726_mipi_raw в eastaeon89 пришлось вписывать в sensorlist, в hal нашел только с mt6571 (в остальных не хватало файлов)

Либа собралась.

В kd_camera_hw.c взял от ov5647.



Фонарик, вспышка

constant_flashlight/led_strobe.c

GPIO_FLASH_LED_EN

Обычно достаточно прописать GPIO пин в codegen. Но бывают и по i2c, umpu.


flashlight hal

torchDuty - фонарик
afDuty      - автофокус
pfDuty      - вспышка
mfDuty     - manual

пятница, 13 февраля 2015 г.

Prestigio pmp5785 (Rockchip rk3188)

Prestigio PMP5785C_Quad Specs:
  • PCB: yftech mp81 board
  • RTC HYM8563
  • REGULATOR ACT8846
  • RAM 1 GB LDDR3
  • NAND EMMC
  • HDMI RK616
  • SND_SOC RK616
  • Wifi/BT RTL8723AU
  • Display Interface Controller ssd2828 MIPI Master Bridge Chip
  • Display IPS 1024x768 7.85'' 
  • Touchcontroller Goodix gt9xx (IC VERSION:9110_1050)
  • Accelerometer bma250/222
  • Camera sp2518 back, sp0718 front
  • Battery cw2015 (4700 mAh)
Radxa Rock Pro
  • RTC HYM8563 
  • REGULATOR ACT8846 
  • RAM 2 GB LDDR3 
  • HDMI RK616 
  • SND_SOC RK1000 
  • Wifi/BT RTL8723AU
CPU
RK3188 x4 1608 Mhz

GPU
Mali 400MP4 600 Mhz
Driver r4p0

RAM
LDDR3 384 Mhz

Overclock

CONFIG_DDR_SDRAM_FREQ=384

Позволяет ограничивать частоту. Можно задать до 528.
Я пробовал 395.
В логе dmesg выводится значение (частота, напряжение)
update ddr table 395001 1100000


четверг, 5 февраля 2015 г.

Rockchip rk3188 linux

Для запуск мультибута из из темы на 4pda на Prestigio PMP5785

от 11.02.2015
Ядро
Recovery (Мультибут)
Ядро уже встроено в мультибут.

Используем образ Picuntu 14.04 loop с 4pda (от Lipton_lan)


Запуск wi-fi

Монтируем системный раздел:
sudo -s
mount /dev/mtdblock9 /mnt

Копируем  модули:
mkdir -p /lib/modules/3.0.36+
cp /mnt/lib/modules/* /lib/modules/3.0.36+/

Копируем  конфиги:
mkdir /system
cp -a /mnt/etc /system/

Для проверки:
insmod /lib/modules/3.0.36+/8723au.ko

на постоянку прописываем в /etc/rc.local

Touchscreen

Драйвер mtev уже установлен.

Установка mtev

Звук (Аудио кодек rk616)

Приводим настройки alsa /etc/asound.conf
к такому содержанию:
pcm.!default {
       type hw
       card 0
       device 0
  }
 ctl.!default {
       type hw
       card 0
   }
В консоли запускаем alsamixer, выбираем Playback Path = SPK_HP (Speaker + Headset)

Проверка звука:
speaker-test -t wav -c 2

Воспроизводение видео
mplayer, smplayer (gui qt4) работают
(VLC черный экран, Parole gstreamer error )


Xubuntu 14.04 

apt-get install xubuntu-desktop

Добавляем панель индикаторов. Появятся иконки звука, wi-fi, батареи.

Регулировка подсветки

Устанавливаем плагины:
apt-get install xfce4-power-manager-plugins
Добавляем индикатор на панель.

Вручную:
value: 0 - 255
echo 64 > /sys/class/backlight/rk28_bl/brightness

Батарея

Показывает только % заряда

 /sys/class/power_supply
cw2015_bat ac usb

Фиксы

Если некорректно отображаются Qt приложения, перед запуском
export QT_GRAPHICSSYSTEM=opengl

Баги

- В альбомном режиме Rotate CW
Лагает перемещение окон
Ошибки в логе:
Xlib:  extension "RANDR" missing on display ":0.0".  и не работают настройки дисплея
! (Это баг x11, он использует промежуточный буфер, варианты: собрать ядро не 768x1024, а 1024x768 или задействовать ускорение mali)

- При открытии карты памяти выдает ошибку, что уже примонтирована.
(Можно открыть скопировав имя точки монтирования)
Device /dev/mmcblk0p1 is already mounted at `/media/picuntu/72AD-2013'.

- Не работает bluetooth
(подгрузить rtk_btusb.ko, пишет get firmware error)

Исходники ядра: github.com/andr7e

Changelog правки ядра:

0.1 Запуск мультибута
Собрать ядро с поддержкой  виртуальной консоли (/dev/tty0 ... N)
CONFIG_VT=y

0.2 Включаем CONFIG_SYSVIPC=y
Если программы выдают предупреждение:
(vlc:2893): Gdk-WARNING **: shmget failed: error 38 (Функция не реализована)

0.3 20150211
Фикс тачскрина: в функции touch_up убрать x и y. 

0.4 20150215
Фикс rk616 Audio
Звук появлялся только при изменение Playback Path

----------------------------------------------------------------------------------------------------
Не актуально:
Если тормозит перемещение окон (ядро было собрано с отладкой), пока можно обойти так:
В диспетчере окон -> Дополнительные -> Скрывать содержимое окна (при перемещении)

Если не запускается onboard,
посмотреть в сеансы и запуск -> Автозапуск приложений AT-SPI D-Bus Bus

Если в трее нет иконки nm-applet (Network manager applet), в автозапуске  /etc/xdg/autostart/nm-applet.desktop в поле 'Exec' заменить nm-applet на dbus-launch nm-applet

Баги
- Иногда не запускается onboard (только в xubuntu),
** (onboard:2246): WARNING **: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-dtbFOKgGm7: В соединении отказано
** (onboard:2493): ERROR **: AT-SPI: COuldn't connect to accessibility bus. Is at-spi-bus-launcher running?
Ловушка трассировки/останова

(На archlinux советуют установить lightdm-greater-gtk2, на ubuntu такого нет?)