1. 如何配置gpio功能? 修改文件 kernel-3.2/arch/arm/mach-omap2/board-am335xevm-xd.c 例如将uart配置成gpio,mode7是根据芯片手册确定的 static struct pinmux_config uart1_pin_mux[] = { {"uart1_rxd.uart1_rxd", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP}, {"uart1_txd.uart1_txd", OMAP_MUX_MODE0 | AM33XX_PULL_ENBL}, {NULL, 0}, }; 修改成 static struct pinmux_config uart1_pin_mux[] = { {"uart1_rxd.gpio0_14", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT}, {"uart1_txd.gpio0_15", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT}, {NULL, 0}, };
2. 按照上面的方法配置完成发现无法使用gpio,为什么配置不生效? 原因:没有将该引脚的其他功能注释掉 例如我使用的是uart1_rxd引脚的gpio功能,因为这个是一个复用引脚,可以查看硬件手册,搜索对应引脚名字查看都有什么功能,然后将这个引脚除了gpio,将其他复用全部关掉,注释掉。 //{"uart1_rxd.uart1_rxd", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
3. 配置好,复用功能都注释掉,为什么gpio无法配置引脚拉高拉低? 如果是自己新建/添加 **_pin_mux[] 那么需要 setup_pin_mux(**_pin_mux); 这一步很关键,如果配置好却不设置pinmux,再怎么配置都是徒劳,也就无法拉高拉低 然后初始化编写**_init{}函数,初始化pinmux, static void **_init(int evm_id, int profile) { setup_pin_mux(**_mux); } 最后将**_init放入ok335x_dev_cfg[]
4. 配置好,复用功能都注释掉,为什么gpio无法在用户空间echo导出? 看一个简单的LED的例子 static void led_init(int evm_id, int profile) { int err; setup_pin_mux(gpio_led_mux); err = platform_device_register(&leds_gpio); if (err) pr_err("failed to register gpio led device\n"); } 如果想在用户空间使用echo导出gpio,那么只需要setup_pin_mux()即可 使用platform_device_register();这个函数会将gpio通过内核注册,就无法再通过用户空间导出了。 另外,使用gpio_set_value() gpio_request() pio_direction_output()函数也会导致无法在用户空间echo导出。
5. 怎么echo导出引脚,对应的gpio编号的多少? 公式:编号=32 * gpio组 +gpio号 例如gpio1_16 编号就是32 *1+16=48 导出: echo 48 > /sys/class/gpio/export
6. 我新加的一个功能,比如uart,pwm等等,发现不起作用?Why? 例如335xd添加pwm,通过查看硬件手册,查看有四个引脚可以输出pwm,分别是gpmc_a2,gpmc_a3,gpmc_ad8,gpmc_ad9,但只有gpmc_a2一路能输出信号, 原因是Ti的引脚定义不全,导致配置不起作用 通过查看硬件手册,gpmc_a2,gpmc_a3的mode6为pwm功能, 但ti引脚定义如下: _AM33XX_MUXENTRY(GPMC_A2, 0, "gpmc_a2", "mii2_txd3", "rgmii2_td3", "mmc2_dat1", NULL, NULL, "ehrpwm1a", "gpio1_18"), _AM33XX_MUXENTRY(GPMC_A3, 0, "gpmc_a3", "mii2_txd2", "rgmii2_td2", "mmc2_dat2", NULL, NULL, NULL, "gpio1_19"), 可以看到,当使用gpmc_a3的mode6 "ehrpwm1a" 功能的时候,该引脚为NULL 解决方法: 需要在 mux33xx.c修改,该文件和板级配置文件在相同目录,将NULL修改成为ehrpwm1b即可
7. 为什么启动时,我的gpio引脚电平状态会跳变,内核完全启动才能稳定? 原因是选用的引脚在上电会有默认一个状态,然后你初始化这个引脚又是一个状态,导致跳变,如果对上电电平有严格要求,就需要查看原厂资料里面的芯片手册,查看对应引脚的默认上电状态,选择满足需求的引脚使用。 |
|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )
GMT+8, 2025-1-15 06:33
Powered by Discuz! X3.4
© 2001-2013 Comsenz Inc.