Написване на драйвер за LCD дисплей за вграден linux

вграден
написване

Интерфейс на контролера SSD1963

Интерфейсът на контролера е най-лесно да си представим като картина от таблицата с данни на дисплея:

вграден

От гледна точка на разработчика на драйвери, ние се интересуваме от щифтове DB0 - DB7. Това е 8-битова шина за данни и щифтовете DC, RD, WR, CS, RES се използват за управление на процеса на трансфер на данни на SSD1963.
По отношение на формата на предадените данни, този дисплей използва формат 888. Което означава: 8 байта - червено, 8 байта - зелено, 8 байта - синьо. Все още доста често в дисплеи от този тип можете да намерите опции 555, 565 и т.н., но това не е нашият случай. Форматът на предадените данни е показан на фигурата.

Преди първият байт за данни да бъде зададен на шината, CS и WR щифтовете трябва да бъдат превключени от 1 на 0. И след като байтът за данни е зададен, CS и WR трябва да бъдат превключени от 0 на 1, което всъщност прехвърля байтови данни към контролера SSD1963. По-подробни осцилограми на сигнала могат да се видят в листа с данни на контролера. www.newhavendisplay.com/app_notes/SSD1963.pdf

В изходния код описваме интерфейса с масиви от GPIO пинове:

Функцията за прехвърляне на байтове през този интерфейс е:

Както можете да видите, използвайки тази функция, можете да изпращате както LCD команди (например за конфигуриране на дисплея), така и данни под формата на пиксели към LCD контролера.

Модел на ядрото на Framebuffer

Както знаете, ядрото на linux предоставя интерфейси за различни типове драйвери на устройства - char драйвери, драйвери за блокове, usb драйвери и др. Основната структура, използвана за представяне на FB драйвера, е struct fb_info в linux/fb.h. Между другото, този заглавен файл също ще представлява интерес за любителите на хумора в кода на ядрото на Linux, тъй като съдържа интересна дефиниция -
#define STUPID_ACCELF_TEXT_SHIT. Мисля, че името говори само за себе си. Но да се върнем към структурата fb_info. Ще се интересуваме от двете структури, които тя съдържа - fb_var_screeninfo и fb_fix_screeninfo. Ние ги инициализираме с параметрите на нашия дисплей.

В нашия случай за пиксела ще бъдат разпределени 4 байта: 8-червен, 8-зелен, 8-син, 8-прозрачен
Позволете ми да обясня някои от структурните полета:

.Тип - начинът на разпределение на битовете, които описват пикселите в паметта. Опаковани пиксели означава, че байтове (в нашия случай 8888 ще бъдат поставени последователно един след друг).