在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

全志T507 PF4引腳無(wú)法被正常設(shè)置為中斷模式的問(wèn)題分析

冬至子 ? 來(lái)源:丨budboool ? 作者:丨budboool ? 2023-11-24 17:42 ? 次閱讀

相關(guān)信息

硬件平臺(tái):全志T507
系統(tǒng)版本:Android 10 / Linux 4.9.170
問(wèn)題描述:PF4 無(wú)法通過(guò)標(biāo)準(zhǔn)接口設(shè)置為中斷模式,而 PF1、PF2、PF3、PF5 正常可用。

分析過(guò)程

一開(kāi)始以為是引腳被其它驅(qū)動(dòng)占用引起,或者該引腳不具備中斷功能,經(jīng)過(guò)排查,已排除這兩種可能,因此通過(guò)從源碼分析來(lái)找問(wèn)題的根因。

以下是以 gpio_keys.c 驅(qū)動(dòng)為入口進(jìn)行分析:

// drivers/input/keyboard/gpio_keys.c
static int gpio_keys_setup_key(struct platform_device *pdev,
                struct input_dev *input,
                struct gpio_button_data *bdata,
                const struct gpio_keys_button *button)
{
    ......
    error = devm_request_any_context_irq(&pdev- >dev, bdata- >irq,
                         isr, irqflags, desc, bdata);
}

// kernel/irq/devres.c
int devm_request_any_context_irq(struct device *dev, unsigned int irq,
                  irq_handler_t handler, unsigned long irqflags,
                  const char *devname, void *dev_id)
{
    ......
    rc = request_any_context_irq(irq, handler, irqflags, devname, dev_id);
    if (rc < 0) {
        devres_free(dr);
        return rc;
    }
    ......
    return rc;
}

// kernel/irq/manage.c
int request_any_context_irq(unsigned int irq, irq_handler_t handler,
                unsigned long flags, const char *name, void *dev_id)
{
    ......
    ret = request_irq(irq, handler, flags, name, dev_id);
    return !ret ? IRQC_IS_HARDIRQ : ret;
}

// include/linux/interrupt.h
static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
        const char *name, void *dev)
{
    return request_threaded_irq(irq, handler, NULL, flags, name, dev);
}

// kernel/irq/manage.c
int request_threaded_irq(unsigned int irq, irq_handler_t handler,
             irq_handler_t thread_fn, unsigned long irqflags,
             const char *devname, void *dev_id)
{
    ......
    chip_bus_lock(desc);
    retval = __setup_irq(irq, desc, action);
    chip_bus_sync_unlock(desc);
    ......
    return retval;
}

// kernel/irq/manage.c
static int __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
{
    ......

    if (!shared) {
        ret = irq_request_resources(desc);
        if (ret) {
            pr_err("Failed to request resources for %s (irq %d) on irqchip %sn",
                   new- >name, irq, desc- >irq_data.chip- >name);
            goto out_mask;
        }
        ......
    } 
    ......
}

// kernel/irq/manage.c
static int irq_request_resources(struct irq_desc *desc)
{
    struct irq_data *d = &desc- >irq_data;
    struct irq_chip *c = d- >chip;

    return c- >irq_request_resources ? c- >irq_request_resources(d) : 0;
}

// drivers/pinctrl/sunxi/pinctrl-sunxi.c
static struct irq_chip sunxi_pinctrl_edge_irq_chip = {
    .name        = "sunxi_pio_edge",
    .irq_ack    = sunxi_pinctrl_irq_ack,
    .irq_mask    = sunxi_pinctrl_irq_mask,
    .irq_unmask    = sunxi_pinctrl_irq_unmask,
    .irq_request_resources = sunxi_pinctrl_irq_request_resources,
    .irq_release_resources = sunxi_pinctrl_irq_release_resources,
    .irq_set_type    = sunxi_pinctrl_irq_set_type,
    .irq_set_wake    = sunxi_pinctrl_irq_set_wake,
};

// drivers/pinctrl/sunxi/pinctrl-sunxi.c
static int sunxi_pinctrl_irq_request_resources(struct irq_data *d)
{
    struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d);
    struct sunxi_desc_function *func;

    func = sunxi_pinctrl_desc_find_function_by_pin(pctl,
                    pctl- >irq_array[d- >hwirq], "irq");
    if (!func)
        return -EINVAL;

    /* Change muxing to INT mode */
    printk(KERN_EMERG"[lmx] irq:%d set int mode pin:%d d- >hwirq:%ld func- >muxval:%dn", d- >irq, pctl- >irq_array[d- >hwirq], d- >hwirq, func- >muxval);
    sunxi_pmx_set(pctl- >pctl_dev, pctl- >irq_array[d- >hwirq], func- >muxval);

    return 0;
}

