查看: 1356|回复: 0

【SAM R21 Xplained】初次体验usb功能

[复制链接]
  • TA的每日心情
    开心
    2017-7-4 13:51
  • 签到天数: 347 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-3-10 15:09:38 | 显示全部楼层 |阅读模式
    分享到:
    R21的usb例程还是比较丰富的。跑了个HID的例程

    跑了个HID键盘的

    升级,这个更新真的很快呀,似乎每次都能碰到什么要升级的

    这是板子插入前的

    这是板子插入后的



    这是详细信息
    具体看下程序
    int main(void){        irq_initialize_vectors();        cpu_irq_enable();        // Initialize the sleep manager        sleepmgr_init();#if !SAMD21 && !SAMR21 && !SAMD11 && !SAML21        sysclk_init();        board_init();#else        system_init();#endif        ui_init();        ui_powerdown();        // Start USB stack to authorize VBus monitoring        udc_start();        // The main loop manages only the power mode        // because the USB management is done by interrupt        while (true) {#ifdef   USB_DEVICE_LOW_SPEED                // No USB "Keep a live" interrupt available in low speed                // to scan keyboard interface then use main loop                if (main_b_kbd_enable) {                        static volatile uint16_t virtual_sof_sub = 0;                        if (sysclk_get_cpu_hz()/50000 ==                                virtual_sof_sub++) {                                virtual_sof_sub = 0;                                static uint16_t virtual_sof = 0;                                ui_process(virtual_sof++);                        }                }#else                sleepmgr_enter_sleep();#endif        }}就主函数而言可以看出其实与ST的还是蛮像的。
    void ui_init(void){        struct extint_chan_conf config_extint_chan;        extint_chan_get_config_defaults(&config_extint_chan);        config_extint_chan.gpio_pin            = BUTTON_0_EIC_PIN;        config_extint_chan.gpio_pin_mux        = BUTTON_0_EIC_MUX;        config_extint_chan.gpio_pin_pull       = EXTINT_PULL_UP;        config_extint_chan.filter_input_signal = true;        config_extint_chan.detection_criteria  = EXTINT_DETECT_FALLING;        extint_chan_set_config(BUTTON_0_EIC_LINE, &config_extint_chan);        extint_register_callback(ui_wakeup_handler, BUTTON_0_EIC_LINE,                        EXTINT_CALLBACK_TYPE_DETECT);        extint_chan_enable_callback(BUTTON_0_EIC_LINE,EXTINT_CALLBACK_TYPE_DETECT);        /* Initialize LEDs */        LED_Off(LED_0_PIN);}仔细分析其实还是不怎么一样的。
    这个函数原以为是USB的初始化函数,打开看了下才发现是对板子上按键的处理。
    实际实现的效果就只是板子按下后led灯亮了。
    /*! \brief Start the USB Device stack */void udc_start(void){        udd_enable();}void udd_enable(void){        irqflags_t flags;        /* To avoid USB interrupt before end of initialization */        flags = cpu_irq_save();#if USB_ID_EIC        if (usb_dual_enable()) {                /* The current mode has been started by otg_dual_enable() */                cpu_irq_restore(flags);                return;        }#endif        struct usb_config config_usb;        /* USB Module configuration */        usb_get_config_defaults(&config_usb);        config_usb.source_generator = UDD_CLOCK_GEN;        usb_init(&usb_device, USB, &config_usb);        /* USB Module Enable */        usb_enable(&usb_device);        /* Check clock after enable module, request the clock */        udd_wait_clock_ready();        udd_sleep_mode(UDD_STATE_SUSPEND);#if USB_VBUS_EIC        _usb_vbus_config();        if (is_usb_vbus_high()) {                /* USB Attach */                _uhd_vbus_handler();        }#else        // No VBus detect, assume always high# ifndef USB_DEVICE_ATTACH_AUTO_DISABLE        udd_attach();# endif#endif        cpu_irq_restore(flags);}这边才是对usb的初始化处理
    void ui_process(uint16_t framenumber){        bool b_btn_state, success;        static bool btn_last_state = false;        static bool sequence_running = false;        static uint8_t sequence_pos = 0;        uint8_t value;        static uint16_t cpt_sof = 0;        if ((framenumber % 1000) == 0) {                LED_On(LED_0_PIN);        }        if ((framenumber % 1000) == 500) {                LED_Off(LED_0_PIN);        }        // Scan process running each 2ms        cpt_sof++;        if ((cpt_sof % 2) == 0) {                return;        }        // Scan buttons on switch 0 to send keys sequence        b_btn_state = (!port_pin_get_input_level(BUTTON_0_PIN));        if (b_btn_state != btn_last_state) {                btn_last_state = b_btn_state;                if (btn_wakeup) {                        if (!b_btn_state) {                                btn_wakeup = false;                        }                } else {                        sequence_running = true;                }        }        // Sequence process running each period        if (SEQUENCE_PERIOD > cpt_sof) {                return;        }        cpt_sof = 0;        if (sequence_running) {                // Send next key                value = ui_sequence[sequence_pos].value;                if (value!=0) {                        if (ui_sequence[sequence_pos].b_modifier) {                                if (ui_sequence[sequence_pos].b_down) {                                        success = udi_hid_kbd_modifier_down(value);                                } else {                                        success = udi_hid_kbd_modifier_up(value);                                }                        } else {                                if (ui_sequence[sequence_pos].b_down) {                                        success = udi_hid_kbd_down(value);                                } else {                                        success = udi_hid_kbd_up(value);                                }                        }                        if (!success) {                                return; // Retry it on next schedule                        }                }                // Valid sequence position                sequence_pos++;                if (sequence_pos >=                        sizeof(ui_sequence) / sizeof(ui_sequence[0])) {                        sequence_pos = 0;                        sequence_running = false;                }        }}整个usb过程貌似是这块。
    可能对ASF了解还是不够多,找了半天还是没找到中断函数部分的文件在哪。因为板子毕竟是作为设备,可能有个对主机的做出中断的函数文件。就使用ST的USB的体会而言,主函数部分其实是比较简单的,真正的处理应该在中断函数那块
    很遗憾的是这边没有pdf进行详细的说明,可能得再好好摸索下



    这是usb部分的资料,其中usb_protocol.h主要是是基于usb协议部分的定义,包括各种描述符之类的。具体的还在看。。。。。。
    最后,感谢EEWORLD提供的开发样板,给了我这次使用机会,非常感谢!
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-11-18 13:51 , Processed in 0.117697 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.