Detailed explanation of LCD driver (FramBuffer) example development on S3C2440 (Part 1)

Publisher:VelvetSoulLatest update time:2016-08-14 Source: eefocusKeywords:S3C2440 Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere
My Journey into Embedded Linux mainly describes and summarizes each step I took in learning embedded Linux. First, it summarizes my experience, and second, it hopes to provide convenience for friends who want to get started with embedded Linux. If there are any mistakes, please correct me.

1. Development Environment

Compiler: arm-linux-gcc-4.3.2

2. Background knowledge

1. Hardware requirements for LCD operation:
   To make an LCD display text or image normally, it needs not only LCD driver but also corresponding LCD controller. Usually, the manufacturer will make LCD driver together with LCD glass substrate in the form of COF/COG, while LCD controller is realized by external circuit. Now many MCUs have integrated LCD controller, such as S3C2410/2440. LCD controller can generate control signal required by LCD driver to control STN/TFT screen.
2. S3C2440 internal LCD controller structure diagram:
Detailed explanation of LCD driver (FramBuffer) example development on S3C2440 (I) (transferred) - melonbo - lonbo's blog
Let's describe the LCD controller integrated in the S3C2440 according to the data sheet:
a: LCD controller consists of REGBANK, LCDCDMA, TIMEGEN, and VIDPRCS registers;
b: REGBANK consists of 17 programmable registers and a 256*16 palette memory, which are used to configure the LCD controller;
c: LCDCDMA is a dedicated DMA that can automatically transfer video data in the memory to the LCD driver. By using this DMA channel, the video data is displayed on the LCD screen without the intervention of the CPU;
d: VIDPRCS receives data from LCDCDMA, converts the data into a suitable data format, such as 4/8-bit single-scan, 4-bit double-scan display mode, and then transmits the video data to the LCD driver through the data port VD[23:0];
e: TIMEGEN is composed of programmable logic. It generates the control signals required by the LCD driver, such as VSYNC, HSYNC, VCLK and LEND, etc. These control signals are closely related to the configuration of LCDCON1/2/3/4/5 in the REGBANK register group. Through different configurations, TIMEGEN can generate different forms of these signals to support different LCD drivers (that is, different STN/TFT screens).
3. Common TFT screen working timing analysis:
Detailed explanation of LCD driver (FramBuffer) example development on S3C2440 (I) (transferred) - melonbo - lonbo's blog
External interface signals provided by LCD:

VSYNC/VFRAME/STV: vertical synchronization signal (TFT)/frame synchronization signal (STN)/SEC TFT signal;
HSYNC/VLINE/CPV: horizontal synchronization signal (TFT)/line synchronization pulse signal (STN)/SEC TFT signal;
VCLK/LCD_HCLK: pixel clock signal (TFT/STN)/SEC TFT signal;
VD[23:0]: LCD pixel data output port (TFT/STN/SEC TFT);
VDEN/VM/TP: data enable signal (TFT)/LCD drive AC bias signal (STN)/SEC TFT signal;
LEND/STH: line end signal (TFT)/SEC TFT signal;
LCD_LPCOE: SEC TFT OE signal;
LCD_LPCREV: SEC TFT REV signal;
LCD_LPCREVB: SEC TFT REVB signal.

 

All monitors display images from top to bottom and from left to right. What does this mean? Well, an image can be considered a rectangle, consisting of many neatly arranged dots in rows, and these dots are called pixels. So the display principle of this image on an LCD is:

A: The display pointer starts from the first point of the first row in the upper left corner of the rectangle, and is displayed on the LCD one by one. The timeline in the above timing diagram is VCLK, which we call the pixel clock signal;
B: When the display pointer is displayed to the right side of the rectangle, the line ends, and the action of this line is called 1 Line in the above timing diagram;
C: Then the display pointer returns to the left side of the rectangle and starts to display from the second line. Note that it takes a certain amount of time for the display pointer to return from the right side of the first line to the left side of the second line. We call it line switching;
D: And so on, the display pointer is displayed line by line to the lower right corner of the rectangle to complete the display of a picture. Therefore, the display of these lines on the timeline is HSYNC on the timing diagram;
E: However, the display of LCD is not a quick display of an image. In order to display it continuously and stably on the LCD, it is necessary to switch to another picture (the other picture can be the same or different from the previous picture, the purpose is just to display the image continuously on the LCD). Then these images are called frames, which are represented as 1 Frame on the timing diagram. Therefore, it can be seen from the timing diagram that 1 Line is just a line in 1 Frame;
F: Similarly, it takes a certain amount of time to switch between frames, which we call frame switching. Then the entire LCD display process can be represented as VSYNC on the timing diagram when viewed on the timeline.

 

The meanings of the clock delay parameters in the above timing diagram are as follows: (The LCD manufacturer will provide the corresponding data sheet for the values ​​of these parameters)

VBPD (vertical back porch): indicates the number of invalid rows after the vertical synchronization signal at the beginning of a frame of image, corresponding to the upper_margin in the driver;
VFBD (vertical front porch): indicates the number of invalid rows before the vertical synchronization signal after the end of a frame of image, corresponding to the lower_margin in the driver;
VSPW (vertical sync pulse width): indicates the width of the vertical synchronization pulse, calculated by the number of rows, corresponding to the vsync_len in the driver;
HBPD (horizontal back porch): indicates the number of VCLKs from the start of the horizontal synchronization signal to the start of valid data of a row, corresponding to the left_margin in the driver;
HFPD (horizontal front porth): indicates the number of VCLKs from the end of valid data of a row to the start of the next horizontal synchronization signal, corresponding to the right_margin in the driver;
HSPW (horizontal sync pulse width): indicates the width of the horizontal synchronization signal, calculated by VCLK, corresponding to the hsync_len in the driver;

 

The values ​​of the above parameters will be saved in the LCDCON1/2/3/4/5 registers in the REGBANK register group respectively: (For the operation of the registers, please refer to the LCD section of the S3c2440 data sheet)

LCDCON1: 17 - 8-bit CLKVAL 
          6 - 5-bit scan mode (for STN screen: 4-bit single/dual scan, 8-bit single scan) 
          4 - 1-bit color mode (1BPP, 8BPP, 16BPP, etc.)

LCDCON2: 31 - 24-bit VBPD 
         23 - 14-bit LINEVAL 
         13 - 6-bit VFPD 
          5 - 0-bit VSPW

LCDCON3: 25 - 19-bit HBPD 
         18 - 8-bit HOZVAL 
          7 - 0-bit HFPD

LCDCON4: 7 - 0-bit HSPW

LCDCON5:

 

4. Frame Buffer:
   Frame buffer is an interface provided by Linux for display devices. It describes some display devices as a buffer, allowing applications to access these graphics devices through the interface defined by FrameBuffer, without having to worry about the specific hardware details. For frame buffer devices, as long as the color value is written to the area corresponding to the display point in the display buffer, the corresponding color will be automatically displayed on the screen. Let's take a look at the correspondence between the buffer and the display point in different color bit modes:
Detailed explanation of LCD driver (FramBuffer) example development on S3C2440 (I) (transferred) - melonbo - lonbo's blog
 
     The frame buffer device is a standard character device. In Linux, the major device number is 29, defined in FB_MAJOR in /include/linux/major.h. The minor device number defines the number of frame buffers. The maximum allowed is 32 FrameBuffers, defined in FB_MAX in /include/linux/fb.h, corresponding to the /dev/fb%d device file in the file system.

