Chinaunix首页 | 论坛 | 博客
  • 博客访问: 376656
  • 博文数量: 214
  • 博客积分: 770
  • 博客等级: 军士长
  • 技术积分: 1969
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-08 01:22
文章分类

全部博文(214)

文章存档

2013年(110)

2012年(104)

我的朋友

分类: LINUX

2012-12-24 14:42:22

以s3c2410为例熟悉arm linux下gpio相关定义及操作方式:
1中断及端口定义
在linux2.6.35中ARM中断号定义在arch/arm/mach-s3c2410/include/mach/irqs.h(部分如下)

点击(此处)折叠或打开

  1. #define S3C2410_CPUIRQ_OFFSET     (16)

  2. #define S3C2410_IRQ(x) ((x) + S3C2410_CPUIRQ_OFFSET)

  3. /* main cpu interrupts */
  4. #define IRQ_EINT0 S3C2410_IRQ(0)     /* 16 */
  5. #define IRQ_EINT1 S3C2410_IRQ(1)
  6. #define IRQ_EINT2 S3C2410_IRQ(2)
  7. #define IRQ_EINT3 S3C2410_IRQ(3)
  8. #define IRQ_EINT4t7 S3C2410_IRQ(4)     /* 20 */
  9. #define IRQ_EINT8t23 S3C2410_IRQ(5)
  10. #define IRQ_RESERVED6 S3C2410_IRQ(6)     /* for s3c2410 */
  11. #define IRQ_BATT_FLT S3C2410_IRQ(7)
  12. #define IRQ_TICK   S3C2410_IRQ(8)     /* 24 */
  13. #define IRQ_TIMER0 S3C2410_IRQ(10)
  14. #define IRQ_TIMER1 S3C2410_IRQ(11)
  15. #define IRQ_TIMER2 S3C2410_IRQ(12)
  16. #define IRQ_TIMER3 S3C2410_IRQ(13)
  17. #define IRQ_TIMER4 S3C2410_IRQ(14)
  18. #define IRQ_UART2 S3C2410_IRQ(15)
  19. #define IRQ_LCD     S3C2410_IRQ(16)     /* 32 */
  20. #define IRQ_DMA1 S3C2410_IRQ(18)
  21. #define IRQ_DMA2 S3C2410_IRQ(19)
  22. #define IRQ_DMA3 S3C2410_IRQ(20)
  23. #define IRQ_SDI     S3C2410_IRQ(21)
  24. #define IRQ_SPI0 S3C2410_IRQ(22)
  25. #define IRQ_UART1 S3C2410_IRQ(23)
  26. #define IRQ_RESERVED24 S3C2410_IRQ(24)     /* 40 */
  27. #define IRQ_USBD S3C2410_IRQ(25)
  28. #define IRQ_USBH S3C2410_IRQ(26)
  29. #define IRQ_IIC     S3C2410_IRQ(27)
  30. #define IRQ_UART0 S3C2410_IRQ(28)     /* 44 */
  31. #define IRQ_SPI1 S3C2410_IRQ(29)
  32. #define IRQ_RTC     S3C2410_IRQ(30)
  33. #define IRQ_ADCPARENT S3C2410_IRQ(31)

  34. /* interrupts generated from the external interrupts sources */
  35. #define IRQ_EINT4 S3C2410_IRQ(32)     /* 48 */
  36. #define IRQ_EINT5 S3C2410_IRQ(33)
  37. #define IRQ_EINT6 S3C2410_IRQ(34)
  38. #define IRQ_EINT7 S3C2410_IRQ(35)
  39. #define IRQ_EINT8 S3C2410_IRQ(36)
  40. #define IRQ_EINT9 S3C2410_IRQ(37)
  41. #define IRQ_EINT10 S3C2410_IRQ(38)
  42. #define IRQ_EINT11 S3C2410_IRQ(39)
  43. #define IRQ_EINT12 S3C2410_IRQ(40)
  44. #define IRQ_EINT13 S3C2410_IRQ(41)
  45. #define IRQ_EINT14 S3C2410_IRQ(42)
  46. #define IRQ_EINT15 S3C2410_IRQ(43)
  47. #define IRQ_EINT16 S3C2410_IRQ(44)
  48. #define IRQ_EINT17 S3C2410_IRQ(45)
  49. #define IRQ_EINT18 S3C2410_IRQ(46)
  50. #define IRQ_EINT19 S3C2410_IRQ(47)
  51. #define IRQ_EINT20 S3C2410_IRQ(48)     /* 64 */
  52. #define IRQ_EINT21 S3C2410_IRQ(49)
  53. #define IRQ_EINT22 S3C2410_IRQ(50)
  54. #define IRQ_EINT23 S3C2410_IRQ(51)

  55. #define IRQ_EINT_BIT(x)    ((x) - IRQ_EINT4 + 4)
  56. #define IRQ_EINT(x) (((x) >= 4) ? (IRQ_EINT4 + (x) - 4) : (IRQ_EINT0 + (x)))

  57. #define IRQ_LCD_FIFO S3C2410_IRQ(52)
  58. #define IRQ_LCD_FRAME S3C2410_IRQ(53)

  59. /* IRQs for the interal UARTs, and ADC
  60.  * these need to be ordered in number of appearance in the
  61.  * SUBSRC mask register
  62. */

  63. #define S3C2410_IRQSUB(x)    S3C2410_IRQ((x)+54)

  64. #define IRQ_S3CUART_RX0        S3C2410_IRQSUB(0)    /* 70 */
  65. #define IRQ_S3CUART_TX0        S3C2410_IRQSUB(1)
  66. #define IRQ_S3CUART_ERR0    S3C2410_IRQSUB(2)

  67. #define IRQ_S3CUART_RX1        S3C2410_IRQSUB(3)    /* 73 */
  68. #define IRQ_S3CUART_TX1        S3C2410_IRQSUB(4)
  69. #define IRQ_S3CUART_ERR1    S3C2410_IRQSUB(5)

  70. #define IRQ_S3CUART_RX2        S3C2410_IRQSUB(6)    /* 76 */
  71. #define IRQ_S3CUART_TX2        S3C2410_IRQSUB(7)
  72. #define IRQ_S3CUART_ERR2    S3C2410_IRQSUB(8)

  73. #define IRQ_TC            S3C2410_IRQSUB(9)
  74. #define IRQ_ADC            S3C2410_IRQSUB(10)

