裝置樹學習之(二)點燈

2021-08-18 09:17:23 字數 4680 閱讀 3304

開發板:tiny4412sdk + s702 + 4gb flash 

要移植的核心版本:linux-4.4.0 (支援device tree) 

u-boot版本:友善之臂自帶的 u-boot 2010.12 

busybox版本:busybox 1.25

目標: 

學習裝置樹中gpio控制器的使用,實現配置引腳為輸出功能,寫簡單的字元裝置驅動程式,實現點亮led。

原理圖: 

tiny4412 核心板上有6顆led,這裡我們只控制其中4顆,它們分別接在gpm4_0、gpm4_1、gpm4_2、gpm4_3 引腳。想要點亮led,首先得配置引腳為輸出功能,輸出低電平時led點亮,高電平時,led熄滅。重點在於裝置樹中gpio控制器資源的使用。

裝置樹參考:

參考:samsung gpio and pin mux/config controller

example 1: a pin-controller node with pin groups.

pinctrl_0: pinctrl@11400000 ;

example 3: a uart client node that supports 'default' and 'flow-control' states.

uart@13800000 ;

"samsung,pins" property of the child node. the following pin configuration properties are supported.

- samsung,pin-val: initial value of pin output buffer.

- samsung,pin-pud: pull up/down configuration.

- samsung,pin-drv: drive strength configuration.

- samsung,pin-pud-pdn: pull up/down configuration in power down mode.

- samsung,pin-drv-pdn: drive strength configuration in power down mode.

裝置樹:

&pinctrl@11000000 ;

}; led_pin ;

我們在 pinctrl 中增加了 led 節點,它代表了一種引腳功能,比如這裡設定的 gpm4_0、gpm4_1、gpm4_2、gpm4_3,引腳功能為 0x01 輸出,無上拉等等。在其它地方,我們可以引用它,來表示引腳支援的功能。 

下面我們增加了 led_pin 節點,它有乙個屬性 pinctrl-names = 「led_demo」,這是我們給引腳功能狀態起的名字,如果支援多種功能,可以是字串列表的形式。字串的個數要和下面 pinctrl-n 的個數對應,pinctrl-0 引用了我們前面定義的那個將引腳設定為輸出功能的屬性。 

在**中,我們可以用過 pinctrl-names 來獲得特定的引腳功能,並設定它。如果 pinctrl-names 為 「default」,那麼這種功能狀態將設定為預設的引腳狀態,**中無需處理。

**片段:

static int led_probe(struct platform_device *pdev) 

pstate = pinctrl_lookup_state(pctrl, "led_demo");

if(pstate == null)

pinctrl_select_state(pctrl, pstate);//設定為輸出模式

printk("enter %s\n",__func__);

led1 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio1", 0);;

led2 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio2", 0);;

led3 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio3", 0);;

led4 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio4", 0);;

if(led1 <= 0)

else

完整**:

#include #include #include #include #include #include #include #include #include #include #define led_cnt   4

static int major;

static struct cdev led_cdev; //核心中用cdev描述乙個字元裝置

static struct class *cls;

static int led1,led2,led3,led4;

static ssize_t led_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos)

if (copy_from_user(&buf, user_buf, count))

return -efault;

printk("rcv %d\n",buf);

if(buf == 0x01)

}else if(buf == 0x0)

}}static int led_open(struct inode *inode, struct file *file)

static struct file_operations led_fops = ;

static int led_probe(struct platform_device *pdev)

pstate = pinctrl_lookup_state(pctrl, "led_demo");

if(pstate == null)

pinctrl_select_state(pctrl, pstate);//設定為輸出模式

printk("enter %s\n",__func__);

led1 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio1", 0);;

led2 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio2", 0);;

led3 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio3", 0);;

led4 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio4", 0);;

if(led1 <= 0)

else

if(alloc_chrdev_region(&devid, 0, led_cnt, "led") < 0)/* (major,0~1) 對應 hello_fops, (major, 2~255)都不對應hello_fops */

major = major(devid);

cdev_init(&led_cdev, &led_fops); //繫結檔案操作函式

cdev_add(&led_cdev, devid, led_cnt); //註冊到核心

cls = class_create(this_module, "led"); //建立led類,向類中新增裝置,mdev會幫我們建立裝置節點

device_create(cls, null, mkdev(major, 0), null, "led0");

device_create(cls, null, mkdev(major, 1), null, "led1");

device_create(cls, null, mkdev(major, 2), null, "led2");

device_create(cls, null, mkdev(major, 3), null, "led3");

error:

unregister_chrdev_region(mkdev(major, 0), led_cnt);

return 0;

}static int led_remove(struct platform_device *pdev)

static const struct of_device_id led_dt_ids = ,

{},};module_device_table(of, led_dt_ids);

static struct platform_driver led_driver = ,

.probe = led_probe,

.remove = led_remove,

};static int led_init(void)

static void led_exit(void)

module_init(led_init);

module_exit(led_exit);

module_license("gpl");

mini2440裸機程式之二 點亮LED燈

開發板 mini2440 sdk mdk 開發語言 彙編 本次目的 開發板四個led燈連續間斷閃爍 1 硬體電路 2 程式示例 pgpbcon equ 0x56000010 pgpbdat equ 0x56000014 pgpbup equ 0x56000018 area ledasmtest,co...

STM32學習心得 二 點亮LED燈

stm32學習心得 二 點亮led燈 在建立好工程模板後,就可以開始真正進入stm32的學習。手下那當然是試著點亮乙個led燈。首先在user目錄下建立乙個空資料夾,並命名為bsp led bsp的意思是板級支援包,即該 僅支援這塊板子 進去資料夾,新建兩個檔案,分別是bsp led.c以及bsp ...

STM32從零開始(二) 點亮led燈

先看標頭檔案 ifndef gpio led72mhz define gpio led72mhz define gpiob base 0x40010c00 define gpiob crh gpiob base 0x04 define gpiob odr gpiob base 0x0c define...