1. The structure of the frame buffer device driver in the Linux subsystem is as follows:
Detailed explanation of LCD driver (FramBuffer) example development on S3C2440 (I) (transferred) - melonbo - lonbo's blog
From the above picture, we can see that the frame buffer device can also be regarded as a complete subsystem in Linux, which is roughly composed of fbmem.c and xxxfb.c. It provides a complete device file operation interface to the application upward (that is, read, write, ioctl and other operations on the FrameBuffer device), which is implemented in the fbmem.c file provided by Linux; it provides a hardware operation interface downward, but Linux does not provide implementation for these interfaces, because this needs to be set according to the specific LCD controller hardware, so this is what we have to do (that is, the implementation of the xxxfb.c part).

2. Important data structures related to frame buffer:
   From the perspective of the frame buffer device driver structure, the driver is mainly related to the fb_info structure, which records all the information of the frame buffer device, including the device's setting parameters, status, and function pointers to the underlying hardware operations. In Linux, each frame buffer device must correspond to an fb_info. The definition of fb_info in /linux/fb.h is as follows: (Only some important ones are listed)

struct fb_info {
int node;
int flags;
struct fb_var_screeninfo var;/*LCD variable parameter structure*/
struct fb_fix_screeninfo fix;/*LCD fixed parameter structure*/
struct fb_monspecs monspecs;/*LCD display standard*/
struct work_struct queue;/*Frame buffer event queue*/
struct fb_pixmap pixmap; /*Image hardware mapper*/
struct fb_pixmap sprite; /*Cursor hardware mapper*/
struct fb_cmap cmap; /*Current color table*/
struct fb_videomode *mode;/*Current display mode*/

#ifdef CONFIG_FB_BACKLIGHT
struct backlight_device *bl_dev
struct mutex bl_curve_mutex;
    u8 bl_curve[FB_BACKLIGHT_LEVELS]
#endif
#ifdef CONFIG_FB_DEFERRED_IO
struct delayed_work deferred_work;
struct fb_deferred_io *fbdefio;
#endif

struct fb_ops *fbops
struct device *device;
struct device *dev;/*fb device*/
int class_flag;
#ifdef CONFIG_FB_TILEBLITTING
struct fb_tile_ops *tileops; /*Blitting*/
#endif
char __iomem *screen_base;/*virtual base address*/
unsigned long screen_size;/*LCD IO mapped virtual memory size*/ 
void *pseudo_palette;/*pseudo 16-color color table*/ 
#define FBINFO_STATE_RUNNING 0
#define FBINFO_STATE_SUSPENDED 1
    u32 state;/*LCD suspend or resume state*/
void *fbcon_par;
void *par;
};

 

 

Among them, the more important members are struct fb_var_screeninfo var, struct fb_fix_screeninfo fix and struct fb_ops *fbops, which are also structures. Let's look at them one by one.

The fb_var_screeninfo structure mainly records the controller parameters that can be modified by the user, such as the screen resolution and the number of bits per pixel. The structure is defined as follows:

struct fb_var_screeninfo {
    __u32 xres;/*How many pixels are there in one row of the visible screen*/
    __u32 yres;/*How many pixels are there in one column of the visible screen*/
    __u32 xres_virtual;/*How many pixels are there in one
    row of the virtual screen*/ __u32 yres_virtual;/*How many pixels are there in one column
    of the virtual screen*/ __u32 xoffset;/
    *Row offset between virtual and visible screen*/ __u32 yoffset;/*Column offset between virtual and visible screen*/
    __u32 bits_per_pixel;/*Number of bits per pixel, i.e. BPP*/
    __u32 grayscale;/*When not 0, it refers to grayscale*/

struct fb_bitfield red;/*R bit field of fb cache*/
struct fb_bitfield green;/*G bit field of fb cache*/
struct fb_bitfield blue;/*B bit field of fb cache*/
struct fb_bitfield transp;/*Transparency*/

