1、原理分析
無線數碼相框的GPQ3腳用於充電控制,當GPQ3爲高電平是爲充電狀態,當爲低電平時不充電。led的控制原理和充電腳的控制原理是一模一樣的都是對某個io口置1或清零,所以在這裏可以用led驅動實現對充電控制腳的控制。
Linux內核下drivers/leds/ledsgpio.c實現了一個和體系結構無關的led驅動,使用此led驅動我們只需要在BSP的板文件(arch/arm/mach-s3c6410/mach-smdk6410.c)中定義相關platform設備和數據
2、ut-s3c6410開發板的led控制驅動實現
在ut-s3c6410開發板上,用GPM0—GPM3外界4個lcd,因此對於的platform設備信息如下:
static struct gpio_led smdk6410_leds[] = {
[0] = {
.name = "LED1",
.gpio = S3C64XX_GPM(0),
},
[1] = {
.name = "LED2",
.gpio = S3C64XX_GPM(1),
.active_low = 1,
},
[2] = {
.name = "LED3",
.gpio = S3C64XX_GPM(2),
.active_low = 0,
},
[3] = {
.name = "LED4",
.gpio = S3C64XX_GPM(3),
.default_trigger = "heartbeat",
},
};
static struct gpio_led_platform_data smdk6410_gpio_led_pdata = {
.num_leds = ARRAY_SIZE(smdk6410_leds),
.leds = smdk6410_leds,
};
static struct platform_device smdk6410_device_led = {
.name = "leds-gpio",
.id = 1,
.dev = {
.platform_data = &smdk6410_gpio_led_pdata,
},
};
並將“&smdk6410_device_led,”語句填入 struct platform_device *ldd6410_devices[]數組,作爲該數組的一個成員。
啓動內核時會打印:
Registered led device: LED1
Registered led device: LED2
Registered led device: LED3
Registered led device: LED4
LED1—LED4對應開發板的四個led燈通過如下命令可分別點亮四個led燈:
#echo 1 > /sys/class/leds/LED1/brightness
#echo 1 > /sys/class/leds/LED1/brightness
#echo 1 > /sys/class/leds/LED1/brightness
#echo 1 > /sys/class/leds/LED1/brightness
通過如下命令可分別熄滅四個led等:
#echo 0 > /sys/class/leds/LED1/brightness
#echo 0 > /sys/class/leds/LED1/brightness
#echo 0 > /sys/class/leds/LED1/brightness
#echo 0 > /sys/class/leds/LED1/brightness
3、無線數碼相框充電控制驅動實現
控制原理和以上分析的LED燈的控制是一模一樣的,只需將smdk6410_leds結構體改爲:
static struct gpio_led smdk6410_leds[] = {
[0] = {
.name = "charge",
.gpio = S3C64XX_GPQ(3),
},
};
通過如下命令開始電池充電:
#echo 1 > /sys/class/leds/ charge /brightness
通過如下命令停止電池充電:
#echo 0 > /sys/class/leds/ charge /brightness
其它的參見上面一節“ut-s3c6410開發板的led控制驅動實現”進行設置。