mirror of
git://projects.qi-hardware.com/iris.git
synced 2025-04-21 12:27:27 +03:00
further towards a usb file system
This commit is contained in:
@@ -158,11 +158,19 @@ class Udc:
|
||||
char log_buffer[1000]
|
||||
unsigned log_buffer_size
|
||||
unsigned log_buffer_start
|
||||
Kernel::Cap caller
|
||||
bool have_caller
|
||||
public:
|
||||
void init ()
|
||||
void log (unsigned c)
|
||||
void interrupt (unsigned cmd)
|
||||
void send (unsigned code, unsigned arg)
|
||||
void set_caller (Kernel::Cap c):
|
||||
if have_caller:
|
||||
kdebug ("set_caller double-called\n")
|
||||
Kernel::panic (0)
|
||||
caller = c
|
||||
have_caller = true
|
||||
|
||||
Udc::Device Udc::device_descriptor = { sizeof (Device), Device::Type, 0x200, 0, 0, 0, max_packet_size0, 0xfffe, 0x0002, 0x100, 1, 2, 0, 1 }
|
||||
Udc::my_config Udc::config_descriptor = {
|
||||
@@ -198,6 +206,7 @@ void Udc::init ():
|
||||
s_langs = (String <1>){ sizeof (String <1>), String <1>::Type, { 0x0409 } }
|
||||
s_manufacturer = (String <6>){ sizeof (String <6>), String <6>::Type, { 's', 'h', 'e', 'v', 'e', 'k' } }
|
||||
s_product = (String <16>){ sizeof (String <16>), String <16>::Type, { 'I', 'r', 'i', 's', ' ', 'o', 'n', ' ', 'N', 'a', 'n', 'o', 'N', 'o', 't', 'e' } }
|
||||
have_caller = false
|
||||
log_buffer_size = 0
|
||||
log_buffer_start = 0
|
||||
cmd_code = ~0
|
||||
@@ -229,9 +238,24 @@ bool Udc::vendor (Setup *s, unsigned cmd):
|
||||
if !(s->request_type & 0x80):
|
||||
switch s->request:
|
||||
case Directory::GET_SIZE:
|
||||
//TODO
|
||||
if !have_caller:
|
||||
kdebug ("received size from server without a caller waiting\n")
|
||||
Kernel::panic (0)
|
||||
unsigned size_l = UDC_FIFO (0)
|
||||
unsigned size_h = UDC_FIFO (0)
|
||||
caller.invoke (Kernel::Num (size_l, size_h))
|
||||
have_caller = false
|
||||
break
|
||||
case Directory::GET_NAME:
|
||||
//TODO
|
||||
if !have_caller:
|
||||
kdebug ("received size from server without a caller waiting\n")
|
||||
Kernel::panic (0)
|
||||
unsigned n[4]
|
||||
for unsigned i = 0; i < 4; ++i:
|
||||
n[i] = UDC_FIFO (0)
|
||||
caller.invoke (Kernel::Num (n[0], n[1]), Kernel::Num (n[2], n[3]))
|
||||
have_caller = false
|
||||
break
|
||||
default:
|
||||
kdebug ("invalid vendor request\n")
|
||||
Kernel::panic (0)
|
||||
@@ -369,6 +393,7 @@ void Udc::interrupt (unsigned cmd):
|
||||
i = UDC_INTRIN
|
||||
if i & (1 << 0):
|
||||
// Interrupt on endpoint 0.
|
||||
UDC_INDEX = 0
|
||||
unsigned csr = UDC_CSR0
|
||||
if csr & UDC_CSR0_SENTSTALL:
|
||||
csr &= ~(UDC_CSR0_SENTSTALL | UDC_CSR0_SENDSTALL)
|
||||
@@ -411,6 +436,18 @@ void Udc::interrupt (unsigned cmd):
|
||||
state = IDLE
|
||||
break
|
||||
UDC_CSR0 = csr
|
||||
unsigned i = UDC_INTROUT
|
||||
if i & (1 << 1):
|
||||
// Interrupt on OUT endpoint 1.
|
||||
UDC_INDEX = 1
|
||||
unsigned csr = UDC_OUTCSR
|
||||
if !csr & UDC_CSR_OUTPKTRDY:
|
||||
kdebug ("unrecognized interrupt on bulk out ep 1\n")
|
||||
return
|
||||
for unsigned i = 0; i < 16; ++i:
|
||||
*p++ = UDC_FIFO (1)
|
||||
if p - page == PAGE_SIZE:
|
||||
// TODO: notify caller; reset buffer.
|
||||
|
||||
void Udc::log (unsigned c):
|
||||
if log_buffer_size >= sizeof (log_buffer):
|
||||
|
||||
Reference in New Issue
Block a user