⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbs.c

📁 eCos操作系统源码
💻 C
📖 第 1 页 / 共 3 页
字号:
//==========================================================================////      usbs.c////      Generic USB slave-side support////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):    bartv// Contributors: bartv// Date:         2000-10-04////####DESCRIPTIONEND####////==========================================================================#include <pkgconf/system.h>#include <cyg/infra/cyg_type.h>#include <cyg/infra/cyg_ass.h>#include <cyg/infra/cyg_trac.h>#include <cyg/infra/diag.h>#include <cyg/io/usb/usbs.h>#include <cyg/hal/drv_api.h>// ----------------------------------------------------------------------------// Devtab entry support. This code can be compiled with no overheads as// long as the necessary support package is in place.#ifdef CYGPKG_IO# include <cyg/io/io.h># include <cyg/io/devtab.h>// ----------------------------------------------------------------------------// read()/write() functions applied to USB endpoints. These just// indirect via the usbs_endpoint structures and wait for the// callback to happen.typedef struct usbs_callback_data {    bool                completed;    int                 result;    cyg_drv_mutex_t     lock;    cyg_drv_cond_t      signal;} usbs_callback_data;static voidusbs_devtab_callback(void* arg, int result){    usbs_callback_data* callback_data = (usbs_callback_data*) arg;    callback_data->result       = result;    callback_data->completed    = true;    cyg_drv_cond_signal(&(callback_data->signal));}    Cyg_ErrNousbs_devtab_cwrite(cyg_io_handle_t handle, const void* buf, cyg_uint32* size){    usbs_callback_data  wait;    cyg_devtab_entry_t* devtab_entry;    usbs_tx_endpoint*   endpoint;    int                 result = ENOERR;        CYG_REPORT_FUNCTION();        wait.completed      = 0;    cyg_drv_mutex_init(&wait.lock);    cyg_drv_cond_init(&wait.signal, &wait.lock);    devtab_entry      = (cyg_devtab_entry_t*) handle;    CYG_CHECK_DATA_PTR( devtab_entry, "A valid endpoint must be supplied");    endpoint          = (usbs_tx_endpoint*) devtab_entry->priv;        CYG_CHECK_DATA_PTR( endpoint, "The handle must correspond to a USB endpoint");    CYG_CHECK_FUNC_PTR( endpoint->start_tx_fn, "The endpoint must have a start_tx function");    endpoint->buffer            = (unsigned char*) buf;    endpoint->buffer_size       = (int) *size;    endpoint->complete_fn       = &usbs_devtab_callback;    endpoint->complete_data     = (void*) &wait;    (*endpoint->start_tx_fn)(endpoint);        cyg_drv_mutex_lock(&wait.lock);    while (!wait.completed) {        cyg_drv_cond_wait(&wait.signal);    }    cyg_drv_mutex_unlock(&wait.lock);    if (wait.result < 0) {        result = wait.result;    } else {        *size = wait.result;    }        cyg_drv_cond_destroy(&wait.signal);    cyg_drv_mutex_destroy(&wait.lock);    CYG_REPORT_RETURN();    return result;}Cyg_ErrNousbs_devtab_cread(cyg_io_handle_t handle, void* buf, cyg_uint32* size){    usbs_callback_data  wait;    cyg_devtab_entry_t* devtab_entry;    usbs_rx_endpoint*   endpoint;    int                 result = ENOERR;        CYG_REPORT_FUNCTION();        wait.completed      = 0;    cyg_drv_mutex_init(&wait.lock);    cyg_drv_cond_init(&wait.signal, &wait.lock);    devtab_entry      = (cyg_devtab_entry_t*) handle;    CYG_CHECK_DATA_PTR( devtab_entry, "A valid endpoint must be supplied");    endpoint          = (usbs_rx_endpoint*) devtab_entry->priv;        CYG_CHECK_DATA_PTR( endpoint, "The handle must correspond to a USB endpoint");    CYG_CHECK_FUNC_PTR( endpoint->start_rx_fn, "The endpoint must have a start_rx function");    endpoint->buffer            = (unsigned char*) buf;    endpoint->buffer_size       = (int) *size;    endpoint->complete_fn       = &usbs_devtab_callback;    endpoint->complete_data     = (void*) &wait;    (*endpoint->start_rx_fn)(endpoint);    cyg_drv_mutex_lock(&wait.lock);    while (!wait.completed) {        cyg_drv_cond_wait(&wait.signal);    }    cyg_drv_mutex_unlock(&wait.lock);    if (wait.result < 0) {        result = wait.result;    } else {        *size = wait.result;    }        cyg_drv_cond_destroy(&wait.signal);    cyg_drv_mutex_destroy(&wait.lock);    CYG_REPORT_RETURN();    return result;}// ----------------------------------------------------------------------------// More devtab functions, this time related to ioctl() style operations.Cyg_ErrNousbs_devtab_get_config(cyg_io_handle_t handle, cyg_uint32 code, void* buf, cyg_uint32* size){    return -EINVAL;}Cyg_ErrNousbs_devtab_set_config(cyg_io_handle_t handle, cyg_uint32 code, const void* buf, cyg_uint32* size){    return -EINVAL;}#endif  //  CYGPKG_IO// ----------------------------------------------------------------------------// USB-specific functions that are useful for applications/packages which// do not want to use the devtab interface. These may get called in DSR// context.voidusbs_start_rx(usbs_rx_endpoint* endpoint){    CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied");    CYG_CHECK_FUNC_PTR( endpoint->start_rx_fn, "The USB endpoint must support receive operations");    (*endpoint->start_rx_fn)(endpoint);}voidusbs_start_rx_buffer(usbs_rx_endpoint* endpoint,                     unsigned char* buf, int size,                     void (*callback_fn)(void *, int), void* callback_arg){    CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied");    CYG_CHECK_FUNC_PTR( endpoint->start_rx_fn, "The USB endpoint must support receive operations");    endpoint->buffer            = buf;    endpoint->buffer_size       = size;    endpoint->complete_fn       = callback_fn;    endpoint->complete_data     = callback_arg;    (*endpoint->start_rx_fn)(endpoint);}voidusbs_start_tx(usbs_tx_endpoint* endpoint){    CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied");    CYG_CHECK_FUNC_PTR( endpoint->start_tx_fn, "The USB endpoint must support receive operations");    (*endpoint->start_tx_fn)(endpoint);}voidusbs_start_tx_buffer(usbs_tx_endpoint* endpoint,                     const unsigned char* buf, int size,                     void (*callback_fn)(void*, int), void *callback_arg){    CYG_CHECK_DATA_PTR( endpoint, "A valid USB endpoint must be supplied");    CYG_CHECK_FUNC_PTR( endpoint->start_tx_fn, "The USB endpoint must support receive operations");    endpoint->buffer            = buf;    endpoint->buffer_size       = size;    endpoint->complete_fn       = callback_fn;    endpoint->complete_data     = callback_arg;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -