@@ -237,6 +237,7 @@ static bool_t raw_type_open(struct image *im, const struct raw_type *type)
237
237
238
238
struct tag_layout {
239
239
struct simple_layout s ;
240
+ uint16_t img_bps ;
240
241
uint8_t no [256 ];
241
242
};
242
243
@@ -262,6 +263,7 @@ static void tag_add_layout(
262
263
trk -> cskew = layout -> s .cskew ;
263
264
trk -> hskew = layout -> s .hskew ;
264
265
trk -> head = layout -> s .head ;
266
+ trk -> img_bps = layout -> img_bps ;
265
267
266
268
sec = & im -> img .sec_info_base [trk -> sec_off ];
267
269
for (i = 0 ; i < layout -> s .nr_sectors ; i ++ ) {
@@ -280,6 +282,7 @@ static bool_t tag_open(struct image *im, char *tag)
280
282
IMGCFG_step ,
281
283
IMGCFG_secs ,
282
284
IMGCFG_bps ,
285
+ IMGCFG_img_bps ,
283
286
IMGCFG_id ,
284
287
IMGCFG_h ,
285
288
IMGCFG_mode ,
@@ -303,6 +306,7 @@ static bool_t tag_open(struct image *im, char *tag)
303
306
[IMGCFG_step ] = { "step" },
304
307
[IMGCFG_secs ] = { "secs" },
305
308
[IMGCFG_bps ] = { "bps" },
309
+ [IMGCFG_img_bps ] = { "img_bps" },
306
310
[IMGCFG_id ] = { "id" },
307
311
[IMGCFG_h ] = { "h" },
308
312
[IMGCFG_mode ] = { "mode" },
@@ -380,6 +384,7 @@ static bool_t tag_open(struct image *im, char *tag)
380
384
match = active ;
381
385
reset_all_params (im );
382
386
heap -> d_layout .s = dfl_simple_layout ;
387
+ heap -> d_layout .img_bps = 0 ;
383
388
memset (heap -> d_layout .no , ~0 , sizeof (heap -> d_layout .no ));
384
389
heap -> t_layout = heap -> d_layout ;
385
390
nr_t = 0 ;
@@ -451,6 +456,9 @@ static bool_t tag_open(struct image *im, char *tag)
451
456
memset (& heap -> t_layout .no [i ], no , sizeof (heap -> t_layout .no )- i );
452
457
break ;
453
458
}
459
+ case IMGCFG_img_bps :
460
+ heap -> t_layout .img_bps = strtol (opts .arg , NULL , 0 );
461
+ break ;
454
462
case IMGCFG_id :
455
463
heap -> t_layout .s .base [0 ] = strtol (opts .arg , NULL , 0 );
456
464
break ;
@@ -1763,10 +1771,14 @@ static void raw_seek_track(
1763
1771
if (file_idx (im , i , j ) >= idx )
1764
1772
continue ;
1765
1773
trk = & im -> img .trk_info [im -> img .trk_map [i * im -> nr_sides + j ]];
1766
- sec = & im -> img .sec_info_base [trk -> sec_off ];
1767
- for (k = 0 ; k < trk -> nr_sectors ; k ++ ) {
1768
- off += sec_sz (sec -> n );
1769
- sec ++ ;
1774
+ if (trk -> img_bps != 0 ) {
1775
+ off += trk -> nr_sectors * trk -> img_bps ;
1776
+ } else {
1777
+ sec = & im -> img .sec_info_base [trk -> sec_off ];
1778
+ for (k = 0 ; k < trk -> nr_sectors ; k ++ ) {
1779
+ off += sec_sz (sec -> n );
1780
+ sec ++ ;
1781
+ }
1770
1782
}
1771
1783
}
1772
1784
}
@@ -2041,9 +2053,12 @@ static bool_t raw_write_track(struct image *im)
2041
2053
2042
2054
if (im -> img .file_sec_offsets ) {
2043
2055
off = im -> img .file_sec_offsets [sec_nr ];
2056
+ } else if (trk -> img_bps != 0 ) {
2057
+ off = sec_nr * trk -> img_bps ;
2044
2058
} else {
2059
+ off = 0 ;
2045
2060
sec = im -> img .sec_info ;
2046
- for (i = off = 0 ; i < sec_nr ; i ++ )
2061
+ for (i = 0 ; i < sec_nr ; i ++ )
2047
2062
off += sec_sz (sec ++ -> n );
2048
2063
}
2049
2064
F_lseek (& im -> fp , im -> img .trk_off + off );
@@ -2101,7 +2116,7 @@ static void raw_dump_info(struct image *im)
2101
2116
im -> ticks_per_cell , im -> write_bc_ticks , trk -> has_iam );
2102
2117
printk (" interleave: %u, cskew %u, hskew %u\n " ,
2103
2118
trk -> interleave , trk -> cskew , trk -> hskew );
2104
- printk (" file-layout : %x\n" , im -> img .layout );
2119
+ printk (" file_layout : %x, img_bps: %u \n" , im -> img .layout , trk -> img_bps );
2105
2120
for (i = 0 ; i < trk -> nr_sectors ; i ++ ) {
2106
2121
struct raw_sec * sec = & im -> img .sec_info [im -> img .sec_map [i ]];
2107
2122
int hd = trk -> head ? trk -> head - 1 : im -> cur_track & 1 ;
@@ -2114,19 +2129,22 @@ static void raw_dump_info(struct image *im)
2114
2129
static void img_fetch_data (struct image * im )
2115
2130
{
2116
2131
struct image_buf * rd = & im -> bufs .read_data ;
2132
+ struct raw_trk * trk = im -> img .trk ;
2117
2133
uint8_t * buf = rd -> p ;
2118
2134
struct raw_sec * sec , * s ;
2119
2135
uint8_t sec_i ;
2120
2136
uint16_t off , len ;
2121
2137
2122
- if ((im -> img . trk -> nr_sectors == 0 ) || (rd -> prod != rd -> cons ))
2138
+ if ((trk -> nr_sectors == 0 ) || (rd -> prod != rd -> cons ))
2123
2139
return ;
2124
2140
2125
2141
sec_i = im -> img .sec_map [im -> img .trk_sec ];
2126
2142
sec = & im -> img .sec_info [sec_i ];
2127
2143
2128
2144
if (im -> img .file_sec_offsets ) {
2129
2145
off = im -> img .file_sec_offsets [sec_i ];
2146
+ } else if (trk -> img_bps != 0 ) {
2147
+ off = sec_i * trk -> img_bps ;
2130
2148
} else {
2131
2149
off = 0 ;
2132
2150
for (s = im -> img .sec_info ; s != sec ; s ++ )
@@ -2143,7 +2161,7 @@ static void img_fetch_data(struct image *im)
2143
2161
im -> img .rd_sec_pos ++ ;
2144
2162
} else {
2145
2163
im -> img .rd_sec_pos = 0 ;
2146
- if (++ im -> img .trk_sec >= im -> img . trk -> nr_sectors )
2164
+ if (++ im -> img .trk_sec >= trk -> nr_sectors )
2147
2165
im -> img .trk_sec = 0 ;
2148
2166
}
2149
2167
0 commit comments