verify_subchannel_encoder.c
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:2k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* test program for the sector formatting library */
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include "ecc.h"
  7. int main(int argc, char *argv[])
  8. {
  9. int fin;
  10. unsigned int sector = 0;
  11. unsigned int verified = 0;
  12. if (argc < 2) {
  13. fprintf(stderr, "Usage: %s 2448-byte-sector-filen", argv[0]);
  14. return 0;
  15. }
  16. if (argv[1][0] == '-') {
  17. fin = STDIN_FILENO;
  18. } else {
  19. fin = open(argv[1], O_RDONLY);
  20. }
  21. if (fin == -1) {
  22. perror("");
  23. fprintf(stderr, "could not open file %s for reading.n",argv[1]);
  24. exit(1);
  25. }
  26. for (; 1; sector++) {
  27. unsigned char inbuf[2448];
  28. unsigned char outbuf[96];
  29. unsigned char inbuf_copy[2448];
  30. int have_read;
  31. /* get one original sector */
  32. have_read = 0;
  33. while (2448 != have_read) {
  34. int retval;
  35. retval = read(fin, inbuf+have_read, 2448-have_read);
  36. if (retval < 0) break;
  37. if (retval == 0)
  38. break;
  39. have_read += retval;
  40. }
  41.         /* make a copy to work on */
  42. memcpy(inbuf_copy, inbuf, 2448);
  43. { int j;
  44.   int checked_ok = 0;
  45. for (j = 0; j < 4; j++) {
  46. if (decode_LSUB_P(inbuf_copy+2352+j*24) != 0) {
  47. break;
  48. }
  49. if (decode_LSUB_Q(inbuf_copy+2352+j*24) != 0) {
  50. break;
  51. }
  52. }
  53. if (j != 4) continue;
  54. }
  55. /* compact fields, move data over parity fields */
  56. memmove(inbuf_copy+2352+72+2, inbuf_copy+2352+72+4, 16);
  57. memmove(inbuf_copy+2352+68, inbuf_copy+2352+72, 18);
  58. memmove(inbuf_copy+2352+48+2, inbuf_copy+2352+48+4, 16+18);
  59. memmove(inbuf_copy+2352+44, inbuf_copy+2352+48, 18+18);
  60. memmove(inbuf_copy+2352+24+2, inbuf_copy+2352+24+4, 16+18+18);
  61. memmove(inbuf_copy+2352+20, inbuf_copy+2352+24, 18+18+18);
  62. memmove(inbuf_copy+2352+2, inbuf_copy+2352+4, 16+18+18+18);
  63. /* build expanded version */
  64. do_encode_sub(inbuf_copy+2352, outbuf, 0, 0);
  65. /* copy p and q subchannel from original */
  66. { int i;
  67. for (i = 0; i < 96; i++) {
  68. outbuf[i] |= inbuf[i+2352] & 0xc0;
  69. }
  70. }
  71. /* check subchannels */
  72. if (memcmp(outbuf, inbuf+2352, 96) != 0) {
  73. fprintf(stderr, "difference at sector %un", sector);
  74. { int i;
  75. for (i = 0; i < 96; i++) {
  76. fprintf(stderr, "%2d: Soll : 0x%02x,   0x%02x  : Ist,  %sn", i, inbuf[2352+i], outbuf[i], inbuf[2352+i]==outbuf[i] ? "true" : "false");
  77. }
  78. }
  79. } else verified++;
  80. }
  81. fprintf(stderr, "%u sectors, %u verified okn", sector, verified);
  82. close(fin);
  83. return 0;
  84. }