查看: 5289|回复: 7

[分享] 【经验分享】鼠标HID例程简析(上)

[复制链接]

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2014-9-15 11:18:45 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_ZP 于 2014-9-16 17:20 编辑

鼠标HID例程简析
   大家好,此文内容紧跟《FSL USB Stack 简介》一文,如果网友们先前没有浏览过《FSLUSB Stack 简介》,建议先下载浏览,然后再浏览本篇内容。本篇是以飞思卡尔的USB协议栈Freescale USB Stack v4.1.1中的鼠标HID例程为例,介绍USB Stack层式架构中的USB Application、HID Class Drivers 和 USB Drivers是如何各司其职,相互配合确保例程,本例程路径:<dir_stall>\USBFreescale USBStack v4.1.1\ Source\Device\app\hid\cw10\kinetis_l2k
1.   USBStack文件介绍
    图1为在CW10.6中打开的kinetis_l2k例程, 从中可看出,在USB Stack层式架构中,USB Application、HID ClassDrivers 和 USB Drivers都有属于本层的文件,表一则对各层的文件进行了归纳。
Untitled1.jpg
1 USB Stack 文件
表一
5.jpg
6.jpg
7.jpg
8.jpg
9.jpg
1.   鼠标HID例程代码
      主程序
  1. *****************************************************************************
  2. * This function initializes the system, enables the interrupts and calls the
  3. * application
  4. *****************************************************************************/
  5. #ifdef __GNUC__
  6. int main(void)
  7. #else
  8. void main(void)
  9. #endif
  10. {
  11.         /* Initialize the system */
  12.     SYS_Init(); //时钟配置:PEE模式,CORE_CLOCK、SYSTEM_CLOCK、BUS_CLOCK、FLASH_CLOCK为48MHz

  13. #ifdef SERIAL_DEBUG
  14.     sci_init();
  15. #endif
  16. #ifndef _SERIAL_AGENT_
  17.     /* Initialize USB module */
  18. #if HIGH_SPEED_DEVICE
  19.     USB_Init(ULPI);
  20. #else
  21.     USB_Init(MAX3353);//USB模块初始化
  22. #endif
  23. #else
  24.     SIM_SOPT2  |= (SIM_SOPT2_USBSRC_MASK | SIM_SOPT2_PLLFLLSEL_MASK);
  25. #endif
  26.     /* Initialize GPIO pins */
  27.     GPIO_Init(); //按键引脚初始化:PTA4、PTC3

  28. #if MAX_TIMER_OBJECTS
  29.     (void)TimerQInitialize(0);
  30. #endif
  31.    
  32.     /* Initialize the USB Test Application */
  33.     TestApp_Init();//鼠标HID应用运行开始,内含USB_Class_HID_Init()函数

  34.     while(TRUE)
  35.     {
  36.             Watchdog_Reset();
  37.             /* Call the application task */
  38.             TestApp_Task();//应用任务函数
  39.     }

  40. #ifdef __GNUC__
  41.     return 0;
  42. #endif
  43. }
复制代码
      pll_init()
      SYS_Init()函数中包含pll_init()函数用于配置PEE时钟模式和
各个时钟源的频率。
  1. static int pll_init()
  2. {
  3. #elif (defined MCU_MKL25Z4)   
  4.     /* Update system prescalers */
  5.     SIM_CLKDIV1  = SIM_CLKDIV1_OUTDIV4(1);
  6.     SIM_CLKDIV1 |= SIM_CLKDIV1_OUTDIV1(1);
  7.     /* First FEI must transition to FBE mode
  8.         Enable external oscillator, RANGE=02, HGO=, EREFS=, LP=, IRCS= */
  9.     MCG_C2 = MCG_C2_RANGE0(2) | MCG_C2_EREFS0_MASK | MCG_C2_IRCS_MASK;

  10.     /* Select external oscillator and Reference Divider and clear IREFS
  11.      * to start external oscillator
  12.      * CLKS = 2, FRDIV = 3, IREFS = 0, IRCLKEN = 0, IREFSTEN = 0
  13.      */
  14.     MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(3);
  15.    
  16.     /* MCG_C4: DMX32=0,DRST_DRS=0 */
  17.     MCG_C4 &= (uint8_t)~(uint8_t)0xE0U;
  18.    
  19.     /* MCG_C5: ??=0,PLLCLKEN=0,PLLSTEN=1,PRDIV=0x3, external clock reference = 8/4 = 2MHz */
  20.     MCG_C5 = (uint8_t)0x23U;
  21.    
  22.     /* MCG_C6: LOLIE=0,PLLS=0,CME=0,VDIV=0x18 */
  23.     MCG_C6 = (uint8_t)0x18U;
  24.    
  25.     while((MCG_S & MCG_S_IREFST_MASK) != 0x00U) { /* Check that the source of the FLL reference clock is the external reference clock. */
  26.     }
  27.    
  28.     while((MCG_S & 0x0CU) != 0x08U) {    /* Wait until external reference clock is selected as MCG output */
  29.     }
  30.    
  31.     /* Switch to PBE Mode */
  32.     /* MCG_C1: CLKS=2,FRDIV=3,IREFS=0,IRCLKEN=0,IREFSTEN=0 */
  33.     MCG_C1 = MCG_C1_CLKS(2) | MCG_C1_FRDIV(3);
  34.    
  35.     /* MCG_C2: ??=0,??=0,RANGE=2,HGO=0,EREFS=0,LP=0,IRCS=1 */
  36.     MCG_C2 = MCG_C2_RANGE0(2) | MCG_C2_EREFS0_MASK | MCG_C2_IRCS_MASK;
  37.    
  38.     /* MCG_C5: ??=0,PLLCLKEN=0,PLLSTEN=1,PRDIV=0x03 */
  39.     MCG_C5 = (uint8_t)0x23U;
  40.    
  41.     /* MCG_C6: LOLIE=0,PLLS=1,CME=0,VDIV=0x18 */
  42.     MCG_C6 = (uint8_t)0x58U;
  43.     while((MCG_S & 0x0CU) != 0x08U) {    /* Wait until external reference clock is selected as MCG output */
  44.     }
  45.     while((MCG_S & MCG_S_LOCK0_MASK) == 0x00U) { /* Wait until locked */
  46.     }
  47.     /* Switch to PEE Mode */
  48.     /* MCG_C1: CLKS=0,FRDIV=3,IREFS=0,IRCLKEN=0,IREFSTEN=0 */
  49.     MCG_C1 = (uint8_t)0x18U;
  50.    
  51.     /* MCG_C2: ??=0,??=0,RANGE=2,HGO=0,EREFS=0,LP=0,IRCS=1 */
  52.     MCG_C2 = MCG_C2_RANGE0(2) | MCG_C2_EREFS0_MASK | MCG_C2_IRCS_MASK;

  53.     /* MCG_C5: ??=0,PLLCLKEN=0,PLLSTEN=1,PRDIV=0x03 */
  54.     MCG_C5 = (uint8_t)0x23U;
  55.     /* MCG_C6: LOLIE=0,PLLS=1,CME=0,VDIV=0x18 */
  56.     MCG_C6 = (uint8_t)0x58U;
  57.     while((MCG_S & 0x0CU) != 0x0CU) {    /* Wait until output of the PLL is selected */
  58.     }
  59.     /* MCG_C6: CME=1 */
  60.     MCG_C6 |= (uint8_t)0x20U;            /* Enable the clock monitor */
  61.     /*** End of PE initialization code after reset ***/
  62.     return 0;
  63. /* end MCU_MKL25Z4 */
  64. }
