int make_mmc_partition(int total_block_count, unsigned char *mbr) { int block_start = 0, block_offset; SDInfo sdInfo; PartitionInfo partInfo[4]; /////////////////////////////////////////////////////////// memset((unsigned char *)&sdInfo, 0x00, sizeof(SDInfo)); /////////////////////////////////////////////////////////// get_SDInfo(total_block_count, &sdInfo); /////////////////////////////////////////////////////////// block_start = calc_unit(_10MB, sdInfo); block_offset = calc_unit(SYSTEM_PART_SIZE, sdInfo); partInfo[0].bootable = 0x00; partInfo[0].partitionId = 0x83; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[0]); /////////////////////////////////////////////////////////// block_start += block_offset; block_offset = calc_unit(USER_DATA_PART_SIZE, sdInfo); partInfo[1].bootable = 0x00; partInfo[1].partitionId = 0x83; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[1]); /////////////////////////////////////////////////////////// block_start += block_offset; block_offset = calc_unit(CACHE_PART_SIZE, sdInfo); partInfo[2].bootable = 0x00; partInfo[2].partitionId = 0x83; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[2]); /////////////////////////////////////////////////////////// block_start += block_offset; block_offset = BLOCK_END; partInfo[3].bootable = 0x00; partInfo[3].partitionId = 0x0C; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[3]); /////////////////////////////////////////////////////////// memset(mbr, 0x00, sizeof(mbr)); mbr[510] = 0x55; mbr[511] = 0xAA; encode_partitionInfo(partInfo[0], &mbr[0x1CE]); encode_partitionInfo(partInfo[1], &mbr[0x1DE]); encode_partitionInfo(partInfo[2], &mbr[0x1EE]); encode_partitionInfo(partInfo[3], &mbr[0x1BE]); return 0; }
void make_partitionInfo(int LBA_start, int count, SDInfo sdInfo, PartitionInfo *partInfo) { int temp = 0; int _10MB_unit; partInfo->block_start = LBA_start; if (sdInfo.addr_mode == CHS_MODE) { partInfo->C_start = partInfo->block_start / (sdInfo.H_end * sdInfo.S_end); temp = partInfo->block_start % (sdInfo.H_end * sdInfo.S_end); partInfo->H_start = temp / sdInfo.S_end; partInfo->S_start = temp % sdInfo.S_end + 1; if (count == BLOCK_END) { _10MB_unit = calc_unit(_10MB, sdInfo); partInfo->block_end = sdInfo.C_end * sdInfo.H_end * sdInfo.S_end - _10MB_unit - 1; partInfo->block_count = partInfo->block_end - partInfo->block_start + 1; partInfo->C_end = partInfo->block_end / sdInfo.unit; partInfo->H_end = sdInfo.H_end - 1; partInfo->S_end = sdInfo.S_end; } else { partInfo->block_count = count; partInfo->block_end = partInfo->block_start + count - 1; partInfo->C_end = partInfo->block_end / sdInfo.unit; temp = partInfo->block_end % sdInfo.unit; partInfo->H_end = temp / sdInfo.S_end; partInfo->S_end = temp % sdInfo.S_end + 1; } } else { partInfo->C_start = 0; partInfo->H_start = 1; partInfo->S_start = 1; partInfo->C_end = 1023; partInfo->H_end = 254; partInfo->S_end = 63; if (count == BLOCK_END) { _10MB_unit = calc_unit(_10MB, sdInfo); partInfo->block_end = sdInfo.total_block_count - _10MB_unit - 1; partInfo->block_count = partInfo->block_end - partInfo->block_start + 1; } else { partInfo->block_count = count; partInfo->block_end = partInfo->block_start + count - 1; } } }
void calc_all(){ int i,j; for(i = 1; i < LAYER_SIZE; i++){ for(j = 0; j < UNIT_SIZE; j++){ unit[i][j].value = sigmoid(SIGMOID_PARAM, calc_unit(unit[i][j])); } } }
// Calculates the angle between atoms i, j, and k in degrees. // Atom j is the central atom. double Molecule::calc_angle(int i, int j, int k) { // return acos((calc_unit(i, j, 0) * calc_unit(j, k, 0)) + // (calc_unit(i, j, 1) * calc_unit(j, k, 1)) + // (calc_unit(i, j, 2) * calc_unit(j, k, 2))) * (180.0/acos(-1.0)); return acos((calc_unit(j,i,0) * calc_unit(j,k,0)) + (calc_unit(j,i,1) * calc_unit(j,k,1)) + (calc_unit(j,i,2) * calc_unit(j,k,2))) * (180.0/acos(-1.0)); }
int make_mmc_partition(int total_block_count, unsigned char *mbr, int flag, char *argv[]) { int block_start = 0, block_offset; SDInfo sdInfo; PartitionInfo partInfo[4]; /////////////////////////////////////////////////////////// memset((unsigned char *)&sdInfo, 0x00, sizeof(SDInfo)); /////////////////////////////////////////////////////////// get_SDInfo(total_block_count, &sdInfo); /////////////////////////////////////////////////////////// // 반드시 Unit단위로 먼저 계산한다. block_start = calc_unit(CFG_PARTITION_START, sdInfo); if (flag) block_offset = calc_unit((unsigned long long)simple_strtoul(argv[3], NULL, 0)*1024*1024, sdInfo); else block_offset = calc_unit(SYSTEM_PART_SIZE, sdInfo); partInfo[0].bootable = 0x00; partInfo[0].partitionId = 0x83; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[0]); /////////////////////////////////////////////////////////// block_start += block_offset; if (flag) block_offset = calc_unit((unsigned long long)simple_strtoul(argv[4], NULL, 0)*1024*1024, sdInfo); else block_offset = calc_unit(USER_DATA_PART_SIZE, sdInfo); partInfo[1].bootable = 0x00; partInfo[1].partitionId = 0x83; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[1]); /////////////////////////////////////////////////////////// block_start += block_offset; if (flag) block_offset = calc_unit((unsigned long long)simple_strtoul(argv[5], NULL, 0)*1024*1024, sdInfo); else block_offset = calc_unit(CACHE_PART_SIZE, sdInfo); partInfo[2].bootable = 0x00; partInfo[2].partitionId = 0x83; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[2]); /////////////////////////////////////////////////////////// block_start += block_offset; block_offset = BLOCK_END; partInfo[3].bootable = 0x00; partInfo[3].partitionId = 0x0C; make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[3]); /////////////////////////////////////////////////////////// memset(mbr, 0x00, sizeof(mbr)); mbr[510] = 0x55; mbr[511] = 0xAA; encode_partitionInfo(partInfo[0], &mbr[0x1CE]); encode_partitionInfo(partInfo[1], &mbr[0x1DE]); encode_partitionInfo(partInfo[2], &mbr[0x1EE]); encode_partitionInfo(partInfo[3], &mbr[0x1BE]); return 0; }
int main(int argc, char *argv[]) { FILE *fp; int block_start = 0, block_offset = 0; int total_block_count; int part_deb = 0; int part_android = 0; SDInfo sdInfo; PartitionInfo partInfo[4]; unsigned char mbr[512]; if (argc != 2) { printf("Usage: sd_fdisk <device_file>\n"); return -1; } if (strcasestr(argv[0], "_deb")) { part_deb = 1; } else if (strcasestr(argv[0], "_android")) { part_android = 1; } memset((unsigned char *)&sdInfo, 0x00, sizeof(SDInfo)); total_block_count = get_sd_block_count(argv[1]); get_SDInfo(total_block_count, &sdInfo); memset(mbr, 0x00, sizeof(mbr)); mbr[510] = 0x55; mbr[511] = 0xAA; /* Reserved area */ block_offset = calc_unit(154624<<10, sdInfo); if (part_deb) { printf("Making partition table: Debian\n"); block_start += block_offset; partInfo[0].bootable = 0x00; partInfo[0].partitionId = 0x0C; block_offset = calc_unit(_100MB * 2, sdInfo); make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[0]); block_start += block_offset; partInfo[2].bootable = 0x00; partInfo[2].partitionId = 0x82; block_offset = calc_unit(_100MB * 4, sdInfo); make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[2]); block_start += block_offset; partInfo[1].bootable = 0x00; partInfo[1].partitionId = 0x83; make_partitionInfo(block_start, BLOCK_END, sdInfo, &partInfo[1]); encode_partitionInfo(partInfo[0], &mbr[0x1BE]); encode_partitionInfo(partInfo[1], &mbr[0x1CE]); encode_partitionInfo(partInfo[2], &mbr[0x1DE]); } else if (part_android) { printf("Making partition table: Android\n"); block_start += block_offset; partInfo[1].bootable = 0x00; partInfo[1].partitionId = 0x83; block_offset = calc_unit(_100MB * 2, sdInfo); make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[1]); block_start += block_offset; partInfo[2].bootable = 0x00; partInfo[2].partitionId = 0x83; block_offset = calc_unit(_100MB * 4, sdInfo); make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[2]); block_start += block_offset; partInfo[3].bootable = 0x00; partInfo[3].partitionId = 0x83; block_offset = calc_unit(_100MB * 4, sdInfo); make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[3]); block_start += block_offset; partInfo[0].bootable = 0x00; partInfo[0].partitionId = 0x0C; make_partitionInfo(block_start, BLOCK_END, sdInfo, &partInfo[0]); encode_partitionInfo(partInfo[0], &mbr[0x1BE]); encode_partitionInfo(partInfo[1], &mbr[0x1CE]); encode_partitionInfo(partInfo[2], &mbr[0x1DE]); encode_partitionInfo(partInfo[3], &mbr[0x1EE]); } else { /* Default partition table */ block_offset += BLOCK_END; partInfo[0].bootable = 0x00; partInfo[0].partitionId = 0x0C; make_partitionInfo(block_start, BLOCK_END, sdInfo, &partInfo[0]); encode_partitionInfo(partInfo[0], &mbr[0x1BE]); } fp = fopen("sd_mbr.dat", "wb"); fwrite(mbr, 1, sizeof(mbr), fp); fclose(fp); return 0; }
double Molecule::calc_angle_oop(int i, int j, int k, int l) { // \mathrm{sin } \theta_{ijkl} = \frac{\mathbf{\tilde{e}_{kj}} \times \mathbf{\tilde{e}_{kl}}}{\mathrm{sin } \phi_{jkl}} \cdot \mathbf{\tilde{e}_{ki}} // double ekj[3] = {calc_unit(k, j, 0), calc_unit(k, j, 1), calc_unit(k, j, 2)}; // double ekl[3] = {calc_unit(k, l, 0), calc_unit(k, l, 1), calc_unit(k, l, 2)}; // double eki[3] = {calc_unit(k, i, 0), calc_unit(k, i, 1), calc_unit(k, i, 2)}; // double ekj_cross_kl[3]; // ekj_cross_kl[0] = (ekj[1]*ekl[2]) - (ekj[2]*ekl[1]); // ekj_cross_kl[1] = (ekj[2]*ekl[0]) - (ekj[0]*ekl[2]); // ekj_cross_kl[2] = (ekj[0]*ekl[1]) - (ekj[1]*ekl[0]); // double ekj_cross_kl_dot_ki[3]; // ekj_cross_kl_dot_ki[0] = ekj_cross_kl[0] * eki[0]; // ekj_cross_kl_dot_ki[1] = ekj_cross_kl[1] * eki[1]; // ekj_cross_kl_dot_ki[2] = ekj_cross_kl[2] * eki[2]; // double theta = (ekj_cross_kl_dot_ki[0] + ekj_cross_kl_dot_ki[1] + ekj_cross_kl_dot_ki[2])/sin(angle(j,k,l)); // if (theta < -1.0) theta = asin(-1.0); // else if (theta > 1.0) theta = asin(1.0); // else theta = asin(theta); double ejkl_x = (calc_unit(k,j,1) * calc_unit(k,l,2)) - (calc_unit(k,j,2) * calc_unit(k,l,1)); double ejkl_y = (calc_unit(k,j,2) * calc_unit(k,l,0)) - (calc_unit(k,j,0) * calc_unit(k,l,2)); double ejkl_z = (calc_unit(k,j,0) * calc_unit(k,l,1)) - (calc_unit(k,j,1) * calc_unit(k,l,0)); double exx = ejkl_x * calc_unit(k,i,0); double eyy = ejkl_y * calc_unit(k,i,1); double ezz = ejkl_z * calc_unit(k,i,2); double theta = (exx + eyy + ezz)/sin(angle(j,k,l)); if (theta < -1.0) theta = asin(-1.0); else if (theta > 1.0) theta = asin(1.0); else theta = asin(theta); return theta * (180.0/acos(-1.0)); }