ptp.c
#include "ptp.h"
#include "dryos.h"
int recv_ptp_data(struct ptp_context *data, char *buf, int size)
// repeated calls per transaction are ok
{
while ( size >= BUF_SIZE )
{
data->recv_data(data->handle,buf,BUF_SIZE,0,0);
// XXX check for success??
size -= BUF_SIZE;
buf += BUF_SIZE;
}
if ( size != 0 )
{
data->recv_data(data->handle,buf,size,0,0);
// XXX check for success??
}
return 1;
}
int send_ptp_data(struct ptp_context *data, const char *buf, int size)
// repeated calls per transaction are *not* ok
{
int tmpsize;
tmpsize = size;
while ( size >= BUF_SIZE )
{
if ( data->send_data(data->handle,(void *)buf,BUF_SIZE,tmpsize,0,0,0) )
{
return 0;
}
tmpsize = 0;
size -= BUF_SIZE;
buf += BUF_SIZE;
}
if ( size != 0 )
{
if ( data->send_data(data->handle,(void *)buf,size,tmpsize,0,0,0) )
{
return 0;
}
}
return 1;
}
uint32_t ptp_register_all_handlers()
{
uint32_t ret = 0x0;
extern struct ptp_handler _ptp_handlers_start[];
extern struct ptp_handler _ptp_handlers_end[];
struct ptp_handler * handler = _ptp_handlers_start;
for( ; handler < _ptp_handlers_end ; handler++ )
{
#if defined(POSITION_INDEPENDENT)
handler->handler = PIC_RESOLVE(handler->handler);
handler->priv = PIC_RESOLVE(handler->priv);
#endif
//DebugMsg("[ML] PTP_INIT reg: id=0x%08X h=0x%08X p=0x%08X", handler->id, handler->handler, handler->priv);
ret |= ptp_register_handler(
handler->id,
handler->handler,
handler->priv
);
}
return ret;
}
static void ptp_init( void *unused )
{
#ifndef CONFIG_40D
ptp_register_all_handlers();
#endif
}
INIT_FUNC( __FILE__, ptp_init );