// drivers/pinctrl/sunxi/pinctrl-sunxi.c
static void sunxi_pmx_set(struct pinctrl_dev *pctldev,
                 unsigned pin,
                 u8 config)
{
    struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
    unsigned long flags;
    u32 val, mask;

    raw_spin_lock_irqsave(&pctl- >lock, flags);
    pin -= pctl- >desc- >pin_base;
    val = readl(pctl- >membase + sunxi_mux_reg(pin));
    mask = MUX_PINS_MASK < < sunxi_mux_offset(pin);
    writel((val & ~mask) | config < < sunxi_mux_offset(pin),
        pctl- >membase + sunxi_mux_reg(pin));
    raw_spin_unlock_irqrestore(&pctl- >lock, flags);
}

無(wú)論有多復(fù)雜的代碼,最終都需要通過(guò)讀寫(xiě)寄存器的方式來(lái)實(shí)現(xiàn)控制芯片,而通過(guò)上述代碼分析,即可發(fā)現(xiàn) sunxi_pmx_set() 接口用于配置寄存器,是最底層的接口,可以通過(guò)打印輸出傳入的參數(shù),來(lái)檢查是否有問(wèn)題。

PF3 打印輸出為:

[   10.683205] [lmx] irq:148 set int mode pin:163 d- >hwirq:131 func- >muxval:6

PF4 打印輸出為:

[   10.683557] [lmx] irq:149 set int mode pin:196 d- >hwirq:132 func- >muxval:6

這里就能看出很奇怪的地方,PF3 的引腳編號(hào)是 163,而 PF4 卻是 196,跨度很大。

通過(guò)以下指令查詢(xún) PF4 的正確引腳編號(hào),也可以得知 196 引腳編號(hào)是哪一組:

mercury-demo:/ # cat /sys/kernel/debug/pinctrl/pio/pins
registered pins: 137
......
pin 160 (PF0)
pin 161 (PF1)
pin 162 (PF2)
pin 163 (PF3)
pin 164 (PF4)
pin 165 (PF5)
pin 166 (PF6)
......
pin 196 (PG4)
pin 197 (PG5)
......

確認(rèn) PF4 正確引腳編號(hào)是 164,而 196 對(duì)應(yīng)是 PG4,實(shí)際生效的是 PG4,通過(guò)以下指令即可確認(rèn):

mercury-demo:/sys/kernel/debug/sunxi_pinctrl # echo PG4 > sunxi_pin
mercury-demo:/sys/kernel/debug/sunxi_pinctrl # cat *
pin[PG4] data: 1
pio
pin[PG4] dlevel: 1
pin[PG4] funciton: 6
NOMATCH
pin[PG4] pull: 1
PG4
pin[PG4] funciton: 6
pin[PG4] data: 1
pin[PG4] dlevel: 1
pin[PG4] pull: 1

根據(jù)代碼確定引腳編號(hào)來(lái)源于 pctl->irq_array 數(shù)組,通過(guò) pctl->irq_array 賦值的地方進(jìn)行打印輸出,是否一開(kāi)始就出錯(cuò)了:

// drivers/pinctrl/sunxi/pinctrl-sunxi.c
static int sunxi_pinctrl_build_state(struct platform_device *pdev)
{
    ......
    /* Count functions associated groups */
    for (i = 0; i  pctl- >desc- >npins; i++) {
        const struct sunxi_desc_pin *pin = pctl- >desc- >pins + i;
        struct sunxi_desc_function *func = pin- >functions;
        while (func- >name) {
            /* Create interrupt mapping while we're at it */
            if (!strcmp(func- >name, "irq")) {
                int irqnum = func- >irqnum + func- >irqbank * IRQ_PER_BANK;
                pctl- >irq_array[irqnum] = pin- >pin.number;
                printk(KERN_EMERG"[lmx] pctl- >irq_array[%d] = %d   (func- >irqnum:%d func- >irqbank:%d)n", irqnum, pin- >pin.number, func- >irqnum, func- >irqbank);
            }
            sunxi_pinctrl_add_function(pctl, func- >name);
            func++;
        }
    }
    ......
    return 0;
}
// drivers/pinctrl/sunxi/pinctrl-sunxi.h
#define IRQ_PER_BANK        32

1.png

