
- 1
- 2

SMBus problem bitte um hilfe
Die soll SMBus im Komputer scannen
SMBus auf meinem mainboard wird gefunden "Device_class 0xC0500"
Problemm ist das der scanner auf smbus alle geräte als gefunden anzeigt
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 #include <stdio.h> #include <conio.h> #include <iostream> #include <windows.h> #include "io.h" #define VDID_PIIX4 0x71138086 //82371AB/EB/MB PIIX4/E/M Power Management Controller. #define VDID_VIA596A 0x30501106 // VT82C596/A/B Power Management Controller #define VDID_VIA686A 0x30571106 // VT82C686/A/B Power Management Controller #define VDID_AMD756PM 0x740B1022 // AMD-756 Power Management Controller #define VDID_AMD766PM 0x74131022 // AMD-766 Power Management Controller #define VDID_AMD768PM 0x74431022 // AMD-768 ACPI Controller #define VDID_AMD8111PM 0x746B1022 // AMD-8111 ACPI System Management Controller #define Adress_port 0xCF8 #define Data_port 0xCFC #define No_device 0xFFFFFFFF #define PCI_adresse 0x80000000 #define PCI_Count_ad 0x100 #define PCI_End_adresse 0x80FFFF00 long Get_SMBus_Adress(void) { long i=PCI_adresse; long Adresse = 0; long PCI_Data =0; long Device_class =0; long SMBUS_adresse =0; long ii=0; for(i=PCI_adresse;i<PCI_End_adresse;i=i+PCI_Count_ad) { Adresse=i & 0xFFFFFF00; PortDWordOut (Adress_port, Adresse); PCI_Data = PortDWordIn(Data_port); if (PCI_Data != 0x0FFFFFFFF) { //printf("%x\n",PCI_Data); switch (PCI_Data) { case VDID_PIIX4: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); case VDID_VIA596A: PortDWordOut (Adress_port, Adresse + 0x80); SMBUS_adresse = PortDWordIn(Data_port); case VDID_VIA686A: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); case VDID_AMD756PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); case VDID_AMD766PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); case VDID_AMD768PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); case VDID_AMD8111PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); } if(SMBUS_adresse) break; PortDWordOut (Adress_port, Adresse + 0x8); Device_class = PortDWordIn(Data_port); Device_class=(Device_class>>8); //printf("%x\n",Device_class); if(Device_class==0xC0500) { for(ii=0x10;ii<0x24;ii=ii+0x4) { PortDWordOut (Adress_port, Adresse + ii); SMBUS_adresse = PortDWordIn(Data_port); //printf("%x\n",SMBUS_adresse); if(SMBUS_adresse) break; } } if(SMBUS_adresse) break; } } return (SMBUS_adresse & 0x0FFF0); } void NEWIODELAY (void) { PortOut(0x0EB, 0xFF); } char TestSMBusDevice(char Dev,int SMBus_port) { char value=0; int i=0; char Device; Device=(Dev<<1); Device=Device | 1; PortOut(SMBus_port+4,Device); NEWIODELAY(); PortOut(SMBus_port+3,0); NEWIODELAY(); PortOut(SMBus_port+2,0x48); for(i=0;i<0x800;i++) { NEWIODELAY(); value = PortIn(SMBus_port); if(value && 2) { NEWIODELAY(); PortOut(SMBus_port,value); return(1); } } PortOut(SMBus_port+2,2); NEWIODELAY(); //value = PortIn(SMBus_port+2); return (0); } int main(int argc, char *argv[]) { LoadIODLL(); int SMBus_adresse=(int)Get_SMBus_Adress(); unsigned char i=0; printf("SMBus Adresse %x\n",SMBus_adresse); for(i=0;i<255;i++) { if(TestSMBusDevice(i,SMBus_adresse)==1) printf("Device found 0x%i\n",i); NEWIODELAY(); } system("PAUSE"); return EXIT_SUCCESS; }
|
|
C/C++-Quelltext |
1 |
if(SMBUS_adresse) break; |
das programm funz so
in function
Get_SMBus_Adress()
wird alle PCI devices gescant und ein besstimtes rausgesucht
bei mir ASROCK also chipsatz von AMD ist das 0xC0500
wenn das gefunden ist wird die adresse aus der PCI configuration space ausgelesen
und zurückgegeben
dann in der function TestSMBusDevice()
wird ein SMBus device abgefragt
und da passiert
werden alle geräte als vorhanden angezeigt
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »gen4ik« (30. September 2010, 21:30)
Ich verstehe den Bezug zu deinem Codebeispiel nicht. Ich sprach von der switch Anweisung.
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
switch (PCI_Data)
{
case VDID_PIIX4:
PortDWordOut (Adress_port, Adresse + 0x90);
SMBUS_adresse = PortDWordIn(Data_port);
break;
case VDID_VIA596A:
PortDWordOut (Adress_port, Adresse + 0x80);
SMBUS_adresse = PortDWordIn(Data_port);
break;
case VDID_VIA686A:
PortDWordOut (Adress_port, Adresse + 0x90);
SMBUS_adresse = PortDWordIn(Data_port);
break;
case VDID_AMD756PM:
PortDWordOut (Adress_port, Adresse + 0x58);
SMBUS_adresse = PortDWordIn(Data_port);
break;
case VDID_AMD766PM:
PortDWordOut (Adress_port, Adresse + 0x58);
SMBUS_adresse = PortDWordIn(Data_port);
break;
case VDID_AMD768PM:
PortDWordOut (Adress_port, Adresse + 0x58);
SMBUS_adresse = PortDWordIn(Data_port);
break;
case VDID_AMD8111PM:
PortDWordOut (Adress_port, Adresse + 0x58);
SMBUS_adresse = PortDWordIn(Data_port);
break;
}
|
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ivanhoe« (30. September 2010, 21:40)
wir diese switch nicht gebraucht !
hier was du meinst
hier was ich meine
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »gen4ik« (30. September 2010, 21:47)
Ohne es wird der Inhalt nachfolgender cases ebenfalls ausgeführt.
Edit: Trotzdem solltest du die breaks setzen, denn wenn z.B. VDID_PIIX4 vorhanden wäre, würde der Code für die übrige Hardware auch ausgeführt werden.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ivanhoe« (30. September 2010, 21:58)
hier ist der projekt
smbus.7z
hier bisschen besser
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 #include <stdio.h> #include <conio.h> #include <iostream> #include <windows.h> #include "io.h" #define VDID_PIIX4 0x71138086 //82371AB/EB/MB PIIX4/E/M Power Management Controller. #define VDID_VIA596A 0x30501106 // VT82C596/A/B Power Management Controller #define VDID_VIA686A 0x30571106 // VT82C686/A/B Power Management Controller #define VDID_AMD756PM 0x740B1022 // AMD-756 Power Management Controller #define VDID_AMD766PM 0x74131022 // AMD-766 Power Management Controller #define VDID_AMD768PM 0x74431022 // AMD-768 ACPI Controller #define VDID_AMD8111PM 0x746B1022 // AMD-8111 ACPI System Management Controller #define ATI_SMBus 0x43851002 // Advanced Micro Devices, Inc.","ATI RD600/RS600","ATI SMBus" #define Adress_port 0xCF8 #define Data_port 0xCFC #define No_device 0xFFFFFFFF #define PCI_adresse 0x80000000 #define PCI_Count_ad 0x100 #define PCI_End_adresse 0x80FFFF00 long Get_SMBus_Adress(void) { long i=PCI_adresse; long Adresse = 0; long PCI_Data =0; long Device_class =0; long SMBUS_adresse =0; long ii=0; for(i=PCI_adresse;i<PCI_End_adresse;i=i+PCI_Count_ad) { Adresse=i & 0xFFFFFF00; PortDWordOut (Adress_port, Adresse); PCI_Data = PortDWordIn(Data_port); if (PCI_Data != 0x0FFFFFFFF) { switch (PCI_Data) { case VDID_PIIX4: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_VIA596A: PortDWordOut (Adress_port, Adresse + 0x80); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_VIA686A: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD756PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD766PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD768PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD8111PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case ATI_SMBus: for(ii=0x10;ii<0x24;ii=ii+0x4) { PortDWordOut (Adress_port, Adresse + ii); SMBUS_adresse = PortDWordIn(Data_port); //printf("%x\n",SMBUS_adresse); if(SMBUS_adresse) break; } break; } printf("%x\n",PCI_Data); if(SMBUS_adresse) break; } } return (SMBUS_adresse & 0x0FFF0); } void NEWIODELAY (void) { PortOut(0x0EB, 0xFF); } char TestSMBusDevice(char Dev,int SMBus_port) { char value=0; int i=0; char Device; Device=(Dev<<1); Device=Device | 1; PortOut(SMBus_port+4,Device); NEWIODELAY(); PortOut(SMBus_port+3,0); NEWIODELAY(); PortOut(SMBus_port+2,0x48); for(i=0;i<0x800;i++) { NEWIODELAY(); value = PortIn(SMBus_port); if(value && 2) { NEWIODELAY(); PortOut(SMBus_port,value); return(1); } } PortOut(SMBus_port+2,2); NEWIODELAY(); //value = PortIn(SMBus_port+2); return (0); } int main(int argc, char *argv[]) { LoadIODLL(); int SMBus_adresse=(int)Get_SMBus_Adress(); if(SMBus_adresse!=0) { unsigned char i=0; printf("SMBus Adresse %x\n",SMBus_adresse); for(i=0;i<255;i++) { if(TestSMBusDevice(i,SMBus_adresse)==1) printf("Device found 0x%i\n",i); NEWIODELAY(); } } system("PAUSE"); return EXIT_SUCCESS; }
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »gen4ik« (30. September 2010, 22:14)
am besten deutsch
da wird geprüft ob bit 2 gesezt ist
0b00000010 && 0x2 =true
und hier ein link
leider in assembler und in russisch
http://www.xlevel.ru/forum/YaBB.cgi?boar…;num=1186920031
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »gen4ik« (30. September 2010, 22:27)
problemm die ganze zeit time out
nach gefühl ist fast eine sekunde
ich poste nur die char TestSMBusDevice(char Dev,int SMBus_port)
der rest ist gleich geblieben
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 char TestSMBusDevice(char Dev,int SMBus_port) { char value=0; int i=0; char Device; char ret=0; unsigned long timeout=650000; Device=(Dev<<1); Device=Device | 1; PortOut(SMBus_port+4,Device);//device 7:1,read/write 0:0 -> 1=read NEWIODELAY(); PortOut(SMBus_port+3,0);//device command NEWIODELAY(); PortOut(SMBus_port+2,0x48);//Host Control Register ->0b010 010 0 0 //INTREN — R/W 0 //KILL — R/W 1 //SMB_CMD — R/W 4:2 //000= Quick command XMIT_SLVA //001= Byte //010= Byte Data //011= Word Data //100= Process Call //101= Block //110= I2C //111= Block Process //LAST_BYTE 5 //START — WO 6 ->1 start //PEC_EN — R/W /* for(i=0;i<0x800;i++)//Pause { NEWIODELAY(); value = PortIn(SMBus_port); if(!(value && 1))//busy break; } */ NEWIODELAY(); value = PortIn(SMBus_port); while(value && 1) { NEWIODELAY(); value = PortIn(SMBus_port); timeout--; if(timeout==0) break; } if (timeout==0) { printf("time out \n"); NEWIODELAY(); PortOut(SMBus_port+2,2); return 0; } if(value && 2)//INTR – R/WC ret=1; if(value && 4)//error ret= 0; NEWIODELAY(); PortOut(SMBus_port,value); NEWIODELAY(); PortOut(SMBus_port+2,2); //value = PortIn(SMBus_port+2); return ret; }
edit:
Rechner neu starten hilft ab und zu mal
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »gen4ik« (1. Oktober 2010, 12:42)
SMBus wird gefunden und man kann in ansprechen
aber so bald ich versuche ein device auf dem bus anzusprechen
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
PortOut(SMBus_port+4,Device);//device 7:1,read/write 0:0 -> 1=read NEWIODELAY(); PortOut(SMBus_port+3,0);//device command NEWIODELAY(); PortOut(SMBus_port+2,0x48);//Host Control Register ->0b010 010 0 0 //INTREN — R/W 0 //KILL — R/W 1 //SMB_CMD — R/W 4:2 //000= Quick command XMIT_SLVA //001= Byte //010= Byte Data //011= Word Data //100= Process Call //101= Block //110= I2C //111= Block Process //LAST_BYTE 5 //START — WO 6 ->1 start //PEC_EN — R/W |
wir in statusregister busy bit gesezt und geht nicht weg
ich habe es versucht zu löschen mit Killbit, geht auch nicht
hier ist das quellcode
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 #include <stdio.h> #include <conio.h> #include <iostream> #include <windows.h> #include "io.h" #define VDID_PIIX4 0x71138086 //82371AB/EB/MB PIIX4/E/M Power Management Controller. #define VDID_VIA596A 0x30501106 // VT82C596/A/B Power Management Controller #define VDID_VIA686A 0x30571106 // VT82C686/A/B Power Management Controller #define VDID_AMD756PM 0x740B1022 // AMD-756 Power Management Controller #define VDID_AMD766PM 0x74131022 // AMD-766 Power Management Controller #define VDID_AMD768PM 0x74431022 // AMD-768 ACPI Controller #define VDID_AMD8111PM 0x746B1022 // AMD-8111 ACPI System Management Controller #define ATI_SMBus 0x43851002 // Advanced Micro Devices, Inc.","ATI RD600/RS600","ATI SMBus" #define Adress_port 0xCF8 #define Data_port 0xCFC #define No_device 0xFFFFFFFF #define PCI_adresse 0x80000000 #define PCI_Count_ad 0x100 #define PCI_End_adresse 0x80FFFF00 unsigned int Get_SMBus_Adress(void) { long i=PCI_adresse; long Adresse = 0; long PCI_Data =0; long Device_class =0; long SMBUS_adresse =0; long ii=0; for(i=PCI_adresse;i<PCI_End_adresse;i=i+PCI_Count_ad) { Adresse=i & 0xFFFFFF00; PortDWordOut (Adress_port, Adresse); PCI_Data = PortDWordIn(Data_port); if (PCI_Data != 0x0FFFFFFFF) { switch (PCI_Data) { case VDID_PIIX4: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_VIA596A: PortDWordOut (Adress_port, Adresse + 0x80); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_VIA686A: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD756PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD766PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD768PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD8111PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case ATI_SMBus: for(ii=0x10;ii<0x24;ii=ii+0x4) { PortDWordOut (Adress_port, Adresse + ii); SMBUS_adresse = PortDWordIn(Data_port); //printf("%x\n",SMBUS_adresse); if(SMBUS_adresse) break; } break; } //printf("%x\n",PCI_Data); if(SMBUS_adresse) break; } } return (unsigned int)(SMBUS_adresse & 0x0FFF0); } void NEWIODELAY (void) { PortOut(0x0EB, 0xFF); } char TestSMBusDevice(char Dev,unsigned int SMBus_port) { char value=0; int i=0; char Device; char ret=0; unsigned long timeout=650000; Device=(Dev<<1); Device=Device | 1; PortOut(SMBus_port+4,Device);//device 7:1,read/write 0:0 -> 1=read NEWIODELAY(); PortOut(SMBus_port+3,0);//device command NEWIODELAY(); PortOut(SMBus_port+2,0x48);//Host Control Register ->0b010 010 0 0 //INTREN — R/W 0 //KILL — R/W 1 //SMB_CMD — R/W 4:2 //000= Quick command XMIT_SLVA //001= Byte //010= Byte Data //011= Word Data //100= Process Call //101= Block //110= I2C //111= Block Process //LAST_BYTE 5 //START — WO 6 ->1 start //PEC_EN — R/W /* for(i=0;i<0x800;i++)//Pause { NEWIODELAY(); value = PortIn(SMBus_port); if(!(value && 1))//busy break; } */ NEWIODELAY(); value = PortIn(SMBus_port); while(value && 1) { NEWIODELAY(); value = PortIn(SMBus_port); timeout--; if(timeout==0) break; } if (timeout==0) { printf("time out \n"); NEWIODELAY(); PortOut(SMBus_port+2,2);//Kill bit NEWIODELAY(); PortOut(SMBus_port+2,0x0); NEWIODELAY(); PortOut(SMBus_port,0xFF); return 0; } if(value && 2)//INTR – R/WC ret=1; if(value && 4)//error ret= 0; NEWIODELAY(); PortOut(SMBus_port+2,0x0); return ret; } char SMBus_busy(unsigned int SMBus_port) { NEWIODELAY(); return (PortIn(SMBus_port) & 0x1); } void SMBus_print_register(unsigned int SMBus_port) { unsigned char value=0; NEWIODELAY(); value = PortIn(SMBus_port); printf("Status: %x\n",value); NEWIODELAY(); value = PortIn(SMBus_port+2); printf("Controll: %x\n",value); } int main(int argc, char *argv[]) { unsigned int SMBus_adresse=0; unsigned char i=0; LoadIODLL(); SMBus_adresse=Get_SMBus_Adress(); if (SMBus_adresse==0) { printf("SMBus device not found!\n"); system("PAUSE"); return EXIT_SUCCESS; } printf("SMBus found!\n"); printf("SMBus Adresse %x\n",SMBus_adresse); if(SMBus_busy(SMBus_adresse)) { printf("SMBus busy!\n"); system("PAUSE"); return EXIT_SUCCESS; } for(i=0;i<255;i++) { if(TestSMBusDevice(i,SMBus_adresse)==1) printf("Device found 0x%i\n",i); NEWIODELAY(); } system("PAUSE"); return EXIT_SUCCESS; }
bein neu start resete ich den controller und busybit ist nicht gesezt
speedfan macht auch smbus scann. So bal ich mein programm starte, zeigt speedfan alle geräte als busy
MOV DX, [SMBusAddr]
ADD DX, 4 ;+4 adresse XMIT_SLVA
SHL AL, 1
OR AL, 1 ; lesen
OUT DX, AL
NEWIODELAY
DEC DX ;+3 HST_CMD kommand register , für EEPROM
XOR AL,AL
OUT DX,AL
NEWIODELAY
DEC DX ;+2 anfangen zu senden HST_CNT
MOV AL, 01001000b ;START=1 SMB_CMD =010b Byte Data
OUT DX, AL
SUB DX, 2 ;+0 anfangen zu senden HST_STS
MOV CX, 0800h ; zeit zum ausführen 0.0012207 sekunden für senden 40bit in 2 richtungen 32768 bit/s
.Loop:
NEWIODELAY
IN AL, DX
TEST AL, 2
JNZ .ok
LOOP .Loop
; timeout
ADD DX,2
MOV AL,2 ; sezen Kill bit
OUT DX,AL
SUB DX,2
IN AL, DX
.ok:
NEWIODELAY
OUT DX, AL ; Löschen
AND AL, 02H ;INTR zu ende?
SHR AL, 1 ; alles ok
POP ECX
POP EDX
RET
das ist jezt so wie in assembler
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 #include <stdio.h> #include <conio.h> #include <iostream> #include <windows.h> #include "io.h" #define VDID_PIIX4 0x71138086 //82371AB/EB/MB PIIX4/E/M Power Management Controller. #define VDID_VIA596A 0x30501106 // VT82C596/A/B Power Management Controller #define VDID_VIA686A 0x30571106 // VT82C686/A/B Power Management Controller #define VDID_AMD756PM 0x740B1022 // AMD-756 Power Management Controller #define VDID_AMD766PM 0x74131022 // AMD-766 Power Management Controller #define VDID_AMD768PM 0x74431022 // AMD-768 ACPI Controller #define VDID_AMD8111PM 0x746B1022 // AMD-8111 ACPI System Management Controller #define ATI_SMBus 0x43851002 // Advanced Micro Devices, Inc.","ATI RD600/RS600","ATI SMBus" #define Adress_port 0xCF8 #define Data_port 0xCFC #define No_device 0xFFFFFFFF #define PCI_adresse 0x80000000 #define PCI_Count_ad 0x100 #define PCI_End_adresse 0x80FFFF00 #define NEWIODELAY() PortOut(0x0EB, 0xFF) unsigned int Get_SMBus_Adress(void) { long i=PCI_adresse; long Adresse = 0; long PCI_Data =0; long Device_class =0; long SMBUS_adresse =0; long ii=0; for(i=PCI_adresse;i<PCI_End_adresse;i=i+PCI_Count_ad) { Adresse=i & 0xFFFFFF00; PortDWordOut (Adress_port, Adresse); PCI_Data = PortDWordIn(Data_port); if (PCI_Data != 0x0FFFFFFFF) { switch (PCI_Data) { case VDID_PIIX4: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_VIA596A: PortDWordOut (Adress_port, Adresse + 0x80); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_VIA686A: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD756PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD766PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD768PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD8111PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case ATI_SMBus: for(ii=0x10;ii<0x24;ii=ii+0x4) { PortDWordOut (Adress_port, Adresse + ii); SMBUS_adresse = PortDWordIn(Data_port); //printf("%x\n",SMBUS_adresse); if(SMBUS_adresse) break; } break; } //printf("%x\n",PCI_Data); if(SMBUS_adresse) break; } } return (unsigned int)(SMBUS_adresse & 0x0FFF0); } char TestSMBusDevice(char Dev,unsigned int SMBus_port) { char value=0; int i=0; char Device; char ret=0; unsigned long timeout=650000; Device=(Dev<<1); Device=Device | 1; PortOut(SMBus_port+4,Device);//device 7:1,read/write 0:0 -> 1=read NEWIODELAY(); PortOut(SMBus_port+3,0);//device command NEWIODELAY(); PortOut(SMBus_port+2,0x48);//01001000b ;START=1 SMB_CMD =010b Byte Data NEWIODELAY(); //Host Control Register ->0b010 010 0 0 //INTREN — R/W 0 //KILL — R/W 1 //SMB_CMD — R/W 4:2 //000= Quick command XMIT_SLVA //001= Byte //010= Byte Data //011= Word Data //100= Process Call //101= Block //110= I2C //111= Block Process //LAST_BYTE 5 //START — WO 6 ->1 start //PEC_EN — R/W /* ; timeout ADD DX,2 +2 MOV AL,2 ; sezen Kill bit OUT DX,AL .ok: NEWIODELAY OUT DX, AL ; Löschen AND AL, 02H ;INTR zu ende? SHR AL, 1 ; alles ok */ value = 0; while(!(value && 2)) { NEWIODELAY(); value = PortIn(SMBus_port); timeout--; if(timeout==0) break; } if (timeout==0) { printf("time out \n"); PortOut(SMBus_port+2,2);//killbit ret= 0; } else { ret=1; } value = PortIn(SMBus_port); NEWIODELAY(); PortOut(SMBus_port,value); return ret; } char SMBus_busy(unsigned int SMBus_port) { NEWIODELAY(); return (PortIn(SMBus_port) & 0x1); } void SMBus_print_register(unsigned int SMBus_port) { unsigned char value=0; NEWIODELAY(); value = PortIn(SMBus_port); printf("Status: %x\n",value); NEWIODELAY(); value = PortIn(SMBus_port+2); printf("Controll: %x\n",value); } int main(int argc, char *argv[]) { unsigned int SMBus_adresse=0; unsigned char i=0; LoadIODLL(); SMBus_adresse=Get_SMBus_Adress(); if (SMBus_adresse==0) { printf("SMBus device not found!\n"); system("PAUSE"); return EXIT_SUCCESS; } printf("SMBus found!\n"); printf("SMBus Adresse %x\n",SMBus_adresse); if(SMBus_busy(SMBus_adresse)) { printf("SMBus busy!\n"); system("PAUSE"); return EXIT_SUCCESS; } for(i=0;i<254;i++) { if(TestSMBusDevice(i,SMBus_adresse)==1) printf("Device found 0x%i\n",i); NEWIODELAY(); } system("PAUSE"); return EXIT_SUCCESS; }
und zeigt alle geräte als vorhanden 254 geräte
danach ist controller besezt
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »gen4ik« (1. Oktober 2010, 21:05)
aber optimirung ist aus
oder die zeit reicht nicht aus um befehl auszuführen?
jezt geht glaube ich
auf jeden fall speedfan zeigt nicht busy nach dem start von dem programm
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 #include <stdio.h> #include <conio.h> #include <iostream> #include <windows.h> #include "io.h" #define VDID_PIIX4 0x71138086 //82371AB/EB/MB PIIX4/E/M Power Management Controller. #define VDID_VIA596A 0x30501106 // VT82C596/A/B Power Management Controller #define VDID_VIA686A 0x30571106 // VT82C686/A/B Power Management Controller #define VDID_AMD756PM 0x740B1022 // AMD-756 Power Management Controller #define VDID_AMD766PM 0x74131022 // AMD-766 Power Management Controller #define VDID_AMD768PM 0x74431022 // AMD-768 ACPI Controller #define VDID_AMD8111PM 0x746B1022 // AMD-8111 ACPI System Management Controller #define ATI_SMBus 0x43851002 // Advanced Micro Devices, Inc.","ATI RD600/RS600","ATI SMBus" #define Adress_port 0xCF8 #define Data_port 0xCFC #define No_device 0xFFFFFFFF #define PCI_adresse 0x80000000 #define PCI_Count_ad 0x100 #define PCI_End_adresse 0x80FFFF00 #define NEWIODELAY() PortOut(0x0EB, 0xFF) void delay(unsigned int count) { while(count) { asm ("NOP"); count--; } } unsigned int Get_SMBus_Adress(void) { long i=PCI_adresse; long Adresse = 0; long PCI_Data =0; long Device_class =0; long SMBUS_adresse =0; long ii=0; for(i=PCI_adresse;i<PCI_End_adresse;i=i+PCI_Count_ad) { Adresse=i & 0xFFFFFF00; PortDWordOut (Adress_port, Adresse); PCI_Data = PortDWordIn(Data_port); if (PCI_Data != 0x0FFFFFFFF) { switch (PCI_Data) { case VDID_PIIX4: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_VIA596A: PortDWordOut (Adress_port, Adresse + 0x80); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_VIA686A: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD756PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD766PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD768PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD8111PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case ATI_SMBus: for(ii=0x10;ii<0x24;ii=ii+0x4) { PortDWordOut (Adress_port, Adresse + ii); SMBUS_adresse = PortDWordIn(Data_port); //printf("%x\n",SMBUS_adresse); if(SMBUS_adresse) break; } break; } //printf("%x\n",PCI_Data); if(SMBUS_adresse) break; } } return (unsigned int)(SMBUS_adresse & 0x0FFF0); } char TestSMBusDevice(char Dev,unsigned int SMBus_port) { char value=0; int i=0; char Device; char ret=0; unsigned long timeout=650000; Device=(Dev<<1); Device=Device | 1; PortOut(SMBus_port+4,Device);//device 7:1,read/write 0:0 -> 1=read //NEWIODELAY(); delay(1000); PortOut(SMBus_port+3,0);//device command //NEWIODELAY(); delay(1000); PortOut(SMBus_port+2,0x48);//01001000b ;START=1 SMB_CMD =010b Byte Data //NEWIODELAY(); delay(1000); //Host Control Register ->0b010 010 0 0 //INTREN — R/W 0 //KILL — R/W 1 //SMB_CMD — R/W 4:2 //000= Quick command XMIT_SLVA //001= Byte //010= Byte Data //011= Word Data //100= Process Call //101= Block //110= I2C //111= Block Process //LAST_BYTE 5 //START — WO 6 ->1 start //PEC_EN — R/W /* ; timeout ADD DX,2 +2 MOV AL,2 ; sezen Kill bit OUT DX,AL .ok: NEWIODELAY OUT DX, AL ; Löschen AND AL, 02H ;INTR zu ende? SHR AL, 1 ; alles ok */ value = 0; while(timeout) { //NEWIODELAY(); delay(1000); value = PortIn(SMBus_port); timeout--; if(value && 2) break; } if (timeout==0) { printf("time out \n"); PortOut(SMBus_port+2,2);//killbit ret= 0; } else { ret=1; } value = PortIn(SMBus_port); //NEWIODELAY(); delay(1000); PortOut(SMBus_port,value); return ret; } char SMBus_busy(unsigned int SMBus_port) { //NEWIODELAY(); delay(1000); return (PortIn(SMBus_port) & 0x1); } void wait_busy(unsigned int SMBus_port) { while(PortIn(SMBus_port) & 0x1) delay(1000); } void SMBus_print_register(unsigned int SMBus_port) { unsigned char value=0; //NEWIODELAY(); delay(1000); value = PortIn(SMBus_port); printf("Status: %x\n",value); //NEWIODELAY(); delay(1000); value = PortIn(SMBus_port+2); printf("Controll: %x\n",value); } char ReadByteSMBus(unsigned int SMBus_port,unsigned char device_nummer,unsigned char cmmd,unsigned char *data) { char value=0; int i=0; char Device; char ret=0; unsigned long timeout=650000; Device=(device_nummer<<1); Device=Device | 1; PortOut(SMBus_port+4,Device);//device 7:1,read/write 0:0 -> 1=read //NEWIODELAY(); delay(1000); PortOut(SMBus_port+3,cmmd);//device command //NEWIODELAY(); delay(1000); PortOut(SMBus_port+2,0x48);//01001000b ;START=1 SMB_CMD =010b Byte Data //NEWIODELAY(); delay(1000); while(timeout) { //NEWIODELAY(); delay(1000); value = PortIn(SMBus_port); timeout--; if(value && 2) break; } if (timeout==0) { printf("time out \n"); PortOut(SMBus_port+2,2);//killbit ret= -1; } else { ret=1; } value = PortIn(SMBus_port); //NEWIODELAY(); delay(1000); PortOut(SMBus_port,value); value = PortIn(SMBus_port+5); *data=value; return ret; } int main(int argc, char *argv[]) { unsigned int SMBus_adresse=0; unsigned char i=0; char value=0; unsigned char data=0; LoadIODLL(); SMBus_adresse=Get_SMBus_Adress(); if (SMBus_adresse==0) { printf("SMBus device not found!\n"); system("PAUSE"); return EXIT_SUCCESS; } printf("SMBus found!\n"); printf("SMBus Adresse %x\n",SMBus_adresse); //char ReadByteSMBus(unsigned int SMBus_port,unsigned char device_nummer,unsigned char cmmd,unsigned char *data) SMBus_print_register(SMBus_adresse); for(i=0;i<254;i++) { value=ReadByteSMBus(SMBus_adresse,i,0,&data); if(value==1) printf("Device found %i\n byte: %x\n",i,data); else if(value==-1) printf("time out"); else if(value==-2) printf("divice not found 0x%x",i); wait_busy(SMBus_adresse); } system("PAUSE"); return EXIT_SUCCESS; }
änderung:
abfrage busybit
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 |
for(i=0;i<254;i++) { value=ReadByteSMBus(SMBus_adresse,i,0,&data); if(value==1) printf("Device found %i\n byte: %x\n",i,data); else if(value==-1) printf("time out"); else if(value==-2) printf("divice not found 0x%x",i); wait_busy(SMBus_adresse); } |
daten port auslesen
|
|
C/C++-Quelltext |
1 |
value = PortIn(SMBus_port+5); |
scanner leuft
aber es werden alle geräte als vorhanden erkannt
hier das programm
smbus_win32.7z
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »gen4ik« (4. Oktober 2010, 11:48)
|
|
C/C++-Quelltext |
1 |
0b00000010 && 0x2
|
Was du willst ist eine Bitweise UND verknüpfung.
|
|
C/C++-Quelltext |
1 |
0b00000010 & 0x2
|
Imho solltest du die Finger von SMBus und co lassen solange du noch nicht wirklich programmieren kannst und dich an was leichterem versuchen...
Blog
|
|
C/C++-Quelltext |
1 2 3 4 5 6 7 8 |
if(0x82 && 0x2) //true unsigned char a; a=0x82 & 0x2; if(a)//true { } |
das programm leuft eindlich
das problemm ist , zum mindestens glaube ich
daß i2c bus also im PC heißt das SMBus. Und deren leitungen sind mit pullup wiederstand an + leitung
daswegen bekomme ich immer FF wenn kein gerät da ist.
bei SPD EEPROM bekome ich 0x80. Adresse 0x50-0x51 80-81. Kanst du auf dem bild sehen
Das ist nämlich die Datenlänge in EEPROM. Was in speicher riegel eingebaut ist.
EEPROM auslesen geht auch
Edit:
Bug mit doppelten 0x80 0x80 und widerholten 0xFF ist behoben
hier kanst du nachschauen
http://en.wikipedia.org/wiki/Serial_presence_detect
ich bin gespannt ob du überhaut das programm verstanden hast
und wenn du solche vorsläge giebst musst du erst das programm anschauen und zum teil verstehen
Zitat
Imho solltest du die Finger von SMBus und co lassen solange du noch nicht wirklich programmieren kannst und dich an was leichterem versuchen...
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »gen4ik« (4. Oktober 2010, 23:27)
kleiner bug wahr drine
änderung in busy bit überprufung
und zwar wird jetzt vor dem auslesen geprüft ob busybit gesezt ist
hier ist die neue version von ReadByteSMBus() function
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 unsigned char ReadByteSMBus(unsigned int SMBus_port,unsigned char device_nummer,unsigned char cmmd,unsigned char *data) { unsigned char value=0; unsigned char daten=0; unsigned char i=0; unsigned char Device; unsigned char ret=0; unsigned long timeout=TIMEOUT; Device=(device_nummer<<1); Device=Device | 1; PortOut(SMBus_port+4,Device);//device 7:1,read/write 0:0 -> 1=read NEWIODELAY(); PortOut(SMBus_port+3,cmmd);//device command NEWIODELAY(); PortOut(SMBus_port+2,0x48);//01001000b ;START=1 SMB_CMD =010b Byte Data NEWIODELAY(); while(timeout) { NEWIODELAY(); value = PortIn(SMBus_port); timeout--; if(value && 2) break; } if (timeout==0) { PortOut(SMBus_port+2,2);//killbit ret= 1; } value = PortIn(SMBus_port); NEWIODELAY(); PortOut(SMBus_port,value); if(wait_busy(SMBus_port)) ret= 2; daten = PortIn(SMBus_port+5); value = PortIn(SMBus_port); //if(value && 0x4) // ret=3; *data=daten; return ret; }
SPD EEPROM auslesen klapt 100%
io.dll ist hier zufinden
http://www.geekhideout.com/iodll.shtml
hier kompletes programm
smbus_win32.7z
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »gen4ik« (4. Oktober 2010, 23:36)
main.h
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 #define CM_PCI_SCAN 9072 #define CM_PCI_DUMP 9071 #define CM_SMB_SCAN 9070 #define CM_SMB_SPD 9069 #define CM_SMB_DUMP 9068
main.cpp
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 #include <windows.h> #include <stdio.h> #include <string.h> #include "main.h" #include "smbus.h" #define IDC_MAIN_TEXT 1001 using namespace std; static char g_szClassName[] = "MyWindowClass"; static HINSTANCE g_hInst = NULL; static HWND text_hwnd = NULL; /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ g_hInst = hThisInstance; /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = "MAINMENU"; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( WS_EX_CLIENTEDGE, /* Extended possibilites for variation */ szClassName, /* Classname */ "Scanner", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ NULL, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nFunsterStil); LoadIODLL(); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } void smb_scann(void) { unsigned char i=0; unsigned char ant=0; unsigned char daten=0; HANDLE hFile; DWORD len1; LPDWORD len2; char txt_buff[255]; DWORD len_text=0; hFile = CreateFile("c:\\smb_scann.txt", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if(hFile != INVALID_HANDLE_VALUE) { for (i=0;i<254;i++) { //char ReadByteSMBus(unsigned int SMBus_port,unsigned char device_nummer,unsigned char cmmd,unsigned char *data); ant=ReadByteSMBus(Get_SMBus_Adress(),i,0,&daten); if ((ant==0) ) { len_text=sprintf(txt_buff,"SMBus gerat gefunden Nummer: %i daten: %X\r\n",i,daten); if(!(WriteFile(hFile, &txt_buff, len_text, len2, NULL))) return; } } CloseHandle(hFile); hFile = CreateFile("c:\\smb_scann.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if(hFile != INVALID_HANDLE_VALUE) { DWORD dwFileSize; dwFileSize = GetFileSize(hFile, NULL); if(dwFileSize != 0xFFFFFFFF) { LPSTR pszFileText; pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1); if(pszFileText != NULL) { DWORD dwRead; if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL)) { pszFileText[dwFileSize] = 0; // Null terminator SetWindowText(text_hwnd, pszFileText); } GlobalFree(pszFileText); } } CloseHandle(hFile); } } } /* 0x50–0x57 SPD 0x30–0x37 SPD EEPROMs also respond to I²C addresses 0x18–0x1F to access an optional on-chip temperature sensor SPD contents for SDR SDRAM 31 0x1f 512 MiB 256 MiB 128 MiB 64 MiB 32 MiB 16 MiB 8 MiB 4 MiB SPD contents for DDR SDRAM 31 0x1f 512 MiB 256 MiB 128 MiB 64 MiB 32 MiB 16 MiB/ 8 MiB/ 4 MiB/ 4 GiB 2 GiB 1 GiB SPD contents for DDR2 SDRAM 31 0x1f 512 MiB 256 MiB 128 MiB 16 GiB 8 GiB 4 GiB 2 GiB 1 GiB */ int smb_spd(void) { unsigned char i=0; unsigned char ii=0; unsigned char ant=0; unsigned char daten=0; unsigned char eeprom_len=0; char zeile_count=0; HANDLE hFile; DWORD len1; LPDWORD len2; DWORD len_text=0; //LPSTR pszFileText; //pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1); string text=""; string text2=""; char txt_buff[255]; unsigned char eeprom_adressen[10]; unsigned char eeprom_adressen_c=0; unsigned long pause=0; for (i=0x50;i<0x58;i++) { ant=ReadByteSMBus(Get_SMBus_Adress(),i,0,&daten); if(daten!=0xFF) { eeprom_adressen[eeprom_adressen_c]=i; eeprom_adressen_c++; } } for (i=0;i<eeprom_adressen_c;i++) { //char ReadByteSMBus(unsigned int SMBus_port,unsigned char device_nummer,unsigned char cmmd,unsigned char *data); len_text=sprintf(txt_buff,"EEPROM adresse: 0x%X \r\n",eeprom_adressen[i]); txt_buff[len_text+1]=0; text +=(string)txt_buff ; zeile_count=0; for(ii=0;ii<255;ii++) { ant=ReadByteSMBus(Get_SMBus_Adress(),eeprom_adressen[i],ii,&daten); for(pause=0;pause<2048;pause++) asm("NOP"); len_text=sprintf(txt_buff,"%X ",daten); txt_buff[len_text+1]=0; text +=(string)txt_buff ; zeile_count++; if(zeile_count>16) { zeile_count=0; len_text=sprintf(txt_buff,"\r\n"); txt_buff[len_text+1]=0; text +=(string)txt_buff ; } } len_text=sprintf(txt_buff,"\r\n\r\n"); txt_buff[len_text+1]=0; text +=(string)txt_buff ; for(pause=0;pause<65000;pause++) asm("NOP"); } LPCSTR str2 = _strdup(text.c_str()); SetWindowText(text_hwnd, str2); return 0; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CREATE: text_hwnd=CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_MAIN_TEXT, g_hInst, NULL); SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0)); SetWindowText(text_hwnd, "hallo"); break; case WM_SIZE: if(wParam != SIZE_MINIMIZED) MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); break; case WM_SETFOCUS: SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT)); break; case WM_COMMAND: switch(LOWORD(wParam)) { case CM_PCI_SCAN: //text_print("CM_PCI_SCAN\n",12); break; case CM_PCI_DUMP: //text_print("CM_PCI_DUMP\n",12); break; case CM_SMB_SCAN: //text_print("CM_SMB_SCAN\n",12); smb_scann(); break; case CM_SMB_SPD: //smb_spd //CM_SMB_SPD_EEPROM smb_spd(); break; case CM_SMB_DUMP: //text_print("CM_SMB_DUMP\n",12); //smb_dump(); break; } break; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 #ifndef _SMBUS_H_ #define _SMBUS_H_ #include <stdio.h> #include <conio.h> #include <iostream> #include <windows.h> #include "io.h" #define VDID_PIIX40x71138086 //82371AB/EB/MB PIIX4/E/M Power Management Controller. #define VDID_VIA596A0x30501106 // VT82C596/A/B Power Management Controller #define VDID_VIA686A0x30571106 // VT82C686/A/B Power Management Controller #define VDID_AMD756PM0x740B1022 // AMD-756 Power Management Controller #define VDID_AMD766PM0x74131022 // AMD-766 Power Management Controller #define VDID_AMD768PM0x74431022 // AMD-768 ACPI Controller #define VDID_AMD8111PM 0x746B1022 // AMD-8111 ACPI System Management Controller #define ATI_SMBus 0x43851002 // Advanced Micro Devices, Inc.","ATI RD600/RS600","ATI SMBus" #define Adress_port0xCF8 #define Data_port0xCFC #define No_device0xFFFFFFFF #define PCI_adresse0x80000000 #define PCI_Count_ad0x100 #define PCI_End_adresse0x80FFFF00 #define NEWIODELAY() PortOut(0x0EB, 0xFF) unsigned int Get_SMBus_Adress(void); char wait_busy(unsigned int SMBus_port); unsigned char ReadByteSMBus(unsigned int SMBus_port,unsigned char device_nummer,unsigned char cmmd,unsigned char *data); char ReadshortSMBus(unsigned int SMBus_port,unsigned char device_nummer,unsigned char cmmd,unsigned short *data); #endif //_SMBUS_H_
smbus.cpp
Spoiler
![]()
C/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 #include "smbus.h" #define TIMEOUT 650000 unsigned int SMBus_adresse=0; unsigned int Get_SMBus_Adress(void) { if (SMBus_adresse==0) { unsigned int i=PCI_adresse; unsigned int Adresse = 0; unsigned int PCI_Data =0; unsigned int Device_class =0; unsigned int SMBUS_adresse =0; unsigned int ii=0; for(i=PCI_adresse;i<PCI_End_adresse;i=i+PCI_Count_ad) { Adresse=i & 0xFFFFFF00; PortDWordOut (Adress_port, Adresse); PCI_Data = PortDWordIn(Data_port); if (PCI_Data != 0x0FFFFFFFF) { switch (PCI_Data) { case VDID_PIIX4: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_VIA596A: PortDWordOut (Adress_port, Adresse + 0x80); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_VIA686A: PortDWordOut (Adress_port, Adresse + 0x90); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD756PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD766PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD768PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case VDID_AMD8111PM: PortDWordOut (Adress_port, Adresse + 0x58); SMBUS_adresse = PortDWordIn(Data_port); break; case ATI_SMBus: for(ii=0x10;ii<0x24;ii=ii+0x4) { PortDWordOut (Adress_port, Adresse + ii); SMBUS_adresse = PortDWordIn(Data_port); if(SMBUS_adresse) break; } break; } if(SMBUS_adresse) break; } } SMBus_adresse=(unsigned int)(SMBUS_adresse & 0x0FFF0); } return SMBus_adresse; } char ReadshortSMBus(unsigned int SMBus_port,unsigned char device_nummer,unsigned char cmmd,unsigned short *data) { unsigned short daten=0; char value=0; int i=0; char Device; char ret=0; unsigned long timeout=TIMEOUT; Device=(device_nummer<<1); Device=Device | 1; PortOut(SMBus_port+4,Device);//device 7:1,read/write 0:0 -> 1=read NEWIODELAY(); PortOut(SMBus_port+3,cmmd);//device command NEWIODELAY(); PortOut(SMBus_port+2,0x4C);//01001100b ;START=1 SMB_CMD =010b Byte Data NEWIODELAY(); while(timeout) { NEWIODELAY(); value = PortIn(SMBus_port); timeout--; if(value && 2) break; } if (timeout==0) { PortOut(SMBus_port+2,2);//killbit ret= -1; } else { ret=1; } value = PortIn(SMBus_port); NEWIODELAY(); PortOut(SMBus_port,value); daten = PortIn(SMBus_port+6); daten=daten<<8; daten=daten | PortIn(SMBus_port+5); if(wait_busy(SMBus_port)) return -2; value = PortIn(SMBus_port); if(value && 4) return -3; *data=daten; return ret; } unsigned char ReadByteSMBus(unsigned int SMBus_port,unsigned char device_nummer,unsigned char cmmd,unsigned char *data) { unsigned char value=0; unsigned char daten=0; unsigned char i=0; unsigned char Device; unsigned char ret=0; unsigned long timeout=TIMEOUT; Device=(device_nummer<<1); Device=Device | 1; PortOut(SMBus_port+4,Device);//device 7:1,read/write 0:0 -> 1=read NEWIODELAY(); PortOut(SMBus_port+3,cmmd);//device command NEWIODELAY(); PortOut(SMBus_port+2,0x48);//01001000b ;START=1 SMB_CMD =010b Byte Data NEWIODELAY(); while(timeout) { NEWIODELAY(); value = PortIn(SMBus_port); timeout--; if(value && 2) break; } if (timeout==0) { PortOut(SMBus_port+2,2);//killbit ret= 1; } value = PortIn(SMBus_port); NEWIODELAY(); PortOut(SMBus_port,value); if(wait_busy(SMBus_port)) ret= 2; daten = PortIn(SMBus_port+5); value = PortIn(SMBus_port); //if(value && 0x4) // ret=3; *data=daten; return ret; } char wait_busy(unsigned int SMBus_port) { unsigned long timeout=TIMEOUT; while(timeout) { NEWIODELAY(); if(!(PortIn(SMBus_port) & 0x1)) break; timeout--; } if(timeout==0) return 1; return 0; }
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »gen4ik« (5. Oktober 2010, 00:33)
und wenn das in if() anweisung steht?
![]()
C/C++-Quelltext
1 if(0x82 && 0x2) //true
Wenn dir immer noch nicht klar ist, dass diese Zeile schwachsinnig ist empfehle ich einen Programmierkurs.
Die oben genanten Aussage ist immer true.
schau mal zu was
|
|
C/C++-Quelltext |
1 |
if(0x80 && 0x2) |
Ich will jetzt nicht deinen Code Zeile für Zeile quoten, aber man muss sich nur sowas hier
|
|
C/C++-Quelltext |
1 2 |
for(pause=0;pause<65000;pause++) asm("NOP"); |
anschauen...ist dir überhaupt klar warum man auf die Art und weise keine Delays schreibt?
Tipp: Schau dir mal an was auf langsameren oder schnelleren Rechner passiert...
Blog
du schlägst timer metode denke ich um den cpu nicht überlasten .
für denn anfang um zu testen reicht for () schleife
danke für hilfe. das mit denn &&
in anleitung stand eindlich das man in if() && benuzen solte ??? funz nicht bei jeden compiller
was noch interessant sein könnte
mit timig alles in ordnung . Das was mich am ende genervt hat ,daß man nach jeden fehler denn pc neustarten muss da der controller
anders reagiert auf nicht vorhandenen geräte oder busy bit.
mit kill bit kann man nicht alle fehler beheben
nur neu startso jezt teorie . in praxis muss ich noch umsezen
send_device_nummer()
send_device_command()
send_cmd_smb(kommand)
| | 010= send Byte Data |
| | XMIT_SLVA,HST_CMD, HST_D0 |
| | |
| | 011= send Word Data |
| | XMIT_SLVA,HST_CMD, HST_D0, |
| | HST_D1 |
| | |
while (portin(smbus) & 2)//INTR – R/WC (special)
while (portin(smbus) & 1)//busy bit)
inp()//daten input
value = PortIn(SMBus_port);
value => status register . Soll 0x2 zeigen INTR bit1
hier sind wichtigsten register aufgelistet
HST_STS—Host Status Register
verschiebung 00
+-----+---------------------------------+
|bits | beschreibung |
+-----+---------------------------------+
| 7 | Byte Done Status (DS) — R/WC. |
| | 0 – out(1) löscht den bit |
| | 1 – |
+-----+---------------------------------+
| 6 | INUSE_STS — R/WC (special) |
+-----+---------------------------------+
| 5 | SMBALERT_STS — R/WC. |
+-----+---------------------------------+
| 4 | FAILED — R/WC |
| | 0 – out(1) löscht den bit |
| | 1 – Ergebniss Interrupt oder #SMI|
| | Kill bit gesezt |
+-----+---------------------------------+
| 3 | BUS_ERR — R/WC |
| | 0 – out(1) löscht den bit |
| | 1 – Ergebniss Interrupt oder #SMI|
| | senden Kollision |
+-----+---------------------------------+
| 2 | DEV_ERR — R/WC |
| | 0 – out(1) löscht den bit |
| | 1 – Ergebniss Interrupt oder #SMI|
| | Error |
| | *nicht vorhandener antwort/daten
| | auf die kommand |
| | *Unclaimed Cycle |
| | *Timeout |
+-----+---------------------------------+
| 1 | INTR – R/WC (special) |
| | Dieses bit hängt nur von erfolgreichen
ausführen von kommand |
| | und nicht von bit INTREN |
| | 0 – out(1) löscht den bit |
| | 1 – ergebniss Interrupt oder #SMI|
| | kommand erfolgreich ausgeführt |
+-----+---------------------------------+
| 0 | HOST_BUSY – RO |
| | 0 – wenn alles ok |
| | 1 – wenn sendet |
+-----+---------------------------------+
HST_CNT—Host Control Register
verschiebung 02
+-----+---------------------------------+
|bit | beschreibung |
+-----+---------------------------------+
| 7 | PEC_EN — R/W |
+-----+---------------------------------+
| 6 | START — WO |
| | 0– wenn gelesen wird |
| | 1- run command |
+-----+---------------------------------+
| 5 | LAST_BYTE – WO |
| | Für block kommand |
| | 1- nechster byte wird der lezte |
+-----+---------------------------------+
| 4:2 | SMB_CMD — R/W |
| | 000= Quick XMIT_SLVA |
| | |
| | 001= Byte XMIT_SLVA, |
| | HST_CMD |
| | |
| | 010= Byte Data |
| | XMIT_SLVA,HST_CMD, HST_D0 |
| | |
| | 011= Word Data |
| | XMIT_SLVA,HST_CMD, HST_D0, |
| | HST_D1 |
| | |
| | 100= Process Call |
| | XMIT_SLVA,HST_CMD, HST_D0, |
| | HST_D1 |
| | |
| | 101= Block |
| | XMIT_SLVA,HST_CMD, HST_D0, |
| | Host_BLOCK_DB |
| | |
| | 110= I2C |
| | XMIT_SLVA,HST_CMD, HST_D0, |
| | HST_D1, Host_BLOCK_DB |
| | |
| | 111= Block Process |
| | XMIT_SLVA,HST_CMD, HST_D0, |
| | Host_BLOCK_DB |
+-----+---------------------------------+
| 1 | KILL — R/W |
| | 0- alles ok SMBus |
| | 1- Unterbrechen. |
| | Wird FAILED bit gesezt. |
| | für normal arbeit sollte der KILL bit in 0 gesezt sein |
+-----+---------------------------------+
| 0 | INTREN — R/W |
| | 0- cli()IRQ aus |
| | 1-sei()IRQ an |
+-----+---------------------------------+
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »gen4ik« (6. Oktober 2010, 20:12)

- 1
- 2

Ähnliche Themen
-
Grafiken »-
Ein Problem mit einer Gif Datei-Hilfe bitte!
(17. Februar 2007, 15:04)
-
Archiv: Betriebssysteme »-
SM-Bus-Controler ?
(24. Dezember 2003, 07:56)
-
Hardware »-
Problem mit mein celeron prozessor ! Hilfe bitte ^!
(4. Dezember 2003, 22:50)
-
Games »-
Cs Headset Problem (bitte um Hilfe)
(29. August 2003, 20:21)
-
FreeWebspace »-
[Frage] Eigene WAP-Seite
(20. März 2003, 14:35)


