历史上的今天
今天是:2025年02月16日(星期日)
2020年02月16日 | 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)
2020-02-16 来源:eefocus
平臺
tiny4412 ADK
Linux-4.4.4
u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動
平臺
tiny4412 ADK
Linux-4.4.4
u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uImage做了稍許改動
我們以控制tiny4412上的LED1和LED2爲例,使用的GPIO是GPM4_0和GPM4_1對應的原理圖如下:
datasheet如下:
在samsung的pinctrl驅動中加一些調試用的log:
1 diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
2 index 4e4c308..53fc268 100644
3 --- a/drivers/gpio/gpiolib.c
4 +++ b/drivers/gpio/gpiolib.c
5 @@ -753,6 +753,7 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) {}
6 */
7 int gpiochip_generic_request(struct gpio_chip *chip, unsigned offset)
8 {
9 + printk("%s entern", __func__);
10 return pinctrl_request_gpio(chip->base + offset);
11 }
12 EXPORT_SYMBOL_GPL(gpiochip_generic_request);
13 diff --git a/drivers/pinctrl/samsung/pinctrl-samsung.c b/drivers/pinctrl/samsung/pinctrl-samsung.c
14 index 3f622cc..4f3bbe2 100644
15 --- a/drivers/pinctrl/samsung/pinctrl-samsung.c
16 +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
17 @@ -391,6 +391,7 @@ static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
18 if (enable)
19 data |= func->val << shift;
20 writel(data, reg + type->reg_offset[PINCFG_TYPE_FUNC]);
21 + printk("%s: reg: 0x%x, value: 0x%xn", __func__, reg + type->reg_offset[PINCFG_TYPE_FUNC], data);
22
23 spin_unlock_irqrestore(&bank->slock, flags);
24 }
25 @@ -447,6 +448,7 @@ static int samsung_pinconf_rw(struct pinctrl_dev *pctldev, unsigned int pin,
26 data &= ~(mask << shift);
27 data |= (cfg_value << shift);
28 writel(data, reg_base + cfg_reg);
29 + printk("%s: reg: 0x%x, value: 0x%xn", __func__, reg_base + cfg_reg, data);
30 } else {
31 data >>= shift;
32 data &= mask;
33 @@ -537,6 +539,7 @@ static void samsung_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
34 if (value)
35 data |= 1 << offset;
36 writel(data, reg + type->reg_offset[PINCFG_TYPE_DAT]);
37 + printk("%s: reg: 0x%x, value: 0x%xn", __func__, reg + type->reg_offset[PINCFG_TYPE_DAT], data);
38
39 spin_unlock_irqrestore(&bank->slock, flags);
40 }
41 @@ -593,6 +596,7 @@ static int samsung_gpio_set_direction(struct gpio_chip *gc,
42 if (!input)
43 data |= FUNC_OUTPUT << shift;
44 writel(data, reg);
45 + printk("%s: reg: 0x%x, value: 0x%xn", __func__, reg, data);
46
47 spin_unlock_irqrestore(&bank->slock, flags);
48
49 @@ -622,6 +626,8 @@ static int samsung_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
50 struct samsung_pin_bank *bank = gc_to_pin_bank(gc);
51 unsigned int virq;
52
53 + printk("%s enter.n", __func__);
54 +
55 if (!bank->irq_domain)
56 return -ENXIO;
將來在操作gpio的時候會回調到上面的這些函數。
在設備樹中添加相應的節點:
1. 首先把"gpio-leds"節點disable掉,否則會有衝突
2. 添加"tiny4412,gpio_demo"節點
3. 給pinctrl添加相關的pinmux節點
1 diff --git a/arch/arm/boot/dts/exynos4412-tiny4412.dts b/arch/arm/boot/dts/exynos4412-tiny4412.dts
2 index 610202a..0280935 100644
3 --- a/arch/arm/boot/dts/exynos4412-tiny4412.dts
4 +++ b/arch/arm/boot/dts/exynos4412-tiny4412.dts
5 @@ -31,7 +31,7 @@
6 #ifdef CONFIG_MMA7660_USE_I2C_GPIO
7 i2c9 = &i2c_mma7660;
8 #endif
9 - };
10 + };
11
12 memory {
13 reg =
14 @@ -39,7 +39,7 @@
15
16 leds {
17 compatible = "gpio-leds";
18 -
19 + status = "disabled";
20 led1 {
21 label = "led1";
22 gpios =
23 @@ -109,7 +109,7 @@
24 pinctrl-0 =
25 pinctrl-names = "default";
26 #endif
27 - status = "disabled";
28 + status = "disabled";
29 };
30
31 #ifdef CONFIG_MMA7660_USE_I2C_GPIO
32 @@ -136,6 +136,48 @@
33 };
34 };
35 #endif
36 +
... ...45 +
46 + gpio_demo: gpio_demo {
47 + compatible = "tiny4412,gpio_demo";
48 + reg =
49 + tiny4412,gpio =
50 + pinctrl-names = "default", "gpio_sleep", "gpio_active";
51 + pinctrl-0 =
52 + pinctrl-1 =
53 + pinctrl-2 =
54 + };
55 +};
56 +
57 +&pinctrl_1 {
58 + led_gpio_default: led_gpio_default {
59 + samsung,pins = "gpm4-0", "gpm4-1";
60 + samsung,pin-function =
61 + samsung,pin-pud =
62 + samsung,pin-drv =
63 + };
64 +
65 + led_gpio_sleep: led_gpio_sleep {
66 + samsung,pins = "gpm4-0", "gpm4-1";
67 + samsung,pin-function =
68 + samsung,pin-pud =
69 + samsung,pin-drv =
70 + };
71 +
72 + led_gpio_active: led_gpio_active {
73 + samsung,pins = "gpm4-0", "gpm4-1";
74 + samsung,pin-function =
75 + samsung,pin-pud =
76 + samsung,pin-drv =
77 + };
78 };
79
80 &rtc {
編寫對應的測試驅動程序:
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7
8 typedef struct
9 {
10 int gpio;
11 int state;
12 struct pinctrl *pctrl;
13 struct pinctrl_state *sleep_pstate;
14 struct pinctrl_state *active_pstate;
15 char name[20];
16 } gpio_demo_data_t;
17
18 static u32 __iomem *base;
19 static u32 __iomem *cfg_reg;
20 static u32 __iomem *pud_reg;
21 static u32 __iomem *drv_reg;
22
23 static ssize_t gpio_demo_show(struct device *dev,
24 struct device_attribute *attr, char *buf)
25 {
26 gpio_demo_data_t *data = dev_get_drvdata(dev);
27 u32 config, pud, drv;
28
29 config = readl(cfg_reg);
30 pud = readl(pud_reg);
31 drv = readl(drv_reg);
32
33 return snprintf(buf, PAGE_SIZE, "gpio0: %s, gpio1: %s, cfg: 0x%x, pud: 0x%x, drv: 0x%xn", data[0].state?"active":"sleep",
34 data[1].state?"active":"sleep", config, pud, drv);
35 }
36
37 static ssize_t gpio_demo_store(struct device *dev,
38 struct device_attribute *attr, const char *buf, size_t count)
39 {
40 gpio_demo_data_t *data = dev_get_drvdata(dev);
41 char state[10];
42 int value = 0;
43
44 if (sscanf(buf, "%s", state) != 1)
45 return -EINVAL;
46 if (strncmp(state, "active", strlen("active")) == 0) { // 向gpio_demo中寫入active字符串
47 pinctrl_select_state(data[0].pctrl, data[0].active_pstate);
48 pinctrl_select_state(data[1].pctrl, data[1].active_pstate);
49 data[0].state = 1;
50 data[1].state = 1;
51 } else if (strncmp(state, "sleep", strlen("sleep")) == 0) { // 向gpio_demo中寫入sleep字符串
52 pinctrl_select_state(data[0].pctrl, data[0].sleep_pstate);
史海拾趣
|
当新电瓶配新充电机器时(自动的),如果充电器的终止电压稍高,则电瓶在最初的几次充放电周期内,每次都会有一点过充现象,过充会使电瓶失水,我们都知道,现在的电瓶多是贫液式电瓶,电瓶内水是不多的,失水的直接结果是,使电瓶内的硫酸浓度升高,硫酸浓度越 ...… 查看全部问答> |
|
由于三星的开发板没有带cs8900驱动 所以自己需要自己移植这部分驱动 我在2416开发板上移植cs8900到wince5.0 在PB5.0编译已经成功,并生成了cs8900.dll(在\\WINDOWS目录下可以见到) 我在PB5.0的setting->build option中只选择了Enable Eboot S ...… 查看全部问答> |
|
使用evc4和pocket pc 2003英文版写了个最简单的Hello World程序,编译通过,也弹出了pocket pc仿真器,不过没有显示 Hello World。想知道可能的原因。请高手指点。 应该如何正确设置evc4的download directory?… 查看全部问答> |
|
我在用platform builder5.0定制 OS Image时总出现下面的2个错误: BUILD: [01:0000000584:ERRORE] oal_power_s3c2440a.lib(off.obj) : error LNK2019: unresolved external symbol OALCPUPowerOff referenced in function OEMPowerOff ...… 查看全部问答> |
|
有谁会编ds1307 +pic16f877?电子时钟的显示。 [ 本帖最后由 j_z 于 2011-2-20 16:29 编辑 ]… 查看全部问答> |




