SAM4L8教程之USB复合设备的实现

分享到:

    大家用usb数据线连接开发板的DEBUG USB,打开设备管理器会发现主机识别出有3个设备,这就是usb多功能的复合设备。下面是我探索将MSC,usb mouse和usb keyboard集合于1个设备的教程。
 
    首先新建一个工程,打开File->New->Project,然后选择点击红圈区域:

    然后依次打开
    之后打开添加模块的界面,把下面两个模块添加进去:

    之后展开USB Device,使能下面三个功能:

 

    之后点击Apply,等待模块添加完毕。

 

    先配置时钟源,打开conf_clock.h文件,把SYSCLK_SRC_RCSYS屏蔽掉,定义SYSCLK_SRC_PLL0:
  1. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_RCSYS
  2. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_OSC0
  3. #define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_PLL0
  4. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_DFLL
  5. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_RC80M
  6. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_RCFAST
  7. //#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_RC1M
  8.  
    并在主函数添加sysclk_init()初始化。
 
    打开conf_board.h文件,在上面添加代码:
  1. #define CONF_BOARD_USB_PORT
  2. #define CONF_BOARD_USB_VBUS_DETECT
  3.  

    打开conf_virtual_mem.h文件,将下面代码:
  1. #define VMEM_NB_SECTOR        8
    改为:
  1. #define VMEM_NB_SECTOR        48

    打开conf_usb.h文件,修改这个文件比较麻烦,最好按顺序改:
    把第二行代码:
  1. #define  USB_DEVICE_PRODUCT_ID            0xFFFF
    改为:
  1. #define  USB_DEVICE_PRODUCT_ID            USB_PID_ATMEL_ASF_MSC_HIDMOUSE
    把下面代码屏蔽去掉
  1. #define  USB_DEVICE_MANUFACTURE_NAME      "Manufacture name"
  2. #define  USB_DEVICE_PRODUCT_NAME          "Product name"
  3. #define  USB_DEVICE_SERIAL_NAME           "12...EF" // Disk SN for MSC
  4.  
    因为要实现usb的3个功能就有3个接口,所以把下面代码改为:
  1. #define  USB_DEVICE_NB_INTERFACE       3 // 1 or more
    usb鼠标和usb键盘的接口分别需要1个输入端点,MSC需要1个输入端点和1个输出端点,因此最大需要4个端点。所以把下面代码改为:
  1. #define  USB_DEVICE_MAX_EP             4 // 0 to max endpoint requested by interfaces
    然后到下面内容,MSC接口配置把下面代码:
  1. #define  UDI_MSC_ENABLE_EXT()          true
  2. #define  UDI_MSC_DISABLE_EXT()
  3.  
    改成:
  1. #define UDI_MSC_ENABLE_EXT() my_callback_msc_enable()
  2. extern bool my_callback_msc_enable(void);
  3. #define UDI_MSC_DISABLE_EXT() my_callback_msc_disable()
  4. extern void my_callback_msc_disable(void);
  5.  
    MSC其它配置默认就行了;
 
    再到usb mouse接口配置,把下面代码:
  1. #define  UDI_HID_MOUSE_ENABLE_EXT()       true
  2. #define  UDI_HID_MOUSE_DISABLE_EXT()
  3.  
    改为:
  1. #define UDI_HID_MOUSE_ENABLE_EXT() my_callback_mouse_enable()
  2. extern bool my_callback_mouse_enable(void);
  3. #define UDI_HID_MOUSE_DISABLE_EXT() my_callback_mouse_disable()
  4. extern void my_callback_mouse_disable(void);
  5.  
    再找到下面代码并改为:
  1. //! Endpoint numbers definition
  2. #define  UDI_HID_MOUSE_EP_IN           (3 | USB_EP_DIR_IN)
  3. //! Interface number
  4. #define  UDI_HID_MOUSE_IFACE_NUMBER    1
  5.  
    之后到usb keyboard接口配置,把下面代码:
  1. #define  UDI_HID_KBD_ENABLE_EXT()       true
  2. #define  UDI_HID_KBD_DISABLE_EXT()
  3.  
    改为:
  1. #define UDI_HID_KBD_ENABLE_EXT() my_callback_keyboard_enable()
  2. extern bool my_callback_keyboard_enable(void);
  3. #define UDI_HID_KBD_DISABLE_EXT() my_callback_keyboard_disable()
  4. extern void my_callback_keyboard_disable(void);
  5.  
    再找到下面代码将它改为:
  1. //! Endpoint numbers definition
  2. #define  UDI_HID_KBD_EP_IN           (4 | USB_EP_DIR_IN)
  3. //! Interface number
  4. #define  UDI_HID_KBD_IFACE_NUMBER    2
  5.  
    可以把其它用不到的接口配置删掉,不然会有编译警告,当然不删也行。
 
    然后在下面添加代码:
  1. //! USB Interfaces descriptor structure
  2. #define UDI_COMPOSITE_DESC_T
  3. //! USB Interfaces descriptor value for Full Speed
  4. #define UDI_COMPOSITE_DESC_FS
  5. //! USB Interfaces descriptor value for High Speed
  6. #define UDI_COMPOSITE_DESC_HS
  7. //! USB Interface APIs
  8. #define UDI_COMPOSITE_API
  9.  
    添加成为:
  1. #define UDI_COMPOSITE_DESC_T \
  2.         udi_msc_desc_t udi_msc; \
  3.         udi_hid_mouse_desc_t udi_hid_mouse; \
  4.         udi_hid_kbd_desc_t udi_hid_kbd
  5.  
  6. //! USB Interfaces descriptor value for Full Speed
  7. #define UDI_COMPOSITE_DESC_FS \
  8.         .udi_msc                   = UDI_MSC_DESC_FS, \
  9.         .udi_hid_mouse             = UDI_HID_MOUSE_DESC, \
  10.         .udi_hid_kbd = UDI_HID_KBD_DESC
  11.  
  12. //! USB Interfaces descriptor value for High Speed
  13. #define UDI_COMPOSITE_DESC_HS \
  14.         .udi_msc                   = UDI_MSC_DESC_HS, \
  15.         .udi_hid_mouse             = UDI_HID_MOUSE_DESC, \
  16.         .udi_hid_kbd = UDI_HID_KBD_DESC
  17.  
  18. //! USB Interface APIs
  19. #define UDI_COMPOSITE_API  \
  20.         &udi_api_msc,            \
  21.         &udi_api_hid_mouse,            \
  22.         &udi_api_hid_kbd
  23.  
    之后在下面添加代码:
  1. #include "udi_msc.h"
  2. #include "udi_hid_kbd.h"
  3. #include "udi_hid_mouse.h"
  4.  
    conf_usb.h文件就这样配置完成。
 

    打开main.c文件,在上面添加代码:
  1. static bool my_flag_autorize_msc_transfert = false;
  2. bool my_callback_msc_enable(void)
  3. {
  4.         my_flag_autorize_msc_transfert = true;
  5.         return true;
  6. }
  7. void my_callback_msc_disable(void)
  8. {
  9.         my_flag_autorize_msc_transfert = false;
  10. }
  11.  
  12. static bool my_flag_autorize_mouse_events = false;
  13. bool my_callback_mouse_enable(void)
  14. {
  15.         my_flag_autorize_mouse_events = true;
  16.         return true;
  17. }
  18. void my_callback_mouse_disable(void)
  19. {
  20.         my_flag_autorize_mouse_events = false;
  21. }
  22.  
  23. static bool my_flag_autorize_keyboard_events = false;
  24. bool my_callback_keyboard_enable(void)
  25. {
  26.         my_flag_autorize_keyboard_events = true;
  27.         return true;
  28. }
  29. void my_callback_keyboard_disable(void)
  30. {
  31.         my_flag_autorize_keyboard_events = false;
  32. }
  33.  
    之后在主函数添加初始化代码:
  1. irq_initialize_vectors();
  2. cpu_irq_enable();
  3.  
  4. udc_start();
  5.  
