龍芯 LS2K GPIO中斷配置

2021-09-24 00:08:52 字數 4036 閱讀 8593

龍芯2k1000有60個gpio引腳,gpio 引腳與中斷引腳的對應關係如下:

表 1-1 ls2k1000 gpio中斷
gpio 引腳

中斷引腳

中斷號說明

gpio0

gpio_int0

68專用 gpio 引腳,與中斷引腳一一對應

gpio1

gpio_int1

69專用 gpio 引腳,與中斷引腳一一對應

gpio2

gpio_int2

70專用 gpio 引腳,與中斷引腳一一對應

gpio3

gpio_int3

71專用 gpio 引腳,與中斷引腳一一對應

gpio[31:04]

gpio_int_lo

66gpio4~31 復用中斷引腳 gpio_int_lo

gpio[63:32]

gpio_int_hi

67gpio32~63 復用中斷引腳 gpio_int_hi

備註:共享中斷的gpio只支援電平觸發模式。gpio的乙個共享中斷號裡有兩個以上gpio時,此時只支援高電平觸發模式

表 1-2 gpio中斷相關暫存器
暫存器

位址描述

intpol_1

0x1fe11470

中斷極性控制:1 代表低電平,0 代表高電平

intedge_1

0x1fe11474

觸發方式暫存器(1:脈衝觸發;0:電平觸發)

intenset_1

0x1fe11468

設定中斷使能暫存器

gpio0_inten

0x1fe10530

63:0中斷使能位,每一位對應一gpio引腳

暫存器intpol_1、intedge_1、intenset_1 第26~31位對應gpio中斷引腳:

第26、27位分別對應:gpio_int_lo、gpio_int_hi

第28~31位分別對應:gpio_int0、gpio_int1、gpio_int2、gpio_int3

以設定gpio0中斷為例:

第一種模式:下降沿觸發中斷

1、gpio0設定為輸入模式

2、配置gpio0觸發型別為下降沿觸發

暫存器intpol_1第28位置1

暫存器intedge_1第28位置1

3、使能gpio0中斷

暫存器gpio0_inten 第0位置1

第二種模式:上公升沿觸發中斷

1、gpio0設定為輸入模式

2、配置gpio0觸發型別為上公升沿觸發

暫存器intpol_1第28位置0

暫存器intedge_1第28位置1

3、使能gpio0中斷

暫存器gpio0_inten 第0位置1

第三種模式:低電平觸發中斷

1、gpio0設定為輸入模式

2、配置gpio0觸發型別為低電平觸發

暫存器intpol_1第28位置1

暫存器intedge_1第28位置0

3、使能gpio0中斷

暫存器gpio0_inten 第0位置1

第四種模式:高電平觸發中斷

1、gpio0設定為輸入模式

2、配置gpio0觸發型別為高電平觸發

暫存器intpol_1第28位置0

暫存器intedge_1第28位置0

3、使能gpio0中斷

暫存器gpio0_inten 第0位置1

#include #include #include #include #include #include #include #include #include #include #include #include static int gpio_num = 60;

module_param(gpio_num, int, s_irugo);

struct ls2k_gpio_info

;struct ls2k_gpio_info ls2k_gpio_irq;

#define gpio_int_enable 0x1fe10530

#define int_pol 0x1fe11470

#define int_edge 0x1fe11474

static int ls2k_gpio_info(struct ls2k_gpio_info *dev, int gpio, int flags)

else if(date->gpio < 32) else

date->irq_flags = flags;

sprintf(date->name, "gpio%d",date->gpio);

printk("text %s irq:%d\n",date->name,date->irq);

if(irqf_trigger_rising & date->irq_flags) else if(irqf_trigger_falling & date->irq_flags) else if(irqf_trigger_high & date->irq_flags) else if(irqf_trigger_low & date->irq_flags) else

ls2k_writel(ls2k_readl(gpio_int_enable + date->gpio/32*4) | (1 << date->gpio%32), gpio_int_enable + date->gpio/32*4); //int enable

return 0;

}static irqreturn_t gpio_handler(int irq, void *dev)

else if(p->irq_flags & irqf_trigger_low) else

} printk("%s\n",p->name);

return irq_handled;

}static int __init ls2k_gpio_irq_init(void)

error = gpio_direction_input(gpio_num);

if (error < 0)

if(gpio_num < 4) else

error = ls2k_gpio_info(&ls2k_gpio_irq, gpio_num, irq_flags);

if (error < 0)

error = request_irq(ls2k_gpio_irq.irq, gpio_handler, irq_flags, ls2k_gpio_irq.name,&ls2k_gpio_irq);

if (error)

return 0;

fail2:

free_irq(ls2k_gpio_irq.irq,&ls2k_gpio_irq);

ls2k_writel(ls2k_readl(gpio_int_enable + ls2k_gpio_irq.gpio/32*4) & ~(1 << ls2k_gpio_irq.gpio%32), gpio_int_enable + ls2k_gpio_irq.gpio/32*4); //int disable

fail1:

gpio_free(ls2k_gpio_irq.gpio);

return error;

}static void __exit ls2k_gpio_irq_exit(void)

module_init(ls2k_gpio_irq_init);

module_exit(ls2k_gpio_irq_exit);

module_license("gpl");

module_author("loongson ");

module_description("ls2k gpio irq");

module_alias("ls2k");

核心版本3.10

詳情請看 ls2k 使用者書冊

龍芯軟體開發 12 龍芯2E摸索前行

上一次說到怎麼樣執行起來,現在接著上次再進行分析下去。在 locate的程式,如下 locate la s0,start subu s0,ra,s0 ands0,0xffff0000 li t0,sr boot exc vec mtc0 t0,cop 0 status reg mtc0 zero,c...

龍芯2k除錯記錄

記 搞到了一塊龍芯的2k的板子,然後開始寫elf,隨即除錯電腦藍屏,重啟,又藍屏數十次。錯誤記錄 軟體問題 除錯時採用的是putty,隨即發生藍屏,因此更換成了sscom32,同時串列埠也不停傳送rx接收控制代碼 除錯資訊 傳送速率過快,但未導致電腦宕機,初步判定電腦宕機為putty軟體問題。硬體問...

關閉龍芯2E 之 cache

發表日期 2006 11 01 19 50 pmon 載入kernel 時,是載入到 kseg0 的 通過在 arch mips makefile 中 load config godsonev2e 0x80100000 指定 該位址空間是 unmaped cached 的,當 pmon 將控制權交給...