历史上的今天
返回首页

历史上的今天

今天是: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);

推荐阅读

史海拾趣

德立电子(DDY)公司的发展小趣事

作为一家有远见的企业,德立电子深知绿色发展的重要性。公司积极响应国家环保政策,推行绿色生产和绿色供应链管理。同时,德立电子还积极参与社会公益事业,回馈社会,履行企业社会责任。

请注意,以上故事框架仅供参考,具体内容和细节需根据实际情况进行填充和完善。

电连(ECT)公司的发展小趣事

ECT在射频连接器领域取得了显著的技术突破。从2006年到2008年,公司开始研发射频同轴连接器,并在2009年实现精密射频同轴连接器的量产,并成功获得专利。这一技术突破为ECT在射频连接器市场赢得了重要地位,也为公司后续的发展奠定了坚实的基础。

HP(Keysight)公司的发展小趣事

随着汽车智能化的发展,ECT看到了车载连接器市场的巨大潜力。从2013年开始,公司开始布局车载连接器领域,并成功开发出多款适用于不同车型和场景的车载连接器产品。这一拓展不仅为ECT带来了新的增长点,也进一步巩固了公司在电子连接器行业的领先地位。

ETC1公司的发展小趣事

埃特斯是一家在ETC技术创新和市场应用方面均表现出色的企业。公司拥有一支高素质的研发团队,不断推出具有创新性的ETC产品和解决方案。同时,埃特斯还注重将创新技术应用于实际场景中,为客户提供高效、便捷的ETC服务。通过技术创新和市场应用的有机结合,埃特斯在ETC行业中树立了良好的口碑和品牌形象。

Advance Tapes公司的发展小趣事

为了进一步扩大市场份额,Advance Tapes公司开始积极参与国际展会和交流活动,向全球客户展示其优质的产品和技术实力。同时,公司还加大了对品牌建设的投入,通过广告宣传、赞助活动等方式提升品牌知名度和美誉度。这些努力使得Advance Tapes的胶带产品逐渐在国际市场上占据了一席之地。

Fairchild (ON Semiconductor)公司的发展小趣事

Fairchild Semiconductor在创立之初就致力于半导体技术的研发与创新。公司推出了多种具有革命性意义的半导体产品,如逻辑门、功率MOSFET、模拟集成电路等,这些产品不仅在当时市场上取得了巨大的成功,更为Fairchild在半导体行业中确立了领导地位。

问答坊 | AI 解惑

关于电瓶对充电机的自适应问题

当新电瓶配新充电机器时(自动的),如果充电器的终止电压稍高,则电瓶在最初的几次充放电周期内,每次都会有一点过充现象,过充会使电瓶失水,我们都知道,现在的电瓶多是贫液式电瓶,电瓶内水是不多的,失水的直接结果是,使电瓶内的硫酸浓度升高,硫酸浓度越 ...…

查看全部问答>

在2416开发板上移植CS8900源代码

由于三星的开发板没有带cs8900驱动 所以自己需要自己移植这部分驱动 我在2416开发板上移植cs8900到wince5.0 在PB5.0编译已经成功,并生成了cs8900.dll(在\\WINDOWS目录下可以见到) 我在PB5.0的setting->build option中只选择了Enable Eboot S ...…

查看全部问答>

evc4+pocketpc2003调试程序问题

使用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 ,电子时钟

有谁会编ds1307 +pic16f877?电子时钟的显示。     [ 本帖最后由 j_z 于 2011-2-20 16:29 编辑 ]…

查看全部问答>

【问TI】雪崩电压问题?

请问TVS的雪崩电压问题,比如雪崩电压里有最小的15V,最大24V,雪崩电压落在这个范围之内?还是从15V开始到最大24V…

查看全部问答>

土壤温度无线测量

土壤温度无线测量…

查看全部问答>

找个嵌入式相关的外版书译者

我是人邮编辑 现在手头有基本外版书需要找译者 有兴趣的朋友可以加我q 详谈 欢迎交流…

查看全部问答>