# Drivers - [Introduction](#section7301810197) - [Directory Structure](#section161941989596) - [Constraints](#section119744591305) - [Available APIs](#section1551164914237) - [Usage](#section129654513264) - [Repositories Involved](#section1371113476307) ## Introduction A kernel driver acts as a bridge between software and hardware. It allows accessing hardware resources of the OpenHarmony kernel through file system APIs, providing a mode of communication between the user space and kernel space and between processes. The main kernel drivers include **mem**, **random**, **video**, **quickstart**, **hievent**, and **tzdriver**. The preceding four types of drivers are stored in the **kernel/liteos\_a/drivers/char** directory, and the last two types **hievent** and **tzdriver** are stored in the **drivers/liteos** directory. Each type of driver represents a capability. You can select a driver as required to transmit data. The following figure shows the kernel driver architecture. **Figure 1** Kernel driver architecture ![](figures/kernel-driver-architecture.png "kernel-driver-architecture") Wherein: - **mem** indicates the driver for accessing physical input/output \(I/O\) devices in user space. It is used together with the **mmap** function. - **random** indicates the driver for devices to obtain random numbers, including true random number generators \(TRNGs\) and pseudorandom number generators \(PRNGs\). The device nodes for a TRNG and a PRNG are **/dev/random** and **/dev/urandom**, respectively. Comparatively, TRNGs provide a higher randomness. - **video** indicates the framebuffer driver framework. You need to initialize APIs, register the framebuffer driver, and operate the framebuffer driver through file system APIs. ## Directory Structure ``` /drivers/liteos ├── hievent # Driver for event log management ├── include # Header files exposed externally ├── tzdriver # Used for switching and communication between the rich execution environment (REE) and trusted execution environment (TEE) and provides device nodes that can be accessed from the application layer. ``` ## Constraints Since the **tzdriver** implementation is not completely open-source, third-party vendors need to obtain the support for it through cooperation. The hievent-related capabilities are not supported currently and will be opened in the future. In addition, do not modify APIs and the format of their parameters defined in the **hievent** folder. The video-related source code is stored in the **video/fb.c** and **video/fb.h** files under the **third\_party/NuttX** directory. ### Available APIs As shown in the preceding kernel driver architecture, a kernel driver can be taken as a special file. You can call standard file system APIs, such as **open**, **close**, **read**, **write**, and **ioctl** to perform operations on the driver. The following lists related APIs: - fb\_register **Function prototype:** int fb\_register\(int display, int plane\); **Function description:** Loads the framebuffer driver and registers the **/dev/fb0** device node. If the operation is successful, **0** is returned. Otherwise, an error code is returned. **Parameter description**

Parameter

Description

display

Indicates the display layer number. The value is usually 0. If the hardware supports multiple display layers, this parameter can be set to other values.

plane

Indicates the color plane. The value is usually 0.

- fb\_unregister **Function prototype:** int fb\_unregister\(int display\); **Function description:** Uninstalls the framebuffer driver. If the operation is successful, **0** is returned. Otherwise, an error code is returned. **Parameter description**

Parameter

Description

display

Indicates the display layer number.

- up\_fbinitialize **Function prototype:** int up\_fbinitialize\(int display\); **Function description:** Initializes the framebuffer driver. This function needs your implementation by calling **fb\_register** to register a device node for providing the framebuffer hardware driver capability. If the operation is successful, **0** is returned. Otherwise, an error code is returned. **Parameter description**

Parameter

Description

display

Indicates the display layer number.

- up\_fbuninitialize **Function prototype:** void up\_fbuninitialize\(int display\); **Function description:** Uninstalls the framebuffer driver. This function needs your implementation by calling **fb\_unregister** to unregister the device node. No value is returned for this function. **Parameter description**

Parameter

Description

display

Indicates the display layer number.

- up\_fbgetvplane **Function prototype:** struct fb\_vtable\_s \*up\_fbgetvplane\(int display, int vplane\); **Function description:** Obtains a framebuffer driver handle, which needs your implementation. If the operation is successful, a valid pointer is returned. Otherwise, **NULL** is returned. **Parameter description**

Parameter

Description

display

Indicates the display layer number.

vplane

Indicates the specified color plane.

- pse\_ran\_dev\_register **Function prototype:** int pse\_ran\_dev\_register\(void\); **Function description:** Initializes the PRNG device driver and registers the **/dev/random** device node. If the operation is successful, **0** is returned. Otherwise, an error code is returned. **Parameter description:** none - ran\_dev\_register **Function prototype:** int ran\_dev\_register\(void\); **Function description:** Initializes the TRNG driver and registers the **/dev/urandom** device node. If the operation is successful, **0** is returned. Otherwise, an error code is returned. **Parameter description:** none - mem\_dev\_register **Function prototype:** int mem\_dev\_register\(void\); **Function description:** Initializes the mem driver and registers the **/dev/mem** device node. If the operation is successful, **0** is returned. Otherwise, an error code is returned. **Parameter description:** none ### Usage - The following uses the framebuffer driver as an example: ``` int up_fbinitialize(int display) { // Provide framebuffer hardware driver capabilities. The specific code logic needs your implementation. } void up_fbuninitialize(int display) { // This function is used together with up_fbinitialize. The specific code logic needs your implementation. } struct fb_vtable_s *up_fbgetvplane(int display, int vplane) { // Register a hardware driver based on information described by the fb_vtable_s structure. You can use the driver capabilities through the video framework layer. The specific code logic needs your implementation. } int FrameBufferFunc(void) { int ret; int fd = -1; struct hifb_info info; char *pShowScreen = NULL; ret = fb_register(0, 0); // Register the /dev/fb0 device node. This function will call the preceding functions to enable hardware driver capabilities. if (ret != 0) { return -1; } fd = open(file, O_RDWR, 0); if (fd < 0) { return -1; } if (ioctl(fd, FBIOGET_SCREENINFO_HIFB, &info) < 0) { return -1; } info.vinfo.xres = 1920; info.vinfo.yres = 1080; info.oinfo.sarea.w = 1920; info.oinfo.sarea.h = 1080; info.oinfo.bpp = 16; info.activate = 0; info.vinfo.fmt = HIFB_FMT_ARGB1555; if (ioctl(fd, FBIOPUT_SCREENINFO_HIFB, &info) < 0) { return -1; } if (ioctl(fd, FBIOGET_SCREENINFO_HIFB, &info) < 0) { return -1; } pShowScreen = mmap(HI_NULL, info.oinfo.fblen, PROT_READ | PROT_WRITE, MAP_SHARED, pstInfo->fd, 0); if (pShowScreen == -1) { return -1; } // Fill in the memory to which pShowScreen points and display the graphics through the ioctl call. munmap(pShowScreen, info.oinfo.fblen); close(fd); ret = fb_unregister(0); if (ret != 0) { return -1; } } ``` ## Repositories Involved [Kernel subsystem](https://gitee.com/openharmony/docs/blob/HEAD/en/readme/kernel.md) [drivers\_liteos](https://gitee.com/openharmony/drivers_liteos/blob/master/README.md) [kernel\_liteos\_a](https://gitee.com/openharmony/kernel_liteos_a/blob/HEAD/README.md)