    __u32 nonstd;/* != 0 non-standard pixel format*/
    __u32 activate;
    __u32 height;/*Height*/
    __u32 width;/*Width*/
    __u32 accel_flags;

/*Timing: Except for pixclock itself, all other units are in pixel clock*/
    __u32 pixclock;/*Pixel clock (picoseconds)*/
    __u32 left_margin;/*Line switching, delay from synchronization to drawing*/
    __u32 right_margin;/*Line switching, delay from drawing to synchronization*/
    __u32 upper_margin;/*Frame switching, delay from synchronization to drawing*/
    __u32 lower_margin;/*Frame switching, delay from drawing to synchronization*/
    __u32 hsync_len;/*Horizontal synchronization length*/
    __u32 vsync_len;/*Vertical synchronization length*/
    __u32 sync;
    __u32 vmode;
    __u32 rotate;
    __u32 reserved[5];/*reserved*/
};

 

 

The fb_fix_screeninfo structure mainly records the controller parameters that cannot be modified by the user, such as the physical address and length of the screen buffer. The definition of the structure is as follows:

struct fb_fix_screeninfo {
char id[16];/*identifier in string form*/
unsigned long smem_start;/*start position of fb cache*/
    __u32 smem_len;/*length of fb cache*/
    __u32 type;/*see FB_TYPE_* */
    __u32 type_aux;/*demarcation*/
    __u32 visual;/*see FB_VISUAL_* */ 
    __u16 xpanstep;/*if there is no hardware panning, assign it to 0 */
    __u16 ypanstep;/*if there is no hardware panning, assign it to 0 */
    __u16 ywrapstep;/*if there is no hardware ywrap, assign it to 0 */
    __u32 line_length;/*number of bytes in a line*/
unsigned long mmio_start;/*start position of memory mapped IO*/
    __u32 mmio_len;/*length of memory mapped IO*/
    __u32 accel;
    __u16 reserved[3];/*reserved*/
};

 

 

 

Among them, the more important members are struct fb_var_screeninfo var, struct fb_fix_screeninfo fix and struct fb_ops *fbops, which are also structures. Let's look at them one by one.

The fb_var_screeninfo structure mainly records the controller parameters that can be modified by the user, such as the screen resolution and the number of bits per pixel. The structure is defined as follows:

struct fb_var_screeninfo {
    __u32 xres;/*How many pixels are there in one row of the visible screen*/
    __u32 yres;/*How many pixels are there in one column of the visible screen*/
    __u32 xres_virtual;/*How many pixels are there in one
    row of the virtual screen*/ __u32 yres_virtual;/*How many pixels are there in one column
    of the virtual screen*/ __u32 xoffset;/
    *Row offset between virtual and visible screen*/ __u32 yoffset;/*Column offset between virtual and visible screen*/
    __u32 bits_per_pixel;/*Number of bits per pixel, i.e. BPP*/
    __u32 grayscale;/*When not 0, it refers to grayscale*/

struct fb_bitfield red;/*R bit field of fb cache*/
struct fb_bitfield green;/*G bit field of fb cache*/
struct fb_bitfield blue;/*B bit field of fb cache*/
struct fb_bitfield transp;/*Transparency*/

    __u32 nonstd;/* != 0 non-standard pixel format*/
    __u32 activate;
    __u32 height;/*Height*/
    __u32 width;/*Width*/
    __u32 accel_flags;

/*Timing: Except for pixclock itself, all other units are in pixel clock*/
    __u32 pixclock;/*Pixel clock (picoseconds)*/
    __u32 left_margin;/*Line switching, delay from synchronization to drawing*/
    __u32 right_margin;/*Line switching, delay from drawing to synchronization*/
    __u32 upper_margin;/*Frame switching, delay from synchronization to drawing*/
    __u32 lower_margin;/*Frame switching, delay from drawing to synchronization*/
    __u32 hsync_len;/*Horizontal synchronization length*/
    __u32 vsync_len;/*Vertical synchronization length*/
    __u32 sync;
    __u32 vmode;
    __u32 rotate;
    __u32 reserved[5];/*reserved*/
};

 

 