可以發(fā)現(xiàn),PF4(164)對(duì)應(yīng)的索引是 132,原本被正確賦值為 164,但又被覆蓋為 PG4(196)。
不難發(fā)現(xiàn),出現(xiàn)覆蓋的原因是因?yàn)?PG4 的 func->irqbank 數(shù)值錯(cuò)誤(4),導(dǎo)致索引下標(biāo)計(jì)算錯(cuò)誤。

根據(jù)前后文來(lái)看,func->irqbank 的正確數(shù)值應(yīng)該是 5,代入計(jì)算得到正確的值 164:
int irqnum(164) = func->irqnum(4) + func->irqbank(5) * IRQ_PER_BANK(32);

大概率硬件資源描述配置出錯(cuò),通過(guò)搜索 irqbank 被賦值的方法,來(lái)定位描述配置出錯(cuò)的地方:

// drivers/pinctrl/sunxi/pinctrl-sunxi.h
#define SUNXI_FUNCTION_IRQ_BANK(_val, _bank, _irq)        
    {                            
        .name = "irq",                    
        .muxval = _val,                    
        .irqbank = _bank,                
        .irqnum = _irq,                    
    }

使用的是 SUNXI_FUNCTION_IRQ_BANK 宏,重點(diǎn)檢查第二個(gè)參數(shù):

//    drivers/pinctrl/sunxi/pinctrl-sun50iw9p1.c
static const struct sunxi_desc_pin sun50iw9p1_pins[] = {
    ......
    SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3),
        SUNXI_FUNCTION(0x0, "gpio_in"),
        SUNXI_FUNCTION(0x1, "gpio_out"),
        SUNXI_FUNCTION(0x2, "sdc1"),        /* D1 */
        SUNXI_FUNCTION_IRQ_BANK(0x6, 5, 3),  /*  PG_EINT3    */
        SUNXI_FUNCTION(0x7, "io_disabled")),
    SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4),
        SUNXI_FUNCTION(0x0, "gpio_in"),
        SUNXI_FUNCTION(0x1, "gpio_out"),
        SUNXI_FUNCTION(0x2, "sdc1"),        /* D2 */
        // 可以發(fā)現(xiàn)第二個(gè)參數(shù)恰好是 4,根據(jù)分析結(jié)果,以及結(jié)合上下文,正確的應(yīng)該是 5
        SUNXI_FUNCTION_IRQ_BANK(0x6, 4, 4),  /*  PG_EINT4    */
        SUNXI_FUNCTION(0x7, "io_disabled")),
    SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5),
        SUNXI_FUNCTION(0x0, "gpio_in"),
        SUNXI_FUNCTION(0x1, "gpio_out"),
        SUNXI_FUNCTION(0x2, "sdc1"),        /* D3 */
        SUNXI_FUNCTION_IRQ_BANK(0x6, 5, 5),  /*  PG_EINT5    */
        SUNXI_FUNCTION(0x7, "io_disabled")),
    ......
};

修改之后的 pctl->irq_array 打印輸出正確:

2.png

進(jìn)行實(shí)測(cè),PF4 已經(jīng)可以正常的被設(shè)置為中斷模式。

問(wèn)題總結(jié)

全志原廠提供的 SoCs pinctrl driver 中的 PG4 中斷信息描述錯(cuò)誤,導(dǎo)致覆蓋了 PF4 的引腳編號(hào),因此只要修正 PG4 的描述信息,即可解決問(wèn)題。

這個(gè)問(wèn)題不僅僅會(huì)影響 PF4 無(wú)法使用,也會(huì)影響 PG4 引腳無(wú)法使用,從代碼來(lái)看,想要設(shè)置為 PG4 為中斷模式,實(shí)際修改的會(huì) PA0(0)。

--- a/longan/kernel/linux-4.9/drivers/pinctrl/sunxi/pinctrl-sun50iw9p1.c
+++ b/longan/kernel/linux-4.9/drivers/pinctrl/sunxi/pinctrl-sun50iw9p1.c
@@ -693,7 +693,7 @@
                SUNXI_FUNCTION(0x0, "gpio_in"),
                SUNXI_FUNCTION(0x1, "gpio_out"),
                SUNXI_FUNCTION(0x2, "sdc1"),            /* D2 */
