This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux:读取 GPIO OE 寄存器时出现内核错误

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/571614/linux-kernel-error-while-reading-gpio-oe-register

工具/软件:Linux

你(们)好

将 UART3_RTS 引脚(G18、ZCZ)设置为低电平时遇到问题。 无论我做什么(更改设备树、使用公开的导出功能)、我都可以将其设置为零。 (可能是内部上拉?)

我即将编写一个内核模块来读取 OE 寄存器并手动设置寄存器。

以下是有问题的内核模块片段:

在安装内核模块时调用以下函数。

以下是 AM335X 在安装模块时的 Linux 输出:

定义 GPIO2_START_ADDR 0x481AC000
#define GPIO2_END_ADDR 0x481ACFFF
//#define GPIO2_SIZE (GPIO2_END_ADDR - GPIO2_START_ADDR)
#define GPIO2_SIZE 0xFFF

#define UART3_RTS   (1 << 31)

#define GPIO_OE             0x134
#define GPIO_SETDATAOUT      0x194
#define GPIO_CLEARDATAOUT   0x190

#define CU_MAJOR   42.
#define CU_GPIO"cucbasic   GPIO"

volatile void * GPIO_addr =空;
volatile unsigned int *GPIO_setdataout_addr = NULL;
volatile unsigned int *GPIO_cleardataout_addr =空;
volatile unsigned int *GPIO_OE_addr = NULL;


void set_output (void)

   //unsigned int reg;
   
   GPIO_OE_addr = GPIO_addr + GPIO_OE;
   GPIO_setdataout_addr = GPIO_addr + GPIO_SETDATAOUT;
   GPIO_cleardataout_addr = GPIO_addr + GPIO_CLEARDATAOUT;
   
   //reg =* GPIO_OE_addr;

   PR_INFO ("OE_Register:%x\n"、* GPIO_OE_addr);
   

静态 int GPIO_init (void)
{    
   Int RV;
   
   GPIO_addr = ioremap ((unsigned long) GPIO2_START_ADDR、GPIO2_SIZE);
   
   printk (Kern_info "虚拟地址= 0x%x\n"、(无符号 int) GPIO_addr);
   set_output();
   PR_INFO ("init done");
   RV = register_chrdev (CU_MAJOR、CU_GPIO、&FOPS);
      
   返回(RV);

root@LTG-db8:/opt# insmod GPIO_config.ko
[49.850289]  GPIO_config:加载树外模块会启用内核。
[49.859549]  虚拟地址= 0xfa1ac000
[86549.297]  Unhandled fault:0xfa1ac134上非线性获取(0x1028)上的外部中止
[49.865305]  PgD = dd5ac000
[49.865315]  [FA1ac134]* PgD=48011452 (坏)
[49.865331]  内部错误:1028 [#1]抢占 ARM
[49.865371]  中链接的模块:GPIO_CONFIG (O+) spidev ti_AM335x_adc PWM_tiehrpwm omap_rng rng_core SPI_OMAP2_mcspi evdev ti_AM335x_tscadc uio_pdrv_genirq uio cpufreq_dt
[49.865388]  CPU:0 PID:2153 Comm:insmod 被污染:G          O   4.8.6-RT5 #2
[49.865392]  硬件名称:通用 AM33XX (平展器件树)
[86549.398]  任务:dc068b00 task.stack:dd664000
[49.865429]  PC 处于 SET_OUTPUT +0x24/0x4c [GPIO_CONFIG]
[49.865433]  LR 位于0xfa1ac134
[49.865442]  PC:[ ]   LR:[ ]   PSR:60070013
[49.865442]  sp:dd665d78 ip:dd665d88 fp:dd665d84
[49.865447]  R10:bf04a400 R9:dd645a08 R8:bf04a448
[49.865453]  r7:00000000 R6:c0d02088 r5:bf04a1b4 r4:ffe000
[49.865458]  r3:fa1ac000 r2:bf04a600 r1:00000000 r0:bf04a2ac
[49.865466]  标志:   模式 SVC_32 ISA ARM 段无时 FIQ 上的 nZCv IRQ
[86549.473]  控制:10c5387d 表:9d5ac019 DAC:00000051
[49.865478]  工艺渗透(pid:2153、堆栈限制= 0xdd664210)
[49.865485]  堆栈:(0xdd665d78至0xdd666000)
[49.865494]  5d60:                                                      dd665d9c dd665d88
[49.865508]  5d80:bf04a1f4 bf04a044 bf04a1b4 c0d02088 dd665e1dd665da0 c01018e0 bf04a1c0
[49.865522]  5da0:dd665dfc dd665db0 c0206bfc c078ec8c dd665de4 dd665dc0 00000000 ffe000
[49.865536]  5dc0:dd645480 c021e7ec 00000001 462e8bcd dd645480 c023c508 dd645340 c01fccccccccccfcc.
[49.865550]  5de0:dd645340 00000000 00000001 00000002 dd645340 462e8bcd bf04a400 dd665f38
[49.865564]  5e00:dd645340 00000001 bf04a448 dd645a08 dd665e44 dd665e20 c01fcb38 c0101894
[49.865577]  5e20:dd645a00 00000001 dd665e44 00000001 dd665f38 dd645a00 dd665f14 dd665e48
[49.865591]  5e40:c01b0788 c01fcad8 bf04a40c 00007fff bf04a400 c01adff8 c080883c 00000000
[49.865605]  5e60:bf04a40c bf04a5c0 e091b5b4 00000000 c0808858 dd665f38 00001604 c0ae8bd0
[49.865619]  5e80:dd665ea4 462e8bcd dd61c840 dd665f2c 00000000 00000000 00000000 00000000
[49.865631]  5ea0:00000000 6e72656b 00006c65 00000000 00000000 00000000 00000000 00000000 00000000
[49.865644]  5ec0:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[49.865658]  5ee0:00000000 462e8bcd 7ffff c0d02088 00000000 00000003 7f621e80 7ffffff
[49.865671]  5f00:00000000 dd665fa4 dd665f18 c01b0ffc c01ae7f4 7fffff 00000000
[49.865685]  5f20:00000003 c078d6f0 dd665f74 e091a000 00001604 00000000 e091a000 00001604
[49.865699]  5f40:e091b2e4 e091b220 e091ae44 00000610 00000800 00000000 00000000 00000000
[49.865712]  5f60:00000664 00000012 00000013 0000000b 00000008 00000004 00000000 462e8bcd
[86549.726]  5f80:9d966d00 7f61dcdc b6efff10 0000017b c0109368 dd664000 00000000 dd665fa8
[49.865739]  5fa0:c0109160 c01b0f28 9d966d00 7f61dcdc 00000003 7f621e80 00000000 00000002
[86549.753]  5fc0:9d966d00 7f61dcdc b6efff10 0000017b 00000000 7f61dcdc 7f634000 00000000
[86549.767]  5fe0:bedb5c40 bedb5c30 7f6186c3 b6e7aa42 80070030 00000003 00000000 00000000
[49.865772]  回溯:
[49.865800]  [ ](SET_OUTPUT [GPIO_CONFIG])、来自[ ](cucbasic_gpio_init+0x40/0x88 [gpio_config])
[49.865828]  [ ](cucbasic_gpio_init [gpio_config])、从[ ](do_one _initcall+0x58/0x1a8)
[49.865851]  [ ](多个_initcall)、来自[ ](DO_INIT_MODULE+0x6c/0x3bc)
[49.865868]   R9:dd645a08 R8:bf04a448 r7:00000001 R6:dd645340 R5:dd665f38 R4:bf04a400
[49.865882][   ](DO_INIT_MODULE)从[ ](load_module+0x1fa0/0x2568)
[49.865892]   R6:dd645a00 R5:dd665f38 R4:00000001
[49.865903][   ](LOAD_MODULE)从[ ](SYS_FINIT_MODULE+0xe0/0x11c)
[86549.919]   R10:00000000 R9:00000000 R8:7ffffff r7:7f621e80 R6:00000003 R5:00000000
[49.865924]   R4:c0d02088
[49.865941]  [ ](sys_finIT_module)从[ ](RET_FAST_SYSCALL+0x0/0x44)
[49.865958]   R9:dd664000 R8:c0109368 r7:0000017b R6:b6efff10 R5:7f61dcdc R4:9d966d00
[86549.971]  代码:e59f2028 e59f0028 e5923000 e283ef4d (e5931134)
分割故障

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    这是哪个内核、您要修改哪个驱动程序? 此外、从 ZCZ 封装的名称来看、我想您使用的是 AM335x、对吧?
    您能否共享 DTS 文件以检查 GPIO 的 pinmux 设置?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    感谢您的回答。

    内核:4.8.5-RT5

    驱动程序:实际上只是一个已加载的内核模块、我想在其中修改 GPIO。 但代码可与 GPIO1端口配合使用(通过引脚1_27进行测试)

    我使用的是采用 ZCZ 封装的 AM335x。

    uart3_select (GPIO2_31)没有出现在器件树中、因为我有一个 RS485接口、我想手动将其设置为低电平或高电平(实际上想知道是否有实现的 RS485驱动器?)

    但也尝试通过 pinctrl-single、pins =<0x104 0x2F>或<0x104 0xF>将其设置为 GPIO 模式。

    我在互联网上读了一些提示、指出时钟可能未在 GPIO2端口上初始化?

    非常感谢您的参与

    设备树:

    包含的默认标头:

    #include "am33xx.dtsi"
    #include "AM335x-bone-common.dtsi"

    /*
     *版权所有(C) 2012德州仪器(TI)公司- http://www.ti.com/
     *
     *此程序是免费软件;您可以重新分发和/或修改
     *根据 GNU 通用公共许可证第2版的条款,如所示
     *由免费软件基金会发布。
     *
    /DTS-v1/;

    #include "am33xx.dtsi"
    #include "AM335x-bone-common.dtsi"
    /*#include "am335x-bone-common.dtsi"*
    #include "am33xx-overlay-edma-fix.dtsi"
    /*#include "AM335x-bone-JTAG.dtsi"*

    /{
       型号="TI AM335x Fox 电路板";
       兼容="ti、am335x-foxboard"、"ti、am335x-bone"、"ti、am33xx";
    };

    ldo3_reg{(&L)
       稳压器最小微伏=<1800000>;
       稳压器最大值微伏=<1800000>;
       稳压器常开;
    };

    mmc1{(&M)
       VMMC-SUPPLY =<&vmmcsd_fixed>;
       STATUS ="禁用";
    };

    mmc2{(&M)
       VMMC-SUPPLY =<&vmmcsd_fixed>;
       pinctrl-names ="default";
       pinctrl-0 =<&eMMC_PINs>;
       总线宽度=<8>;
       状态="正常";
    };

    am33xx_pinmux{(am33xx_pinmux)}
       pinctrl-names ="default";
       uart1_pins:uart1_pins{
          pinctrl-single、pins =<
          0x180 0x20 //* uart1_Rx *
          0x184 0x08 //* uart1_TX *
          >;
       };
       
       uart3_pins:uart3_pins{
       pinctrl-single、pins =<
          0x160 0x21 /* uart3_Rx *
          0x164 0x09 //* uart3_TX *
       >;
       };
       
       uart4_pins:uart4_pins{
       pinctrl-single、pins =<
          0x70 0xe /* uart4_Rx *
          0x74 0x36 /* uart4_TX *
       >;
       };
       
       i2c1_pins:i2c1_pins{
       pinctrl-single、pins =<
          0x16C 0x33 /* SCL */
          0x168 0x33 /* SDA */
       >;
       };
    };


    uart1{(&U)
       pinctrl-names ="default";
       pinctrl-0 =<uart1_PINs>;

       状态="正常";
    };

    uart3{(&U)
       pinctrl-names ="default";
       pinctrl-0 =<uart3_PINs>;

       状态="正常";
    };

    uart4{(&U)
       pinctrl-names ="default";
       pinctrl-0 =<uart4_PINs>;

       状态="正常";
    };

    i2c1{(&I)
       pinctrl-names ="default";
       pinctrl-0 =<&i2c1_PINs>;

       状态="正常";
       时钟频率=<100000 >;
    };

    /*文件结束*/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    [引用]实际上想知道是否有实施的 RS485驱动程序?
    查看以下主题中提供的链接:
    e2e.ti.com/.../571538

    它提供了 RS485的完整配置示例

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    至于时钟设置、您可以使用 devmem2工具在 CM_WKUPAON_GPIO1_CLKCTRL[1:0]MODULEMODE (物理地址0x4AE07838)中写入0x1。

    此致、
    Yordan