The fb_fix_screeninfo structure mainly records the controller parameters that cannot be modified by the user, such as the physical address and length of the screen buffer. The definition of the structure is as follows:

struct fb_fix_screeninfo {
char id[16];/*identifier in string form*/
unsigned long smem_start;/*start position of fb cache*/
    __u32 smem_len;/*length of fb cache*/
    __u32 type;/*see FB_TYPE_* */
    __u32 type_aux;/*demarcation*/
    __u32 visual;/*see FB_VISUAL_* */ 
    __u16 xpanstep;/*if there is no hardware panning, assign it to 0 */
    __u16 ypanstep;/*if there is no hardware panning, assign it to 0 */
    __u16 ywrapstep;/*if there is no hardware ywrap, assign it to 0 */
    __u32 line_length;/*number of bytes in a line*/
unsigned long mmio_start;/*start position of memory mapped IO*/
    __u32 mmio_len;/*length of memory mapped IO*/
    __u32 accel;
    __u16 reserved[3];/*reserved*/
};

 

 

The fb_ops structure is a function pointer to the underlying hardware operations. The operations on the hardware are defined in this structure: (only the commonly used operations are listed here)

struct fb_ops {

struct module *owner;

//Check variable parameters and set them
int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);

//Update according to the set value to make it effective
int (*fb_set_par)(struct fb_info *info);

//Set color register
int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,
unsigned blue, unsigned transp, struct fb_info *info);

//Display blank
int (*fb_blank)(int blank, struct fb_info *info);

//Rectangular filling
void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);

//Copy data
void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);

//Graphic filling
void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);
};

 

 

3. Frame buffer device as platform device:
   In S3C2440, the LCD controller is integrated into the chip as a relatively independent unit, so Linux regards it as a platform device. Therefore, LCD-related platform devices and resources are defined in the kernel code /arch/arm/plat-s3c24xx/devs.c. The code is as follows:

/* LCD Controller */

 

//LCD controller resource information
static struct resource s3c_lcd_resource[] = {
[0] = {
.start = S3C24XX_PA_LCD




}
};

static u64 s3c_device_lcd_dmamask = 0xffffffffUL;

struct platform_device s3c_device_lcd = {
.name = "s3c2410-lcd"
.id = -1,
.num_resources = ARRAY_SIZE(s3c_lcd_resource)

.dev = {
.dma_mask = &s3c_device_lcd_dmamask,
.coherent_dma_mask = 0xffffffffUL
}
};

EXPORT_SYMBOL(s3c_device_lcd)

 


   In addition, Linux also defines a s3c2410fb_mach_info structure for the LCD platform device in /arch/arm/mach-s3c2410/include/mach/fb.h. This structure mainly records the hardware parameter information of the LCD (for example, the s3c2410fb_display member structure of the structure is used to record the LCD screen size, screen information, variable screen parameters, LCD configuration registers, etc.), so this structure can be used directly when writing the driver. Next, let's see how the kernel uses this structure. It is defined in /arch/arm/mach-s3c2440/mach-smdk2440.c:

/* LCD driver info */

 

//LCD hardware configuration information. Note that the LCD I use here is a NEC 3.5-inch TFT screen. These parameters should be set according to the specific LCD screen.
static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {

    //The setting here is to configure LCD register 5. These macros are defined in regs-lcd.h. The binary value after calculation is: 111111111111. Then compare the bits of LCDCON5 in the data sheet. Note that it starts from the right
. lcdcon5 = S3C2410_LCDCON5_FRM565 |
               S3C2410_LCDCON5_INVVLINE |
               S3C2410_LCDCON5_INVVFRAME |
               S3C2410_LCDCON5_PWREN |
               S3C2410_LCDCON5_HWSWP,

.type = S3C2410_LCDCON1_TFT


 

    //The following parameters have been mentioned in the above timing diagram analysis. Please set the values ​​of each parameter according to the specific LCD screen data sheet combined with the above timing analysis










};