复制代码
    到这里基本做完,剩下就是添加控制功能的函数,至于添加怎样函数参考前面教程。

    下面展示我写的主函数代码:
  1. int main (void)
  2. {
  3.         irq_initialize_vectors();
  4.         cpu_irq_enable();
  5.         
  6.         sysclk_init();
  7.         board_init();
  8.         
  9.         bool last_sw = false, sw = false;
  10.         
  11.         udc_start();
  12.  
  13.         last_sw = !ioport_get_pin_level(BUTTON_0_PIN);
  14.         sw = last_sw;
  15.         
  16.         while (1) {
  17.                 sw = !ioport_get_pin_level(BUTTON_0_PIN);   //读取机械按键值
  18.                 if(sw != last_sw){                //判断按键值是否有变化
  19.                         if(sw){
  20.                                 LED_On(LED0);
  21.                                 if(my_flag_autorize_mouse_events){
  22.                                         udi_hid_mouse_moveX(10);      //鼠标指针移动
  23.                                 }
  24.                                 if(my_flag_autorize_keyboard_events){
  25.                                         udi_hid_kbd_down(HID_A);    //按键按下
  26.                                 }
  27.                         }
  28.                         else{
  29.                                 LED_Off(LED0);
  30.                                 if(my_flag_autorize_keyboard_events){
  31.                                         udi_hid_kbd_up(HID_A);      //按键弹起
  32.                                 }
  33.                         }
  34.                         last_sw = sw;
  35.                 }
  36.                
  37.                 if (my_flag_autorize_msc_transfert) {
  38.                         if (!udi_msc_process_trans()) {
  39.                                 sleepmgr_enter_sleep();
  40.                         }
  41.                         }else{
  42.                         sleepmgr_enter_sleep();
  43.                 }
  44.         }
  45. }
  46.  
    效果:编译下载程序,然后接好usb接口,在设备管理器就会看到主机识别开发板的设备。(另外两个识别出来是自己的鼠标和笔记本的触摸板)

    然后打开一个文本文件,按一下开发板的按键就会输入a,同时鼠标指针向右移动。