复制代码
     USB_Init()
  1. static void USB_Init(uint_8 controller_ID)
  2. {
  3.         if(controller_ID == MAX3353)
  4.         {
  5. #ifdef MCU_MK70F12
  6.                 /* MPU is disabled. All accesses from all bus masters are allowed */
  7.                 MPU_CESR=0;

  8.                 SIM_SOPT2 |= SIM_SOPT2_PLLFLLSEL(1)         /** PLL0 reference */
  9.                                    | SIM_SOPT2_USBFSRC(0)                        /** MCGPLLCLK as CLKC source */
  10.                                   | SIM_SOPT2_USBF_CLKSEL_MASK;        /** USB fractional divider like USB reference clock */
  11.                 SIM_CLKDIV2 = USB_FRAC | USB_DIV;                /** Divide reference clock to obtain 48MHz */

  12.                 /* Enable USB-OTG IP clocking */
  13.                 SIM_SCGC4 |= SIM_SCGC4_USBFS_MASK;
  14. #else
  15.     #ifndef MCU_MKL25Z4
  16.                 SIM_CLKDIV2 &= (uint32_t)(~(SIM_CLKDIV2_USBFRAC_MASK | SIM_CLKDIV2_USBDIV_MASK));
  17.     #endif /* MCU_MKL25Z4 */
  18.     #ifdef MCGOUTCLK_72_MHZ
  19.                 /* Configure USBFRAC = 0, USBDIV = 0 => frq(USBout) = 2 / 3 * frq(PLLin) */
  20.                 SIM_CLKDIV2 = SIM_CLKDIV2_USBDIV(2) | SIM_CLKDIV2_USBFRAC_MASK;
  21.     #else
  22.         #ifndef MCU_MKL25Z4
  23.                 /* Configure USBFRAC = 0, USBDIV = 0 => frq(USBout) = 1 / 1 * frq(PLLin) */
  24.                 SIM_CLKDIV2 = SIM_CLKDIV2_USBDIV(0);
  25.         #endif /* MCU_MKL25Z4 */
  26.     #endif /* MCGOUTCLK_72_MHZ */

  27.                 /* 1. Configure USB to be clocked from PLL */
  28.                 SIM_SOPT2 |= SIM_SOPT2_USBSRC_MASK | SIM_SOPT2_PLLFLLSEL_MASK;

  29. #if PLL_96
  30.                 /* 2. USB freq divider */
  31.                 SIM_CLKDIV2 = 0x02;
  32. #endif /* PLL_96 */

  33.                 /* 3. Enable USB-OTG IP clocking */
  34.                 SIM_SCGC4 |= (SIM_SCGC4_USBOTG_MASK);      

  35.                 /* old documentation writes setting this bit is mandatory */
  36.                 USB0_USBTRC0 = 0x40;
  37.                
  38.                 /* Configure enable USB regulator for device */
  39. #if(defined MCU_MK20D5)               
  40.                 SIM_SOPT1CFG |= SIM_SOPT1CFG_URWE_MASK; /* Enable SOPT1 to be written */
  41. #endif               
  42.                 SIM_SOPT1 |= SIM_SOPT1_USBREGEN_MASK;
  43. }
  44. #endif
复制代码
    GPIO_Init()
  1. static void GPIO_Init()
  2. {   
  3. #if defined(MCU_MKL25Z4)  
  4.     /* Enable clock gating to PORTA, PORTB, PORTC, PORTD and PORTE */
  5.     SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
  6.               | SIM_SCGC5_PORTB_MASK
  7.               | SIM_SCGC5_PORTC_MASK
  8.               | SIM_SCGC5_PORTD_MASK
  9.               | SIM_SCGC5_PORTE_MASK);

  10.     /* LEDs settings */
  11.     PORTA_PCR5  =  PORT_PCR_MUX(1);
  12.     PORTA_PCR16 =  PORT_PCR_MUX(1);
  13.     PORTA_PCR17 =  PORT_PCR_MUX(1);
  14.     PORTB_PCR8  =  PORT_PCR_MUX(1);

  15.     GPIOA_PDDR |= (1<<5) | (1<<16) | (1<<17);
  16.     GPIOB_PDDR |= (1<<8);

  17.     /* Switch buttons settings */
  18.     /* Set input on PORTC pin 3 */
  19. #ifndef _USB_BATT_CHG_APP_H_
  20.     PORTC_PCR3 =  PORT_PCR_MUX(1);
  21.     GPIOC_PDDR &= ~((uint_32)1 << 3);
  22.     /* Pull up enabled */
  23.     PORTC_PCR3 |= PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;
  24.     /* GPIO_INT_EDGE_HIGH */
  25.     PORTC_PCR3 |= PORT_PCR_IRQC(9);

  26.     /* Set input on PORTA pin 4 */
  27.     PORTA_PCR4 =  PORT_PCR_MUX(1);
  28.     GPIOA_PDDR &= ~((uint_32)1 << 4);
  29.     /* Pull up */
  30.     PORTA_PCR4 |= PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;
  31.     /* GPIO_INT_EDGE_HIGH */
  32.     PORTA_PCR4 |= PORT_PCR_IRQC(9);

  33.     /* Clear interrupt flag */
  34.     PORTC_ISFR = (1 << 3);
  35.     PORTA_ISFR = (1 << 4);

  36.     /* Enable interrupt port A */
  37.     NVIC_ICPR = 1 << 30;
  38.     NVIC_ISER = 1 << 30;
  39. #endif
  40. #endif
  41. }
复制代码
参考文献:




回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
 楼主| 发表于 2014-9-15 11:20:55 | 显示全部楼层
如有什么错误或者不足,欢迎网友指正,请在后面跟帖!
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-9-15 11:26:52 | 显示全部楼层
支持楼主的原创分享。
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

273

帖子

0

高级会员

Rank: 4

积分
718
最后登录
1970-1-1
发表于 2014-9-16 16:57:30 | 显示全部楼层
USB资料,这个一定顶一下!
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-9-17 11:18:12 | 显示全部楼层
如果网友们有好的经验分享,也欢迎大家分享出来。
回复 支持 反对

使用道具 举报

该用户从未签到

57

主题

531

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1356
最后登录
2016-12-5
发表于 2015-9-17 13:13:24 | 显示全部楼层
顶一下~版主:新人求关注,好多问题有待解决
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2019-10-17 08:07
  • 签到天数: 273 天

    连续签到: 1 天

    [LV.8]以坛为家I

    74

    主题

    2338

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7515
    最后登录
    2021-8-30
    发表于 2015-9-17 13:37:01 | 显示全部楼层

    支持楼主的原创分享
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    49

    帖子

    0

    注册会员

    Rank: 2

    积分
    79
    最后登录
    2015-9-21
    发表于 2015-9-18 09:26:34 来自手机 | 显示全部楼层
    感谢分享
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-21 11:40 , Processed in 0.082220 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表