static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {
.displays = &smdk2440_lcd_cfg
.num_displays = 1,
.default_display = 0,

.gpccon = 0xaaaa555a
.gpccon_mask = 0xffffffff,
.gpcup = 0x0000ffff
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaaaaaaa
.gpdcon_mask = 0xffffffff,
.gpdup = 0x0000ffff
.gpdup_mask = 0xffffffff,

.lpcsel = 0x0
};

Note: Many friends may not know what the parameters in the red part above are for, and how to set their values? In fact, it is closely related to your development board LCD controller. I believe you will know what they are used for after looking at the following two pictures:

Detailed explanation of LCD driver (FramBuffer) example development on S3C2440 (I) (transferred) - melonbo - lonbo's blog

Detailed explanation of LCD driver (FramBuffer) example development on S3C2440 (I) (transferred) - melonbo - lonbo's blog

The first picture above is the LCD controller part of the development board schematic, and the second picture is the IO port C and IO port D controller part in the S3c2440 data sheet. In the schematic, GPC8-15 and GPD0-15 are used as the data ports of the LCD controller VD0-VD23, and GPC0 and GPC1 ports are used as the LEND and VCLK signals of the LCD controller, respectively. For GPC2-7, they are used as the related signals of STN screen or Samsung professional TFT screen. However, the various IO ports of S3C2440 are not single functions, but multiplexed ports. To use them, they must be configured first. Therefore, the parameters in the red part above are to configure some ports of GPC and GPD into LCD control function mode.

   From the above, it can be seen that in order to make the LCD controller support other LCD screens, it is important to modify the values ​​of the above parameters according to the LCD data sheet. Next, let's take a look at how to reference the s3c2410fb_mach_info structure in the driver (note that the above is how to use it in the kernel). In mach-smdk2440.c, there is:

//S3C2440 initialization function
static void __init smdk2440_machine_init(void)
{

 


s3c24xx_fb_set_platdata(&smdk2440_fb_info);

    s3c_i2c0_set_platdata(NULL);

    platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));
    smdk_machine_init();
}

 

s3c24xx_fb_set_platdata is defined in plat-s3c24xx/devs.c:

void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)
{
struct s3c2410fb_mach_info *npd;

    npd = kmalloc(sizeof(*npd), GFP_KERNEL);
if (npd) {
memcpy(npd, pd, sizeof(*npd));

 

        //Here is to save the s3c2410fb_mach_info structure data defined in the kernel to the LCD platform data, so when writing the driver, you can directly get the data of the s3c2410fb_mach_info structure (that is, various LCD parameter information) in the platform data for operation
        s3c_device_lcd.dev.platform_data = npd;
} else {
        printk(KERN_ERR "no memory for LCD platform data\n");
}
}

 

   Here is another little knowledge: I wonder if you have noticed that in the platform device driver, platform_data can save the data of each platform device instance, but the types of these data are different. Why can they all be saved? To understand this, we need to look at the definition of platform_data, which is defined in /linux/device.h. void *platform_data is a void type pointer. In Linux, void can save any data type.

 

Keywords:S3C2440 Reference address:Detailed explanation of LCD driver (FramBuffer) example development on S3C2440 (Part 1)

Previous article:Pseudo-operations in ARM assembly language (I)
Next article:LCD driver (FrameBuffer) example development explanation on S3C2440 (Part 2)

Recommended ReadingLatest update time:2024-11-16 20:24

