{"id":19244377,"url":"https://github.com/nanoframework/nanoframework.graphics","last_synced_at":"2026-05-11T03:31:00.005Z","repository":{"id":38839637,"uuid":"218414376","full_name":"nanoframework/nanoFramework.Graphics","owner":"nanoframework","description":"📦 .NET nanoFramework Graphics and UI class library ","archived":false,"fork":false,"pushed_at":"2026-04-27T12:58:07.000Z","size":634,"stargazers_count":19,"open_issues_count":1,"forks_count":11,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-04-27T14:28:32.174Z","etag":null,"topics":["csharp","dotnet","hacktoberfest","library","nanoframework","ui"],"latest_commit_sha":null,"homepage":"https://www.nanoframework.net","language":"C#","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nanoframework.png","metadata":{"funding":{"open_collective":"nanoframework","github":"nanoframework"},"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-10-30T01:06:23.000Z","updated_at":"2026-04-08T09:33:19.000Z","dependencies_parsed_at":"2023-01-31T04:46:03.488Z","dependency_job_id":"d0f92b54-422d-4a0c-ba50-fdcd65bcd6a1","html_url":"https://github.com/nanoframework/nanoFramework.Graphics","commit_stats":{"total_commits":220,"total_committers":9,"mean_commits":"24.444444444444443","dds":0.4136363636363637,"last_synced_commit":"3e4fe3212b863d6708b03e6cb45d3255dfe1465b"},"previous_names":["nanoframework/lib-nanoframework.graphics.wpf"],"tags_count":111,"template":false,"template_full_name":null,"purl":"pkg:github/nanoframework/nanoFramework.Graphics","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanoframework%2FnanoFramework.Graphics","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanoframework%2FnanoFramework.Graphics/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanoframework%2FnanoFramework.Graphics/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanoframework%2FnanoFramework.Graphics/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nanoframework","download_url":"https://codeload.github.com/nanoframework/nanoFramework.Graphics/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nanoframework%2FnanoFramework.Graphics/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32592720,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T22:12:39.696Z","status":"online","status_checked_at":"2026-05-04T02:00:06.625Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","dotnet","hacktoberfest","library","nanoframework","ui"],"created_at":"2024-11-09T17:23:09.058Z","updated_at":"2026-05-04T03:04:53.428Z","avatar_url":"https://github.com/nanoframework.png","language":"C#","funding_links":["https://opencollective.com/nanoframework","https://github.com/sponsors/nanoframework"],"categories":[],"sub_categories":[],"readme":"[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=nanoframework_lib-nanoFramework.Graphics\u0026metric=alert_status)](https://sonarcloud.io/dashboard?id=nanoframework_lib-nanoFramework.Graphics) [![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=nanoframework_lib-nanoFramework.Graphics\u0026metric=reliability_rating)](https://sonarcloud.io/dashboard?id=nanoframework_lib-nanoFramework.Graphics) [![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![NuGet](https://img.shields.io/nuget/dt/nanoFramework.Graphics.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics/) [![#yourfirstpr](https://img.shields.io/badge/first--timers--only-friendly-blue.svg)](https://github.com/nanoframework/Home/blob/master/CONTRIBUTING.md)\n[![Discord](https://img.shields.io/discord/478725473862549535.svg?logo=discord\u0026logoColor=white\u0026label=Discord\u0026color=7289DA)](https://discord.gg/gCyBu8T)\n\n![nanoFramework logo](https://raw.githubusercontent.com/nanoframework/Home/main/resources/logo/nanoFramework-repo-logo.png)\n\n-----\n\n### Welcome to the .NET **nanoFramework** Graphics repository\n\n## Build status\n\n| Component | Build Status | NuGet Package |\n|:-|---|---|\n| nanoFramework.Graphics | [![Build Status](https://dev.azure.com/nanoframework/nanoframework.Graphics/_apis/build/status/nanoFramework.Graphics?repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoframework.Graphics/_build/latest?definitionId=58\u0026repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Graphics.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics/) |\n| nanoFramework.Graphics.Core | [![Build Status](https://dev.azure.com/nanoframework/nanoframework.Graphics/_apis/build/status/nanoFramework.Graphics?repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoframework.Graphics/_build/latest?definitionId=58\u0026repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Graphics.Core.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics.Core/) |\n| nanoFramework.Graphics.Gc9A01 | [![Build Status](https://dev.azure.com/nanoframework/nanoframework.Graphics/_apis/build/status/nanoFramework.Graphics?repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoframework.Graphics/_build/latest?definitionId=58\u0026repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Graphics.Gc9A01.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics.Gc9A01/) |\n| nanoFramework.Graphics.Ili9341 | [![Build Status](https://dev.azure.com/nanoframework/nanoframework.Graphics/_apis/build/status/nanoFramework.Graphics?repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoframework.Graphics/_build/latest?definitionId=58\u0026repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Graphics.Ili9341.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics.Ili9341/) |\n| nanoFramework.Graphics.Ili9342 | [![Build Status](https://dev.azure.com/nanoframework/nanoframework.Graphics/_apis/build/status/nanoFramework.Graphics?repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoframework.Graphics/_build/latest?definitionId=58\u0026repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Graphics.Ili9342.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics.Ili9342/) |\n| nanoFramework.Graphics.Otm8009A | [![Build Status](https://dev.azure.com/nanoframework/nanoframework.Graphics/_apis/build/status/nanoFramework.Graphics?repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoframework.Graphics/_build/latest?definitionId=58\u0026repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Graphics.Otm8009A.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics.Otm8009A/) |\n| nanoFramework.Graphics.Ssd1306 | [![Build Status](https://dev.azure.com/nanoframework/nanoframework.Graphics/_apis/build/status/nanoFramework.Graphics?repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoframework.Graphics/_build/latest?definitionId=58\u0026repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Graphics.Ssd1306.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics.Ssd1306/) |\n| nanoFramework.Graphics.Ssd1331 | [![Build Status](https://dev.azure.com/nanoframework/nanoframework.Graphics/_apis/build/status/nanoFramework.Graphics?repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoframework.Graphics/_build/latest?definitionId=58\u0026repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Graphics.Ssd1331.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics.Ssd1331/) |\n| nanoFramework.Graphics.St7735 | [![Build Status](https://dev.azure.com/nanoframework/nanoframework.Graphics/_apis/build/status/nanoFramework.Graphics?repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoframework.Graphics/_build/latest?definitionId=58\u0026repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Graphics.St7735.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics.St7735/) |\n| nanoFramework.Graphics.St7789 | [![Build Status](https://dev.azure.com/nanoframework/nanoframework.Graphics/_apis/build/status/nanoFramework.Graphics?repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main)](https://dev.azure.com/nanoframework/nanoframework.Graphics/_build/latest?definitionId=58\u0026repoName=nanoframework%2FnanoFramework.Graphics\u0026branchName=main) | [![NuGet](https://img.shields.io/nuget/v/nanoFramework.Graphics.St7789.svg?label=NuGet\u0026style=flat\u0026logo=nuget)](https://www.nuget.org/packages/nanoFramework.Graphics.St7789/) |\n\n## Usage\n\n**Important**:\n\n- This library is still work in progress. There may be breaking changes happening while work on this library progresses.\n- So far only SPI interface has been implemented.\n\nCheck the [samples](https://github.com/nanoframework/Samples#graphics-for-screens) for more detailed usage.\n\n### Initializing the screen\n\nIt is important to understand that the driver will be loaded when the screen routing will be initialized from the managed code. Also keep in mind that most screens are actually smaller than the size the driver is capable of handling, also that the real screen can start at a position that is not the typical origin (0,0).\n\nYou **must** initialize the screen before being able to create a bitmap or display anything.\n\nThis code snippet works with the ESP32 WROVER KIT pinout, in this case, the screen size matches the driver size:\n\n```csharp\n\nconst int backLightPin = 5;\nconst int chipSelect = 22;\nconst int dataCommand = 21;\nconst int reset = 18;\nconst int screenWidth = 320;\nconst int screenHeight = 240;\nDisplayControl.Initialize(new SpiConfiguration(1, chipSelect, dataCommand, reset, backLightPin), new ScreenConfiguration(0, 0, screenWidth, screenHeight), screenBufferSize);\n```\n\nThis code snippet is for a M5 Stick where the screen size is smaller than the driver size and starts an offset position of X=26 and Y=1 coordinate:\n\n```csharp\nint backLightPin = -1; // Not managed thru ESP32 but thru AXP192\nint chipSelect = 5;\nint dataCommand = 23;\nint reset = 18;\nConfiguration.SetPinFunction(4, DeviceFunction.SPI1_MISO); // 4 is unused but necessary\nConfiguration.SetPinFunction(15, DeviceFunction.SPI1_MOSI);\nConfiguration.SetPinFunction(13, DeviceFunction.SPI1_CLOCK);\nDisplayControl.Initialize(new SpiConfiguration(1, chipSelect, dataCommand, reset, backLightPin), new ScreenConfiguration(26, 1, 80, 160), 10 * 1024);\n```\n\nNote that depending on your target, especially for ESP32, you may have to setup the pins. Even if physically not used, the MISO pin **must** be setup to a valid pin.\n\nAs you can see it is possible as well not to define the backlight pin. It is the same for the rest pins. Both can be set to -1. Note that in most of the cases, both are connected and needed. In the case of the M5 Stick, the backlight pin is managed thru an AXP192. If you don't switch on the backlight pin, your screen will always be black. It is important to check how this pin can be switched on.\n\n## Using generic graphic SPI drivers\n\nIt's now possible to use generic graphic SPI drivers. It does require to build an image with the `Generic_SPI.cpp` driver. Once the image is flashed on the device, you can give the driver commands directly from a class in managed code. When building with a specific driver, the generic driver will be ignored even if you provide it.\n\nHere is an example based on the ST7735S driver, we've been using enum for the registers:\n\n```csharp\nprivate enum St7735\n{\n    NOP = 0x00,\n    SOFTWARE_RESET = 0x01,\n    POWER_STATE = 0x10,\n    Sleep_Out = 0x11,\n    Invertion_Off = 0x20,\n    Invertion_On = 0x21,\n    Gamma_Set = 0x26,\n    Display_OFF = 0x28,\n    Display_ON = 0x29,\n    Column_Address_Set = 0x2A,\n    Page_Address_Set = 0x2B,\n    Memory_Write = 0x2C,\n    Colour_Set = 0x2D,\n    Memory_Read = 0x2E,\n    Partial_Area = 0x30,\n    Memory_Access_Control = 0x36,\n    Pixel_Format_Set = 0x3A,\n    Memory_Write_Continue = 0x3C,\n    Write_Display_Brightness = 0x51,\n    Frame_Rate_Control_Normal = 0xB1,\n    Frame_Rate_Control_2 = 0xB2,\n    Frame_Rate_Control_3 = 0xB3,\n    Invert_On = 0xB4,\n    Display_Function_Control = 0xB6,\n    Entry_Mode_Set = 0xB7,\n    Power_Control_1 = 0xC0,\n    Power_Control_2 = 0xC1,\n    Power_Control_3 = 0xC2,\n    Power_Control_4 = 0xC3,\n    Power_Control_5 = 0xC4,\n    VCOM_Control_1 = 0xC5,\n    VCOM_Control_2 = 0xC7,\n    Power_Control_A = 0xCB,\n    Power_Control_B = 0xCF,\n    Positive_Gamma_Correction = 0xE0,\n    Negative_Gamma_Correction = 0XE1,\n    Driver_Timing_Control_A = 0xE8,\n    Driver_Timing_Control_B = 0xEA,\n    Power_On_Sequence = 0xED,\n    Enable_3G = 0xF2,\n    Pump_Ratio_Control = 0xF7,\n    Power_Control_6 = 0xFC,\n};\n\n[Flags]\nprivate enum St7735Orientation\n{\n    MADCTL_MH = 0x04, // sets the Horizontal Refresh, 0=Left-Right and 1=Right-Left\n    MADCTL_ML = 0x10, // sets the Vertical Refresh, 0=Top-Bottom and 1=Bottom-Top\n    MADCTL_MV = 0x20, // sets the Row/Column Swap, 0=Normal and 1=Swapped\n    MADCTL_MX = 0x40, // sets the Column Order, 0=Left-Right and 1=Right-Left\n    MADCTL_MY = 0x80, // sets the Row Order, 0=Top-Bottom and 1=Bottom-Top\n\n    MADCTL_BGR = 0x08 // Blue-Green-Red pixel order\n};\n```\n\nAnd build the driver like this:\n\n```csharp\n// This is your SPI configuration\nvar displaySpiConfig = new SpiConfiguration(\n    1,\n    ChipSelect,\n    DataCommand,\n    Reset,\n    -1);\n\n// Here we create the driver\nGraphicDriver graphicDriver = new GraphicDriver()\n{\n    MemoryWrite = 0x2C,\n    SetColumnAddress = 0x2A,\n    SetRowAddress = 0x2B,\n    InitializationSequence = new byte[]\n    {\n        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.SOFTWARE_RESET,\n        // Sleep for 50 ms\n        (byte)GraphicDriverCommandType.Sleep, 5,\n        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.Sleep_Out,\n        // Sleep for 500 ms\n        (byte)GraphicDriverCommandType.Sleep, 50,\n        (byte)GraphicDriverCommandType.Command, 4, (byte)St7735.Frame_Rate_Control_Normal, 0x01, 0x2C, 0x2D,\n        (byte)GraphicDriverCommandType.Command, 4, (byte)St7735.Frame_Rate_Control_2, 0x01, 0x2C, 0x2D,\n        (byte)GraphicDriverCommandType.Command, 7, (byte)St7735.Frame_Rate_Control_3, 0x01, 0x2C, 0x2D, 0x01, 0x2C, 0x2D,\n        (byte)GraphicDriverCommandType.Command, 2, (byte)St7735.Invert_On, 0x07,\n        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.Invertion_On,\n        // 0x55 -\u003e 16 bit\n        (byte)GraphicDriverCommandType.Command, 2, (byte)St7735.Pixel_Format_Set, 0x55,\n        (byte)GraphicDriverCommandType.Command, 4, (byte)St7735.Power_Control_1, 0xA2, 0x02, 0x84,\n        (byte)GraphicDriverCommandType.Command, 2, (byte)St7735.Power_Control_2, 0xC5,\n        (byte)GraphicDriverCommandType.Command, 3, (byte)St7735.Power_Control_3, 0x0A, 0x00,\n        (byte)GraphicDriverCommandType.Command, 3, (byte)St7735.Power_Control_4, 0x8A, 0x2A,\n        (byte)GraphicDriverCommandType.Command, 3, (byte)St7735.Power_Control_5, 0x8A, 0xEE,\n        (byte)GraphicDriverCommandType.Command, 4, (byte)St7735.VCOM_Control_1, 0x0E, 0xFF, 0xFF,\n        (byte)GraphicDriverCommandType.Command, 17, (byte)St7735.Positive_Gamma_Correction, 0x02, 0x1c, 0x7, 0x12, 0x37, 0x32, 0x29, 0x2d, 0x29, 0x25, 0x2B, 0x39, 0x00, 0x01, 0x03, 0x10,\n        (byte)GraphicDriverCommandType.Command, 17, (byte)St7735.Negative_Gamma_Correction, 0x03, 0x1d, 0x07, 0x06, 0x2E, 0x2C, 0x29, 0x2D, 0x2E, 0x2E, 0x37, 0x3F, 0x00, 0x00, 0x02, 0x1,\n        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.Sleep_Out,\n        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.Display_ON,\n        // Sleep 100 ms\n        (byte)GraphicDriverCommandType.Sleep, 10,\n        (byte)GraphicDriverCommandType.Command, 1, (byte)St7735.NOP,\n        // Sleep 20 ms\n        (byte)GraphicDriverCommandType.Sleep, 2,\n    },\n    OrientationLandscape = new byte[]\n    {\n        (byte)GraphicDriverCommandType.Command, 2, (byte)St7735.Memory_Access_Control, (byte)(St7735Orientation.MADCTL_MY | St7735Orientation.MADCTL_MX | St7735Orientation.MADCTL_BGR),\n    },\n    PowerModeNormal = new byte[]\n    {\n        (byte)GraphicDriverCommandType.Command, 3, (byte)St7735.POWER_STATE, 0x00, 0x00,\n    },\n    PowerModeSleep = new byte[]\n    {\n        (byte)GraphicDriverCommandType.Command, 3, (byte)St7735.POWER_STATE, 0x00, 0x01,\n    },\n    DefaultOrientation = DisplayOrientation.Landscape,\n    Brightness = (byte)St7735.Write_Display_Brightness,\n};\n\n// And the screen configuration:\nvar screenConfig = new ScreenConfiguration(\n    26,\n    1,\n    80,\n    160,\n    graphicDriver);\n\n// And finally initialize the driver and the screen\nvar init = DisplayControl.Initialize(\n    displaySpiConfig,\n    screenConfig,\n    1024);\n```\n\nNote that the initialization commands are mandatory. The rest of the commands are not mandatory. Now, some may be needed for a good usage of your driver.\n\nAll commands are following the same rule:\n\n- (byte)GraphicDriverCommandType.Command, N, n0, n1, nN-1\n- (byte)GraphicDriverCommandType.Sleep, T\n\nWhere N is the number of bytes to send as a command, meaning the first element n0 is always a command and then the bytes from n1 to nN-1.\n\nIt is as well possible to insert sleep time where T represent a set of 10 milliseconds. So to wait 50 milliseconds, T must be 5.\n\n### Availability of drivers\n\nDifferent drivers for different screens are available as nuget. Each nuget is named `nanoFramework.Graphics.DriverName` where `DriverName` is the name of the driver. For example `St7735`. Those nugets contains the driver(s) and also all the `nanoFramework.Graphics` library.\n\nUIsage is quite straight forward:\n\n```csharp\nvar displaySpiConfig = new SpiConfiguration(1, ChipSelect, DataCommand, Reset, -1);\n\n// Get the predefined driver\nGraphicDriver graphicDriver = St7735.GraphicDriver;\n\n// You can adjust anything here for example:\ngraphicDriver.OrientationLandscape180 = new byte[]\n{\n    ((byte)GraphicDriverCommandType.Command, 2, (byte)St7735Reg.Memory_Access_Control, (byte)(St7735Orientation.MADCTL_MX | St7735Orientation.MADCTL_BGR),\n};\n\nvar screenConfig = new ScreenConfiguration(26, 1, 80, 160, graphicDriver);\n\nvar init = DisplayControl.Initialize(displaySpiConfig, screenConfig, 1024);\n```\n\nPrefer the native implementation when it's available. Use the generic one when you don't have the competencies to rebuild your own image or you want to adjust the native driver.\n\nThe generic driver is also a great way to test and implement new drivers. It does not require to rebuild an image every time you want to test something new instead, you just adjust your managed code.\n\n### Generic display driver limitations\n\nThe main limitation is related to the way all those SPI drivers are working with a notion of commands and data sent after with the exact same behavior to flash a buffer. If your driver is not following this pattern, there are changes that this will not work.\n\nThere is the possibility to add more behaviors like flashing directly buffers or adjust the way things are working. Please open issues or provide a PR to improve all this.\n\n## Feedback and documentation\n\nFor documentation, providing feedback, issues and finding out how to contribute please refer to the [Home repo](https://github.com/nanoframework/Home).\n\nJoin our Discord community [here](https://discord.gg/gCyBu8T).\n\n## Credits\n\nThe list of contributors to this project can be found at [CONTRIBUTORS](https://github.com/nanoframework/Home/blob/master/CONTRIBUTORS.md).\n\n## License\n\nThe **nanoFramework** Class Libraries are licensed under the [MIT license](LICENSE.md).\n\n## Code of Conduct\n\nThis project has adopted the code of conduct defined by the Contributor Covenant to clarify expected behaviour in our community.\nFor more information see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct).\n\n## .NET Foundation\n\nThis project is supported by the [.NET Foundation](https://dotnetfoundation.org).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnanoframework%2Fnanoframework.graphics","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnanoframework%2Fnanoframework.graphics","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnanoframework%2Fnanoframework.graphics/lists"}