完整代码文件与官方其它开发板的USB复合设备配置文件下载地址:https://atmel.eefocus.com/module/forum/thread-2121-1-1.html

 

更多Atmel及科技资讯请关注:  
Atmel中文官网:https://www.atmel.com/zh/cn/
Atmel技术论坛:https://atmel.eefocus.com/
Atmel中文博客:https://blog.sina.com.cn/u/2253031744
Atmel新浪微博:https://www.weibo.com/atmelcn

 

继续阅读
英特尔的芯片问题还没完,ARM又出安全漏洞了!

据VentureBeat报道,继承认不安全的内存漏洞会影响数以百万计的英特尔处理器后,ARM今天证实,许多Cortex系列处理器也存在漏洞。ARM的Cortex技术被用于各种各样的Android和iOS设备,以及部分Nvidia Tegra产品、高通骁龙芯片以及索尼的PlayStation Vita上。

ARM:人工智能学习的未来是分散式AI

人工智能(AI)现在以机器学习与深度学习技术,让性能提升到更高端段,但英国半导体设计大厂安谋(ARM)指出,由于人工智能的学习仍面临网路频宽、耗电、隐私、资安等种种课题待克服,解决这些课题的方式,就是分散式人工智能(Distributed Intelligance)。

Microchip5款新型USB 2.0智能集线器IC,支持智能手机连接汽车信息娱乐系统

随着车载信息娱乐系统的兴起,汽车制造商需要在汽车显示屏和多台智能手机或者平板电脑之间建立可靠而智能的连接。Microchip Technology Inc.(美国微芯科技公司)是提供支持此类连接的集成电路(IC)的业界翘楚,推出的5款新型USB 2.0智能集线器IC为用户提供了多种选择。

3D打印出的便携电池,长得像个腕带,可做手机急救包

10月25日消息,英国布鲁内尔大学的研究团队在《材料科学与工程学》杂志上发表一篇论文称,他们已经借助一款基本的开源打印机制造出一种柔软的超级电容腕带。这种方法代表着韧性超级电容腕带首次通过一个单一的连续过程制造出来。目前制造韧性超级电容的方法通常依靠的是昂贵的3D激光选择熔化设备,并且使用不同的设备打印不同的部分。

飞一般的速度:USB3.2传输标准可达2GB/S

早在今年7月份,由苹果、惠普、英特尔以及微软等科技公司组成的USB 3.0 Promoter Group联盟公布了USB 3.2传输标准,该标准将USB 3.1上的理论传输速率从1GB/S提升到了2GB/s。

©2019 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss