isp116x.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. /*
  2. * ISP116x register declarations and HCD data structures
  3. *
  4. * Copyright (C) 2007 Rodolfo Giometti <giometti@linux.it>
  5. * Copyright (C) 2007 Eurotech S.p.A. <info@eurotech.it>
  6. * Copyright (C) 2005 Olav Kongas <ok@artecdesign.ee>
  7. * Portions:
  8. * Copyright (C) 2004 Lothar Wassmann
  9. * Copyright (C) 2004 Psion Teklogix
  10. * Copyright (C) 2004 David Brownell
  11. *
  12. * This program is free software; you can redistribute it and/or
  13. * modify it under the terms of the GNU General Public License as
  14. * published by the Free Software Foundation; either version 2 of
  15. * the License, or (at your option) any later version.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program; if not, write to the Free Software
  24. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  25. * MA 02111-1307 USA
  26. */
  27. #ifdef DEBUG
  28. #define DBG(fmt, args...) \
  29. printf("isp116x: %s: " fmt "\n" , __FUNCTION__ , ## args)
  30. #else
  31. #define DBG(fmt, args...) do {} while (0)
  32. #endif
  33. #ifdef VERBOSE
  34. # define VDBG DBG
  35. #else
  36. # define VDBG(fmt, args...) do {} while (0)
  37. #endif
  38. #define ERR(fmt, args...) \
  39. printf("isp116x: %s: " fmt "\n" , __FUNCTION__ , ## args)
  40. #define WARN(fmt, args...) \
  41. printf("isp116x: %s: " fmt "\n" , __FUNCTION__ , ## args)
  42. #define INFO(fmt, args...) \
  43. printf("isp116x: " fmt "\n" , ## args)
  44. /* ------------------------------------------------------------------------- */
  45. /* us of 1ms frame */
  46. #define MAX_LOAD_LIMIT 850
  47. /* Full speed: max # of bytes to transfer for a single urb
  48. at a time must be < 1024 && must be multiple of 64.
  49. 832 allows transfering 4kiB within 5 frames. */
  50. #define MAX_TRANSFER_SIZE_FULLSPEED 832
  51. /* Low speed: there is no reason to schedule in very big
  52. chunks; often the requested long transfers are for
  53. string descriptors containing short strings. */
  54. #define MAX_TRANSFER_SIZE_LOWSPEED 64
  55. /* Bytetime (us), a rough indication of how much time it
  56. would take to transfer a byte of useful data over USB */
  57. #define BYTE_TIME_FULLSPEED 1
  58. #define BYTE_TIME_LOWSPEED 20
  59. /* Buffer sizes */
  60. #define ISP116x_BUF_SIZE 4096
  61. #define ISP116x_ITL_BUFSIZE 0
  62. #define ISP116x_ATL_BUFSIZE ((ISP116x_BUF_SIZE) - 2*(ISP116x_ITL_BUFSIZE))
  63. #define ISP116x_WRITE_OFFSET 0x80
  64. /* --- ISP116x registers/bits ---------------------------------------------- */
  65. #define HCREVISION 0x00
  66. #define HCCONTROL 0x01
  67. #define HCCONTROL_HCFS (3 << 6) /* host controller
  68. functional state */
  69. #define HCCONTROL_USB_RESET (0 << 6)
  70. #define HCCONTROL_USB_RESUME (1 << 6)
  71. #define HCCONTROL_USB_OPER (2 << 6)
  72. #define HCCONTROL_USB_SUSPEND (3 << 6)
  73. #define HCCONTROL_RWC (1 << 9) /* remote wakeup connected */
  74. #define HCCONTROL_RWE (1 << 10) /* remote wakeup enable */
  75. #define HCCMDSTAT 0x02
  76. #define HCCMDSTAT_HCR (1 << 0) /* host controller reset */
  77. #define HCCMDSTAT_SOC (3 << 16) /* scheduling overrun count */
  78. #define HCINTSTAT 0x03
  79. #define HCINT_SO (1 << 0) /* scheduling overrun */
  80. #define HCINT_WDH (1 << 1) /* writeback of done_head */
  81. #define HCINT_SF (1 << 2) /* start frame */
  82. #define HCINT_RD (1 << 3) /* resume detect */
  83. #define HCINT_UE (1 << 4) /* unrecoverable error */
  84. #define HCINT_FNO (1 << 5) /* frame number overflow */
  85. #define HCINT_RHSC (1 << 6) /* root hub status change */
  86. #define HCINT_OC (1 << 30) /* ownership change */
  87. #define HCINT_MIE (1 << 31) /* master interrupt enable */
  88. #define HCINTENB 0x04
  89. #define HCINTDIS 0x05
  90. #define HCFMINTVL 0x0d
  91. #define HCFMREM 0x0e
  92. #define HCFMNUM 0x0f
  93. #define HCLSTHRESH 0x11
  94. #define HCRHDESCA 0x12
  95. #define RH_A_NDP (0x3 << 0) /* # downstream ports */
  96. #define RH_A_PSM (1 << 8) /* power switching mode */
  97. #define RH_A_NPS (1 << 9) /* no power switching */
  98. #define RH_A_DT (1 << 10) /* device type (mbz) */
  99. #define RH_A_OCPM (1 << 11) /* overcurrent protection
  100. mode */
  101. #define RH_A_NOCP (1 << 12) /* no overcurrent protection */
  102. #define RH_A_POTPGT (0xff << 24) /* power on -> power good
  103. time */
  104. #define HCRHDESCB 0x13
  105. #define RH_B_DR (0xffff << 0) /* device removable flags */
  106. #define RH_B_PPCM (0xffff << 16) /* port power control mask */
  107. #define HCRHSTATUS 0x14
  108. #define RH_HS_LPS (1 << 0) /* local power status */
  109. #define RH_HS_OCI (1 << 1) /* over current indicator */
  110. #define RH_HS_DRWE (1 << 15) /* device remote wakeup
  111. enable */
  112. #define RH_HS_LPSC (1 << 16) /* local power status change */
  113. #define RH_HS_OCIC (1 << 17) /* over current indicator
  114. change */
  115. #define RH_HS_CRWE (1 << 31) /* clear remote wakeup
  116. enable */
  117. #define HCRHPORT1 0x15
  118. #define RH_PS_CCS (1 << 0) /* current connect status */
  119. #define RH_PS_PES (1 << 1) /* port enable status */
  120. #define RH_PS_PSS (1 << 2) /* port suspend status */
  121. #define RH_PS_POCI (1 << 3) /* port over current
  122. indicator */
  123. #define RH_PS_PRS (1 << 4) /* port reset status */
  124. #define RH_PS_PPS (1 << 8) /* port power status */
  125. #define RH_PS_LSDA (1 << 9) /* low speed device attached */
  126. #define RH_PS_CSC (1 << 16) /* connect status change */
  127. #define RH_PS_PESC (1 << 17) /* port enable status change */
  128. #define RH_PS_PSSC (1 << 18) /* port suspend status
  129. change */
  130. #define RH_PS_OCIC (1 << 19) /* over current indicator
  131. change */
  132. #define RH_PS_PRSC (1 << 20) /* port reset status change */
  133. #define HCRHPORT_CLRMASK (0x1f << 16)
  134. #define HCRHPORT2 0x16
  135. #define HCHWCFG 0x20
  136. #define HCHWCFG_15KRSEL (1 << 12)
  137. #define HCHWCFG_CLKNOTSTOP (1 << 11)
  138. #define HCHWCFG_ANALOG_OC (1 << 10)
  139. #define HCHWCFG_DACK_MODE (1 << 8)
  140. #define HCHWCFG_EOT_POL (1 << 7)
  141. #define HCHWCFG_DACK_POL (1 << 6)
  142. #define HCHWCFG_DREQ_POL (1 << 5)
  143. #define HCHWCFG_DBWIDTH_MASK (0x03 << 3)
  144. #define HCHWCFG_DBWIDTH(n) (((n) << 3) & HCHWCFG_DBWIDTH_MASK)
  145. #define HCHWCFG_INT_POL (1 << 2)
  146. #define HCHWCFG_INT_TRIGGER (1 << 1)
  147. #define HCHWCFG_INT_ENABLE (1 << 0)
  148. #define HCDMACFG 0x21
  149. #define HCDMACFG_BURST_LEN_MASK (0x03 << 5)
  150. #define HCDMACFG_BURST_LEN(n) (((n) << 5) & HCDMACFG_BURST_LEN_MASK)
  151. #define HCDMACFG_BURST_LEN_1 HCDMACFG_BURST_LEN(0)
  152. #define HCDMACFG_BURST_LEN_4 HCDMACFG_BURST_LEN(1)
  153. #define HCDMACFG_BURST_LEN_8 HCDMACFG_BURST_LEN(2)
  154. #define HCDMACFG_DMA_ENABLE (1 << 4)
  155. #define HCDMACFG_BUF_TYPE_MASK (0x07 << 1)
  156. #define HCDMACFG_CTR_SEL (1 << 2)
  157. #define HCDMACFG_ITLATL_SEL (1 << 1)
  158. #define HCDMACFG_DMA_RW_SELECT (1 << 0)
  159. #define HCXFERCTR 0x22
  160. #define HCuPINT 0x24
  161. #define HCuPINT_SOF (1 << 0)
  162. #define HCuPINT_ATL (1 << 1)
  163. #define HCuPINT_AIIEOT (1 << 2)
  164. #define HCuPINT_OPR (1 << 4)
  165. #define HCuPINT_SUSP (1 << 5)
  166. #define HCuPINT_CLKRDY (1 << 6)
  167. #define HCuPINTENB 0x25
  168. #define HCCHIPID 0x27
  169. #define HCCHIPID_MASK 0xff00
  170. #define HCCHIPID_MAGIC 0x6100
  171. #define HCSCRATCH 0x28
  172. #define HCSWRES 0x29
  173. #define HCSWRES_MAGIC 0x00f6
  174. #define HCITLBUFLEN 0x2a
  175. #define HCATLBUFLEN 0x2b
  176. #define HCBUFSTAT 0x2c
  177. #define HCBUFSTAT_ITL0_FULL (1 << 0)
  178. #define HCBUFSTAT_ITL1_FULL (1 << 1)
  179. #define HCBUFSTAT_ATL_FULL (1 << 2)
  180. #define HCBUFSTAT_ITL0_DONE (1 << 3)
  181. #define HCBUFSTAT_ITL1_DONE (1 << 4)
  182. #define HCBUFSTAT_ATL_DONE (1 << 5)
  183. #define HCRDITL0LEN 0x2d
  184. #define HCRDITL1LEN 0x2e
  185. #define HCITLPORT 0x40
  186. #define HCATLPORT 0x41
  187. /* PTD accessor macros. */
  188. #define PTD_GET_COUNT(p) (((p)->count & PTD_COUNT_MSK) >> 0)
  189. #define PTD_COUNT(v) (((v) << 0) & PTD_COUNT_MSK)
  190. #define PTD_GET_TOGGLE(p) (((p)->count & PTD_TOGGLE_MSK) >> 10)
  191. #define PTD_TOGGLE(v) (((v) << 10) & PTD_TOGGLE_MSK)
  192. #define PTD_GET_ACTIVE(p) (((p)->count & PTD_ACTIVE_MSK) >> 11)
  193. #define PTD_ACTIVE(v) (((v) << 11) & PTD_ACTIVE_MSK)
  194. #define PTD_GET_CC(p) (((p)->count & PTD_CC_MSK) >> 12)
  195. #define PTD_CC(v) (((v) << 12) & PTD_CC_MSK)
  196. #define PTD_GET_MPS(p) (((p)->mps & PTD_MPS_MSK) >> 0)
  197. #define PTD_MPS(v) (((v) << 0) & PTD_MPS_MSK)
  198. #define PTD_GET_SPD(p) (((p)->mps & PTD_SPD_MSK) >> 10)
  199. #define PTD_SPD(v) (((v) << 10) & PTD_SPD_MSK)
  200. #define PTD_GET_LAST(p) (((p)->mps & PTD_LAST_MSK) >> 11)
  201. #define PTD_LAST(v) (((v) << 11) & PTD_LAST_MSK)
  202. #define PTD_GET_EP(p) (((p)->mps & PTD_EP_MSK) >> 12)
  203. #define PTD_EP(v) (((v) << 12) & PTD_EP_MSK)
  204. #define PTD_GET_LEN(p) (((p)->len & PTD_LEN_MSK) >> 0)
  205. #define PTD_LEN(v) (((v) << 0) & PTD_LEN_MSK)
  206. #define PTD_GET_DIR(p) (((p)->len & PTD_DIR_MSK) >> 10)
  207. #define PTD_DIR(v) (((v) << 10) & PTD_DIR_MSK)
  208. #define PTD_GET_B5_5(p) (((p)->len & PTD_B5_5_MSK) >> 13)
  209. #define PTD_B5_5(v) (((v) << 13) & PTD_B5_5_MSK)
  210. #define PTD_GET_FA(p) (((p)->faddr & PTD_FA_MSK) >> 0)
  211. #define PTD_FA(v) (((v) << 0) & PTD_FA_MSK)
  212. #define PTD_GET_FMT(p) (((p)->faddr & PTD_FMT_MSK) >> 7)
  213. #define PTD_FMT(v) (((v) << 7) & PTD_FMT_MSK)
  214. /* Hardware transfer status codes -- CC from ptd->count */
  215. #define TD_CC_NOERROR 0x00
  216. #define TD_CC_CRC 0x01
  217. #define TD_CC_BITSTUFFING 0x02
  218. #define TD_CC_DATATOGGLEM 0x03
  219. #define TD_CC_STALL 0x04
  220. #define TD_DEVNOTRESP 0x05
  221. #define TD_PIDCHECKFAIL 0x06
  222. #define TD_UNEXPECTEDPID 0x07
  223. #define TD_DATAOVERRUN 0x08
  224. #define TD_DATAUNDERRUN 0x09
  225. /* 0x0A, 0x0B reserved for hardware */
  226. #define TD_BUFFEROVERRUN 0x0C
  227. #define TD_BUFFERUNDERRUN 0x0D
  228. /* 0x0E, 0x0F reserved for HCD */
  229. #define TD_NOTACCESSED 0x0F
  230. /* ------------------------------------------------------------------------- */
  231. #define LOG2_PERIODIC_SIZE 5 /* arbitrary; this matches OHCI */
  232. #define PERIODIC_SIZE (1 << LOG2_PERIODIC_SIZE)
  233. /* Philips transfer descriptor */
  234. struct ptd {
  235. u16 count;
  236. #define PTD_COUNT_MSK (0x3ff << 0)
  237. #define PTD_TOGGLE_MSK (1 << 10)
  238. #define PTD_ACTIVE_MSK (1 << 11)
  239. #define PTD_CC_MSK (0xf << 12)
  240. u16 mps;
  241. #define PTD_MPS_MSK (0x3ff << 0)
  242. #define PTD_SPD_MSK (1 << 10)
  243. #define PTD_LAST_MSK (1 << 11)
  244. #define PTD_EP_MSK (0xf << 12)
  245. u16 len;
  246. #define PTD_LEN_MSK (0x3ff << 0)
  247. #define PTD_DIR_MSK (3 << 10)
  248. #define PTD_DIR_SETUP (0)
  249. #define PTD_DIR_OUT (1)
  250. #define PTD_DIR_IN (2)
  251. #define PTD_B5_5_MSK (1 << 13)
  252. u16 faddr;
  253. #define PTD_FA_MSK (0x7f << 0)
  254. #define PTD_FMT_MSK (1 << 7)
  255. } __attribute__ ((packed, aligned(2)));
  256. struct isp116x_ep {
  257. struct usb_device *udev;
  258. struct ptd ptd;
  259. u8 maxpacket;
  260. u8 epnum;
  261. u8 nextpid;
  262. u16 length; /* of current packet */
  263. unsigned char *data; /* to databuf */
  264. u16 error_count;
  265. };
  266. /* URB struct */
  267. #define N_URB_TD 48
  268. #define URB_DEL 1
  269. typedef struct {
  270. struct isp116x_ep *ed;
  271. void *transfer_buffer; /* (in) associated data buffer */
  272. int actual_length; /* (return) actual transfer length */
  273. unsigned long pipe; /* (in) pipe information */
  274. #if 0
  275. int state;
  276. #endif
  277. } urb_priv_t;
  278. struct isp116x_platform_data {
  279. /* Enable internal resistors on downstream ports */
  280. unsigned sel15Kres:1;
  281. /* On-chip overcurrent detection */
  282. unsigned oc_enable:1;
  283. /* Enable wakeup by devices on usb bus (e.g. wakeup
  284. by attachment/detachment or by device activity
  285. such as moving a mouse). When chosen, this option
  286. prevents stopping internal clock, increasing
  287. thereby power consumption in suspended state. */
  288. unsigned remote_wakeup_enable:1;
  289. };
  290. struct isp116x {
  291. u16 *addr_reg;
  292. u16 *data_reg;
  293. struct isp116x_platform_data *board;
  294. struct dentry *dentry;
  295. unsigned long stat1, stat2, stat4, stat8, stat16;
  296. /* Status flags */
  297. unsigned disabled:1;
  298. unsigned sleeping:1;
  299. /* Root hub registers */
  300. u32 rhdesca;
  301. u32 rhdescb;
  302. u32 rhstatus;
  303. u32 rhport[2];
  304. /* Schedule for the current frame */
  305. struct isp116x_ep *atl_active;
  306. int atl_buflen;
  307. int atl_bufshrt;
  308. int atl_last_dir;
  309. int atl_finishing;
  310. };
  311. /* ------------------------------------------------- */
  312. /* Inter-io delay (ns). The chip is picky about access timings; it
  313. * expects at least:
  314. * 150ns delay between consecutive accesses to DATA_REG,
  315. * 300ns delay between access to ADDR_REG and DATA_REG
  316. * OE, WE MUST NOT be changed during these intervals
  317. */
  318. #if defined(UDELAY)
  319. #define isp116x_delay(h,d) udelay(d)
  320. #else
  321. #define isp116x_delay(h,d) do {} while (0)
  322. #endif
  323. static inline void isp116x_write_addr(struct isp116x *isp116x, unsigned reg)
  324. {
  325. writew(reg & 0xff, isp116x->addr_reg);
  326. isp116x_delay(isp116x, UDELAY);
  327. }
  328. static inline void isp116x_write_data16(struct isp116x *isp116x, u16 val)
  329. {
  330. writew(val, isp116x->data_reg);
  331. isp116x_delay(isp116x, UDELAY);
  332. }
  333. static inline void isp116x_raw_write_data16(struct isp116x *isp116x, u16 val)
  334. {
  335. __raw_writew(val, isp116x->data_reg);
  336. isp116x_delay(isp116x, UDELAY);
  337. }
  338. static inline u16 isp116x_read_data16(struct isp116x *isp116x)
  339. {
  340. u16 val;
  341. val = readw(isp116x->data_reg);
  342. isp116x_delay(isp116x, UDELAY);
  343. return val;
  344. }
  345. static inline u16 isp116x_raw_read_data16(struct isp116x *isp116x)
  346. {
  347. u16 val;
  348. val = __raw_readw(isp116x->data_reg);
  349. isp116x_delay(isp116x, UDELAY);
  350. return val;
  351. }
  352. static inline void isp116x_write_data32(struct isp116x *isp116x, u32 val)
  353. {
  354. writew(val & 0xffff, isp116x->data_reg);
  355. isp116x_delay(isp116x, UDELAY);
  356. writew(val >> 16, isp116x->data_reg);
  357. isp116x_delay(isp116x, UDELAY);
  358. }
  359. static inline u32 isp116x_read_data32(struct isp116x *isp116x)
  360. {
  361. u32 val;
  362. val = (u32) readw(isp116x->data_reg);
  363. isp116x_delay(isp116x, UDELAY);
  364. val |= ((u32) readw(isp116x->data_reg)) << 16;
  365. isp116x_delay(isp116x, UDELAY);
  366. return val;
  367. }
  368. /* Let's keep register access functions out of line. Hint:
  369. we wait at least 150 ns at every access.
  370. */
  371. static u16 isp116x_read_reg16(struct isp116x *isp116x, unsigned reg)
  372. {
  373. isp116x_write_addr(isp116x, reg);
  374. return isp116x_read_data16(isp116x);
  375. }
  376. static u32 isp116x_read_reg32(struct isp116x *isp116x, unsigned reg)
  377. {
  378. isp116x_write_addr(isp116x, reg);
  379. return isp116x_read_data32(isp116x);
  380. }
  381. static void isp116x_write_reg16(struct isp116x *isp116x, unsigned reg,
  382. unsigned val)
  383. {
  384. isp116x_write_addr(isp116x, reg | ISP116x_WRITE_OFFSET);
  385. isp116x_write_data16(isp116x, (u16) (val & 0xffff));
  386. }
  387. static void isp116x_write_reg32(struct isp116x *isp116x, unsigned reg,
  388. unsigned val)
  389. {
  390. isp116x_write_addr(isp116x, reg | ISP116x_WRITE_OFFSET);
  391. isp116x_write_data32(isp116x, (u32) val);
  392. }
  393. /* --- USB HUB constants (not OHCI-specific; see hub.h) -------------------- */
  394. /* destination of request */
  395. #define RH_INTERFACE 0x01
  396. #define RH_ENDPOINT 0x02
  397. #define RH_OTHER 0x03
  398. #define RH_CLASS 0x20
  399. #define RH_VENDOR 0x40
  400. /* Requests: bRequest << 8 | bmRequestType */
  401. #define RH_GET_STATUS 0x0080
  402. #define RH_CLEAR_FEATURE 0x0100
  403. #define RH_SET_FEATURE 0x0300
  404. #define RH_SET_ADDRESS 0x0500
  405. #define RH_GET_DESCRIPTOR 0x0680
  406. #define RH_SET_DESCRIPTOR 0x0700
  407. #define RH_GET_CONFIGURATION 0x0880
  408. #define RH_SET_CONFIGURATION 0x0900
  409. #define RH_GET_STATE 0x0280
  410. #define RH_GET_INTERFACE 0x0A80
  411. #define RH_SET_INTERFACE 0x0B00
  412. #define RH_SYNC_FRAME 0x0C80
  413. /* Our Vendor Specific Request */
  414. #define RH_SET_EP 0x2000
  415. /* Hub port features */
  416. #define RH_PORT_CONNECTION 0x00
  417. #define RH_PORT_ENABLE 0x01
  418. #define RH_PORT_SUSPEND 0x02
  419. #define RH_PORT_OVER_CURRENT 0x03
  420. #define RH_PORT_RESET 0x04
  421. #define RH_PORT_POWER 0x08
  422. #define RH_PORT_LOW_SPEED 0x09
  423. #define RH_C_PORT_CONNECTION 0x10
  424. #define RH_C_PORT_ENABLE 0x11
  425. #define RH_C_PORT_SUSPEND 0x12
  426. #define RH_C_PORT_OVER_CURRENT 0x13
  427. #define RH_C_PORT_RESET 0x14
  428. /* Hub features */
  429. #define RH_C_HUB_LOCAL_POWER 0x00
  430. #define RH_C_HUB_OVER_CURRENT 0x01
  431. #define RH_DEVICE_REMOTE_WAKEUP 0x00
  432. #define RH_ENDPOINT_STALL 0x01
  433. #define RH_ACK 0x01
  434. #define RH_REQ_ERR -1
  435. #define RH_NACK 0x00