嵌入式Linux移植8.OK335xd,AM335x,GPIO移植,添加GPIO(按键,LED)

环境:

Windows10

vmware+Ubuntu12.04
OK335xd+am3354(forlinx家的板子)

DIY目标:

使用无线遥控一辆运行有Linux控制的小车,小车执行部件算总共2个电机,一个控制方向,一个控制动力,每个都需要实现正反转,所以需要4个IO配合4路继电器来实现(手头就这种硬件条件)

近日移植IO,操作目的是添加自己的按键,LED,也就是通用IO的输入输出,为了用于,但是文章局限于系统底层,未用应用程序测试,只用shell验证了一下GPIO添加成功,使用的是gpio的sysfs模式

坑点:

飞凌给的应用手册和官方论坛知识库中有GPIO的添加方法,但是是错的,不应该在board-am335xevm.c操作,而是在board-am335xevm-xd.c这个板级文件中修改,按照手册等试了1天多近两天没有任何结果,接近崩溃之际突然想起一个细节,将board-am335xevm.c删了也会编译通过,而且改了其中的按键名称运行完也不变,但是使用patch文件给board-am335xevm.c打补丁后程序运行出不同结果。。被这种假象干扰了好久,其实也是补丁修改了别的文件导致的变化。。。最终死马当活马医改了下board-am335xevm-xd.c。。。。。顿时通开。。。第二个巨坑

收获:

1.必须搞明白kernel编译的机制

2.必须熟悉各种常用指令echo ,cat ,patch等,,,之前一直以为遇到再学发现不行,很浪费时间最好先学一下

3.差不多搞明白了patch打包的流程

4.Linux调试和以前硬件调试思路很不同,细节很重要,得形成自己的调试思路

添加按键(输入IO)的步骤:

1.查看手册,原理图找到可以使用的通用IO

2.修改板级文件board-am335xevm-xd.c

/* pinmux for gpio based key */
static struct pinmux_config gpio_keys_pin_mux_forlinx[] = {
#if defined(CONFIG_OK335XD) 
    {"gpmc_a4.gpio1_20", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a5.gpio1_21", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a6.gpio1_22", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a7.gpio1_23", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a8.gpio1_24", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a9.gpio1_25", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

    {"gpmc_ad14.gpio1_14", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},//仿照上面添加自己的按键IO

 

static struct pinmux_config gpio_led_mux[] = {
#if defined(CONFIG_OK335XD)
    {"gpmc_a0.gpio1_16", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a1.gpio1_17", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a2.gpio1_18", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a3.gpio1_19", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},//添加自己的LEDIO
    {"emu1.gpio3_8", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

3.注释掉别的用我们添的IO的地方

4.保存,编译内核,重启板子运行内核

5.执行指令(引脚号不对应,随便举个例子)

注意:按键和LED的IO号注册需要满足条件


举个栗子(具体 GPIO 需要参考数据手册),如果使想用 GPIO1_20,那么引脚编号就可能等于 1 x 32 + 20 = 54

引脚读数计算方法
一般可以这样计算 GPIOn_IOx = n*32 + x

 

gpio1_14   按键控制步骤
echo 46 > /sys/class/gpio/export
cat /sys/kernel/debug/gpio
cat /sys/class/gpio/gpio46/value   / /此句的作用就是读取引脚的电平值,输出0或1

gpio1_15   LED控制步骤
echo 47 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio47/direction 
echo 1 > /sys/class/gpio/gpio47/value
echo 0 > /sys/class/gpio/gpio47/value  

附按键执行结果,LED的直接量电压就可以了

备注:虽然没用到,记录一下patch相关指令

patch -bp1 < xxx.patch  打补丁,要打补丁的文件放到一起到要打补丁文件

patch -p1 < xxx.patch     打补丁,可以针对文件夹打补丁

patch -Rp1 < xxx.patch  撤销补丁

注意事项,打补丁时原文件必须是补丁里规定的原版,不能手动改动原文件之后再打补丁或者撤销补丁

 

至此,Linux遥控小车的电机舵机齐了,下一步就是建立通信,移植一下串口通信

 

 


 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值