在我的開發板上,通過S3C2440的GPG4引腳可以控制LCD的背光,即置1時LCD點亮,清零時LCD關閉。
Linux系統把LCD背光定義成LED平台裝置。在Mach-zhaocj2440.c檔案內,它的定義為:
static struct s3c24xx_led_platdata zhaocj2440_led_backlight_pdata = {
.name = "backlight",
.gpio = S3C2410_GPG(4),
.def_trigger = "backlight",
};
static struct platform_device zhaocj2440_led_backlight= {
.name = "s3c24xx_led",
.id = 5,
.dev = {
.platform_data = &zhaocj2440_led_backlight_pdata,
},
};
如果要為系統添加控制LCD背光的功能,只需要在zhaocj2440_features_str數組內添加一個"b"欄位(b表示背光)即可,即:
static char zhaocj2440_features_str[12]__initdata = "4tb";
系統通過zhaocj2440_parse_features函數,把zhaocj2440_features_str數組內給出的各個裝置逐一放入到features結構中,然後再通過zhaocj2440_init函數中的下列語句把上述裝置添加到平台匯流排上:
if (features.count) /* the optional features */
platform_add_devices(features.optional,features.count);
由於系統是把LCD背光看成是LED裝置,因此它的平台驅動也和LED的平台驅動一樣,即:
static struct platform_driver s3c24xx_led_driver = {
.probe = s3c24xx_led_probe,
.remove = s3c24xx_led_remove,
.driver = {
.name = "s3c24xx_led",
.owner = THIS_MODULE,
},
};
關於LED的驅動,我在前面的文章中比較詳細的介紹過,這裡就不再贅述。
還有一點需要注意的是,系統初始化時,對控制LED的引腳設定是低電平的,因此系統啟動後LED是不亮的。同樣的,控制背光的GPG4引腳預設也是低電平,所以啟動系統的時候,LCD也是不亮的。這樣的設定對LED沒什麼不妥,但對LCD就不適合了。因此我們要改變對背光引腳的預設設定,讓它為高電平。為了實現上述功能,只需要在Leds-s3c24xx.c檔案內(drivers/leds目錄下)的s3c24xx_led_probe函數中的適當位置(大約在第107行附件)添加下列語句即可:
if(pdata->name == "backlight")
gpio_set_value(pdata->gpio,1);
下面我們寫一段應用程式來控制LCD的背光:
/****************
****backlight.c****
*****************/
#include<stdint.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<linux/input.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
int fd;
fd =open("/sys/class/leds/backlight/brightness", O_RDWR);
if(fd<0)
{
printf("can not open file.\n");
return -1;
}
if(!strcmp(argv[1], "on"))
write(fd, “1”,1);
else if(!strcmp(argv[1], "off"))
write(fd, “0”, 1);
close(fd);
return 0;
}
把程式編譯好後下載到temp目錄下,運行:
[root@zhaocj /temp]# ./backlight on
開啟背光,LCD可以顯示
[root@zhaocj /temp]# ./backlight off
關閉背光,LCD不能顯示