-               SUNXI_FUNCTION_IRQ_BANK(0x6, 4, 4),  /*  PG_EINT4       */
+               SUNXI_FUNCTION_IRQ_BANK(0x6, 5, 4),  /*  PG_EINT4       */
                SUNXI_FUNCTION(0x7, "io_disabled")),
        SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5),
                SUNXI_FUNCTION(0x0, "gpio_in"),
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)器
    +關(guān)注

    關(guān)注

    54

    文章

    8481

    瀏覽量

    148600
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5401

    瀏覽量

    122803
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    601

    瀏覽量

    28171
  • IRQ
    IRQ
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    10968
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    T507-C核心板引腳功能修改指引

    飛凌T507-C核心板CPU四核Cortex-A53,1.5GHz主頻;GPUG31 MP2;核心板集成2GB DDR3 RAM,8
    發(fā)表于 12-09 09:04

    T507操作小技巧連載1-T507屏幕切換的兩種方式

    、Android、Ubuntu*操作系統(tǒng),適用于車(chē)載電子、電力、醫(yī)療、工業(yè)控制、物聯(lián)網(wǎng)、智能終端等領(lǐng)域。本文不再對(duì)硬件參數(shù)進(jìn)行敘述,在參考本文進(jìn)行軟件開(kāi)發(fā)前請(qǐng)閱讀飛凌嵌入式提供的T507用戶手冊(cè) ,路徑
    發(fā)表于 01-14 11:26

    硬件調(diào)試筆記--T507電源防漏電設(shè)計(jì)

    TLV809ED29DBZR的2引腳會(huì)輸出低電平導(dǎo)致Q1關(guān)閉,F(xiàn)DS4435因?yàn)?b class='flag-5'>4引腳電平高,所以FDS4435管子關(guān)閉不輸出電壓而達(dá)到斷電的目的,如圖下圖所示:方法2:參考以下圖,
    發(fā)表于 03-23 16:47

    分析筆記】 T507 PF4 引腳無(wú)法正常設(shè)置中斷模式的問(wèn)題分析

    相關(guān)信息 硬件平臺(tái):T507 系統(tǒng)版本:Android 10/ Linux 4.9.170 問(wèn)題描述:PF4 無(wú)法通過(guò)標(biāo)準(zhǔn)接口
    發(fā)表于 11-24 10:57

    T507開(kāi)發(fā)板以太網(wǎng)配置方法

    本文硬件平臺(tái)采用T507四核車(chē)規(guī)級(jí)處理器設(shè)計(jì)開(kāi)發(fā)板,本文講解T507開(kāi)發(fā)板以太網(wǎng)配置方法。其它板卡設(shè)置略有不同,請(qǐng)參考使用。
    發(fā)表于 06-29 11:10 ?1092次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T507</b>開(kāi)發(fā)板以太網(wǎng)配置方法

    T507實(shí)現(xiàn)SPI轉(zhuǎn)CAN 全過(guò)程的詳細(xì)講解

    T507處理器本身不支持CAN功能,那有什么方法可以實(shí)現(xiàn)CAN功能呢? 我們已知FETT507-C核心板是支持SPI接口的,但底板沒(méi)有引出該接口,所以小編打算通過(guò)
    發(fā)表于 01-19 11:38 ?2181次閱讀

    詳解T507實(shí)現(xiàn)SPI轉(zhuǎn)CAN功能

      ?T507處理器本身不支持CAN功能,那有什么方法可以實(shí)現(xiàn)CAN功能呢?
    發(fā)表于 02-10 14:53 ?1391次閱讀
    詳解<b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T507</b>實(shí)現(xiàn)SPI轉(zhuǎn)CAN功能

    T507核心板常見(jiàn)問(wèn)題解析

    本文硬件平臺(tái)采用T507四核車(chē)規(guī)級(jí)處理器設(shè)計(jì)核心板,本文整理在使用飛凌嵌入式T507產(chǎn)品過(guò)程種,常常碰到的幾個(gè)問(wèn)題,其它板卡設(shè)置,請(qǐng)參考
    發(fā)表于 03-18 16:41 ?1178次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T507</b>核心板常見(jiàn)問(wèn)題解析

    T507處理器如何實(shí)現(xiàn)SPI轉(zhuǎn)CAN功能

    T507處理器本身不支持CAN功能,那有什么方法可以實(shí)現(xiàn)CAN功能呢?
    的頭像 發(fā)表于 04-15 10:06 ?2817次閱讀

    T507平臺(tái),應(yīng)用于運(yùn)動(dòng)控制行業(yè)

    快來(lái)戳,快來(lái)戳, 天嵌科技的T507平臺(tái) 專(zhuān)為運(yùn)動(dòng)控制類(lèi)行業(yè)打造的合適Arm 平臺(tái) T507 平臺(tái)國(guó)產(chǎn)4核A53工業(yè)級(jí)平臺(tái),支持 Liu
    的頭像 發(fā)表于 12-05 17:25 ?1357次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T507</b>平臺(tái),應(yīng)用于運(yùn)動(dòng)控制行業(yè)

    方案 | 基于T507核心板設(shè)計(jì)電子AI后視鏡

    電子AI后視鏡終端產(chǎn)品可借助飛凌FETT507-C核心板實(shí)現(xiàn),該核心板基于T507四核車(chē)規(guī)級(jí)處理器設(shè)計(jì)開(kāi)發(fā),并且通過(guò)了汽車(chē)AEC-Q100測(cè)試,且FETT
    的頭像 發(fā)表于 08-31 18:37 ?1335次閱讀
    方案 | 基于<b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T507</b>核心板設(shè)計(jì)電子AI后視鏡

    T3(A40I)/T5(T507)性能對(duì)比,一代更比一代強(qiáng)

    T3(A40I)/T5(T507)性能對(duì)比
    的頭像 發(fā)表于 05-27 15:47 ?9471次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T</b>3(A40I)/<b class='flag-5'>T</b>5(<b class='flag-5'>T507</b>)性能對(duì)比,一代更比一代強(qiáng)

    T507操作小技巧連載2-T507以太網(wǎng)配置方法

    本文硬件平臺(tái)采用T507四核車(chē)規(guī)級(jí)處理器設(shè)計(jì)開(kāi)發(fā)板,本文講解T507開(kāi)發(fā)板以太網(wǎng)配置方法。其它板卡設(shè)置略有不同,請(qǐng)參考使用。 一、
    的頭像 發(fā)表于 08-31 19:19 ?3069次閱讀
    <b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T507</b>操作小技巧連載2-<b class='flag-5'>T507</b>以太網(wǎng)配置方法

    T507|T507核心板價(jià)格|芯片參數(shù)配置|資料|原理圖|性能|功耗-飛凌

    T5系列是一個(gè)高性能四核CortexTM?– A53處理器,適用于新一代汽車(chē)市場(chǎng)。T507系列符合汽車(chē)AEC – Q100測(cè)試要求。T507
    的頭像 發(fā)表于 11-10 17:02 ?2.2w次閱讀
    <b class='flag-5'>T507</b>|<b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T507</b>核心板價(jià)格|芯片參數(shù)配置|資料|原理圖|性能|功耗-飛凌

    T507-T507核心板常見(jiàn)問(wèn)題解析-飛凌嵌入式T507核心板

    本文硬件平臺(tái)采用T507四核車(chē)規(guī)級(jí)處理器設(shè)計(jì)核心板,本文整理在使用飛凌嵌入式T507產(chǎn)品過(guò)程種,常常碰到的幾個(gè)問(wèn)題,其它T507板卡
    的頭像 發(fā)表于 10-28 17:54 ?2365次閱讀
    <b class='flag-5'>T507</b>-<b class='flag-5'>全</b><b class='flag-5'>志</b><b class='flag-5'>T507</b>核心板常見(jiàn)問(wèn)題解析-飛凌嵌入式<b class='flag-5'>T507</b>核心板
    主站蜘蛛池模板: 午夜.dj高清在线观看免费8 | 天堂网www天堂在线网 | 亚洲综合区图片小说区 | 97影院午夜午夜伦不卡 | 三级精品| 天天干天天操天天添 | 伊人草| 丁香花在线电影小说观看 | 日日草夜夜草 | 一级毛片a | 成人欧美一区二区三区白人 | 国产欧美日韩综合精品无毒 | 欧美午夜电影 | 亚洲成av人片在线观看无码 | 日韩啪啪电影 | 天天天干干干 | 免费午夜视频在线观看 | 午夜神马福利 | 中国一级特黄真人毛片 | 四虎在线最新地址4hu | 婷婷午夜影院 | 日本理论在线 | 丁香婷婷视频 | 中文字幕在线观看日剧网 | 中国又粗又大又爽的毛片 | 成 人 免 费 黄 色 | 黄色精品视频 | 成人午夜大片免费看爽爽爽 | 优优国产在线视频 | 国模在线视频一区二区三区 | 狠狠干综合 | 国产激情视频一区二区三区 | 久青草视频免费视频播放线路1 | 欧美四虎影院 | 看真人一级毛片 | www.天天操 | 久久久久久免费播放一级毛片 | 在线天堂网www资源种子 | 久久久夜 | 欧美性黑人极品1819hd | 福利一区在线观看 |