FL2440添加自帶led驅動
在之前學習驅動自己寫過led的驅動程序,其實s3c2440對於驅動已經支持得非常好,內核裏面已經有了led的驅動程序,我們要使能led驅動只需要稍作修改。
make menuconfig 配置
Device Drivers --->
[*] LED Support --->
[*] LED Class Support
<*> LED Support for Samsung S3C24XX GPIO LEDs//添加LED支持
源碼修改
s3c24xx系列的芯片的led硬件信息基本一致,因此內核將led的硬件設備信息源碼放在了 arch/arm/plat-s3c24xx/common-smdk.c,對照芯片手冊,我們要把led0~led3的相關GPIO分別配置成PB5,PB6,PB8,PB10
vim arch/arm/plat-s3c24xx/common-smdk.c
/* LED devices */
static struct s3c24xx_led_platdata smdk_pdata_led4 = {
.gpio = S3C2410_GPB(5),/*led0爲PB5*/
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led0",
.def_trigger = "timer",
};
static struct s3c24xx_led_platdata smdk_pdata_led5 = {
.gpio = S3C2410_GPB(6),/*led1爲PB6*/
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led1",
.def_trigger = "nand-disk",
};
static struct s3c24xx_led_platdata smdk_pdata_led6 = {
gpio = S3C2410_GPB(8),/*led2爲PB8*/
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led2",
};
static struct s3c24xx_led_platdata smdk_pdata_led7 = {
.gpio = S3C2410_GPB(10),/*led3爲PB10*/
.flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
.name = "led3",
};
完成以上操作之後重新編譯內核並且下載到開發板。
測試運行
對於向led這樣的設備模型,系統認爲所有的設備都是掛接在總線上的,而要使設備工作,就需要相應的驅動。設備模型會產生一個虛擬的文件系統——sysfs,它給用戶提供了一個從用戶空間去訪問內核設備的方法,它在linux裏的路徑是/sys。如果要寫程序訪問sysfs,可以像讀寫普通文件一樣來操作/sys目錄下的文件。
下載到內核之後會在/sys/class/目錄下生成leds目錄,會看到led0 led1 led2 led3,在leds目錄下執行ls -l 可知,led0、led1 、led2、 led3都是軟連接
進入到led0目錄下,可以看到brightness 等文件
其中brightness就是控制等亮滅的文件,max_brightness可以控制亮滅程度的最大值假如設定是100就是0到100代表不同的亮度(需要單板硬件的支持)。
- 向brightness文件中寫入1控制燈亮
- 向brightness文件中寫入0控制燈亮
cat > brightness //向brightness寫入數據
可以看到,寫入1時,led0點亮;寫入0時,led0熄滅。對於其他的led燈也是同樣的操作。