对应的GPIO名在arch/arm/mach-s3c2410/include/mach/regs-gpio.h定义(部分如下)

点击(此处)折叠或打开

  1. #define S3C2410_GPIO_LEAVE (0xFFFFFFFF)
  2. #define S3C2410_GPIO_INPUT (0xFFFFFFF0)    /* not available on A */
  3. #define S3C2410_GPIO_OUTPUT (0xFFFFFFF1)
  4. #define S3C2410_GPIO_IRQ (0xFFFFFFF2)    /* not available for all */
  5. #define S3C2410_GPIO_SFN2 (0xFFFFFFF2)    /* bank A => addr/cs/nand */
  6. #define S3C2410_GPIO_SFN3 (0xFFFFFFF3)    /* not available on A */
  7. #define S3C2410_GPIOREG(x) ((x) + S3C24XX_VA_GPIO)
  8. #define S3C2410_GPACON     S3C2410_GPIOREG(0x00)
  9. #define S3C2410_GPADAT     S3C2410_GPIOREG(0x04)
  10. #define S3C2410_GPA0_ADDR0 (1<<0)

  11. #define S3C2410_GPA1_ADDR16 (1<<1)

  12. #define S3C2410_GPA2_ADDR17 (1<<2)

  13. #define S3C2410_GPA3_ADDR18 (1<<3)

  14. #define S3C2410_GPA4_ADDR19 (1<<4)

  15. #define S3C2410_GPA5_ADDR20 (1<<5)

  16. #define S3C2410_GPA6_ADDR21 (1<<6)

  17. #define S3C2410_GPA7_ADDR22 (1<<7)

  18. #define S3C2410_GPA8_ADDR23 (1<<8)

  19. #define S3C2410_GPA9_ADDR24 (1<<9)

  20. #define S3C2410_GPA10_ADDR25 (1<<10)

  21. #define S3C2410_GPBCON     S3C2410_GPIOREG(0x10)
  22. #define S3C2410_GPBDAT     S3C2410_GPIOREG(0x14)
  23. #define S3C2410_GPBUP     S3C2410_GPIOREG(0x18)
  24. #define S3C2410_GPCCON     S3C2410_GPIOREG(0x20)
  25. #define S3C2410_GPCDAT     S3C2410_GPIOREG(0x24)
  26. #define S3C2410_GPCUP     S3C2410_GPIOREG(0x28)

2端口功能的设置
s3c2410_gpio_cfgpin(S3C2410_GPG2, S3C2410_GPG2_EINT10);//配置gpg2端口为中断10功能
s3c2410_gpio_pullup(S3C2410_GPG2, 0);//上拉电阻
3中断触发方式设置
如:set_irq_type(IRQ_EINT10,IRQ_TYPE_EDGE_RISING );
在linux-2.6.35\linux-2.6.35\include\linux\irq.h:中定义了中断的触发方式以及中断发现后的标志
其中触发方式定义如下

点击(此处)折叠或打开

  1. #define IRQ_TYPE_NONE        0x00000000    /* Default, unspecified type */
  2. #define IRQ_TYPE_EDGE_RISING    0x00000001    /* Edge rising type */
  3. #define IRQ_TYPE_EDGE_FALLING    0x00000002    /* Edge falling type */
  4. #define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
  5. #define IRQ_TYPE_LEVEL_HIGH    0x00000004    /* Level high type */
  6. #define IRQ_TYPE_LEVEL_LOW    0x00000008    /* Level low type */
  7. #define IRQ_TYPE_SENSE_MASK    0x0000000f    /* Mask of the above */
  8. #define IRQ_TYPE_PROBE        0x00000010    /* Probing in progress */

4.  在驱动程序中申请中断之前经常要先定义使用的io为中断功能,并设置好触发方式,申请中断,并自定义好中断处理程序。
如定义结构体:
static struct key_info
{
 int irq_no;  //中断号
 unsigned int gpio_port; //GPIO端口
 int key_no;  //键值
}key_info;

key_info  key_info_tab=
{
  IRQ_EINT10,
  S3C2410_GPG2,
  1
};
struct key_info *k;
k=key_info_tab;
if(request_irq(key_info_tab->irq_no,s3c2410_eint_handler,SA_INTERRUPT,DEVICE_NAME,i))
{return -1;}
其中s3c2410_eint_handler为申请的中段对应的处理函数,i是传入中断处理程序的参数。
5中断释放:模块使用完后处理

struct key_info *k;
k=key_info_tab;
free_irq(k->irq_no,NULL);
 
6使用举例

set_gpio_mode_user(k->gpio_port, GPIO_MODE_IN );//设置GPIO端口的使用模式

 /(GPIO_MODE_IN(输入)GPIO_MODE_OUT(输出)GPIO_MODE_ALT0(第三)GPIO_MODE_ALT1(第四功能)/

up = read_gpio_bit(k->gpio_port);//读取gpio端口的信号。

s3c2410_gpio_cfgpin(k->gpio_port, k->gpio_set);//初始化端口

set_irq_type( k->irq_no, IRQT_RISING );//设置中断触发方式。

 
阅读(727) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~