龍芯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 將控制權交給...