S3C2440 bare metal -------LCD_LCD hardware principle
1. LCD connection diagram  2. LCD timing diagram  
[Microcontroller]
S3C2440 bare metal -------LCD_LCD hardware principle
Detailed explanation of U-boot transplantation on S3C2440 (1)
1. Transplantation environment Host: VMWare--Fedora 9 Development board: Mini2440--64MB Nand, Kernel:2.6.30.4 Compiler: arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 2. Transplantation steps Features of this transplant include: Support Nand Flash reading and writing Support booting from Nor/Nand Flash
[Microcontroller]
Detailed explanation of U-boot transplantation on S3C2440 (1)
STC89C52R parallel drive LCD12864 (asm/c51)
/*Experimentally proven AT89C52 and LCD12864   do not use BF (busy signal) query, delay 1ms   and cannot perform BF query*/ rs bit p2.4 rw bit p2.5 e  bit p2.6 psb bit p2.1 res bit p2.3 com equ 30h date equ 31h org 0000h sjmp main org 0030h main:mov p0,#00h      mov p2,#10000111b   lcall delay   se
[Microcontroller]
STC89C52R parallel drive LCD12864 (asm/c51)
Analysis on S3C2440 memory address allocation and startup process
When learning embedded systems, the first thing you should understand is the allocation of address space. Only by truly understanding the location represented by each address can you have a foundation for getting started. 1. Address allocation (how to find 1G space for 27 wires) S3C2440 integrates a rich set of periph
[Microcontroller]
Display driver design of LPC2478 color analog TFT-LCD
Introduction At present, ARM is increasingly used in embedded systems. This article uses NXP's 32-bit LPC2478. LPC2478's rich resources are suitable for industrial applications. The chip has low cost and power consumption. It is an ARM7 chip with an internal LCD controller. In the industrial field, compared with
[Power Management]
Display driver design of LPC2478 color analog TFT-LCD
LCD backlight adjustment and driver implementation based on embedded Linux
In handheld devices, liquid crystal displays are increasingly used. Since LCDs cannot emit light by themselves, they require a strong light source to provide backlight for them in order to clearly display information. Such light sources are very power-hungry, and the power consumption of liquid crystal displays usua
[Power Management]
LCD backlight adjustment and driver implementation based on embedded Linux
How to drive LCD1602 to display and move left and right
The following program will display "Velcome" and "www.ycavr.cn" on the LCD1602 and move left and right. /********************************* * Character LCD1602 application example * * Experimental environment: AFA's M16 learning board * * Wiring method: RS=PD.3, E=PD.6 * * Db0-Db7=PB0-PB7 * * Compiler: ICCAVR6.31A
[Microcontroller]
Realization of LCD driving circuit based on handheld terminal
Most of the portable handheld terminal products now, such as mobile phones, navigation systems, etc., have a small LCD display, which makes the design of LCD drive circuit an important part of handheld terminal design. The design of LCD driver circuit is an important part of handheld terminal products. This pap
[Power Management]
Realization of LCD driving circuit based on handheld terminal
Latest Microcontroller Articles
  • Download from the Internet--ARM Getting Started Notes
    A brief introduction: From today on, the ARM notebook of the rookie is open, and it can be regarded as a place to store these notes. Why publish it? Maybe you are interested in it. In fact, the reason for these notes is ...
  • Learn ARM development(22)
    Turning off and on interrupts Interrupts are an efficient dialogue mechanism, but sometimes you don't want to interrupt the program while it is running. For example, when you are printing something, the program suddenly interrupts and another ...
  • Learn ARM development(21)
    First, declare the task pointer, because it will be used later. Task pointer volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • Learn ARM development(20)
    With the previous Tick interrupt, the basic task switching conditions are ready. However, this "easterly" is also difficult to understand. Only through continuous practice can we understand it. ...
  • Learn ARM development(19)
    After many days of hard work, I finally got the interrupt working. But in order to allow RTOS to use timer interrupts, what kind of interrupts can be implemented in S3C44B0? There are two methods in S3C44B0. ...
  • Learn ARM development(14)
  • Learn ARM development(15)
  • Learn ARM development(16)
  • Learn ARM development(17)
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号