Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

1 Zum Seitenanfang

Donnerstag, 30. September 2010, 14:48

SMBus problem bitte um hilfe

Ich versuche ein programm in Windows xp zu machen
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 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;
}



»gen4ik« hat folgende Datei angehängt:
  • smbus.7z (122,73 kB - 26 mal heruntergeladen - zuletzt: 26. April 2012, 06:58)
В нас часто проявляется плебейство.Ну, что ж, один - атлет, другой - Атлант.Несовместимы Гений и Злодейство,Но совместимы зависть и талант.
 

ivanhoe

Eroberer

Dabei seit: 09.06.2009

Beiträge: 69

 

2 Zum Seitenanfang

Donnerstag, 30. September 2010, 20:45

In deiner switch case Answeisung fehlen die breaks.
 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

3 Zum Seitenanfang

Donnerstag, 30. September 2010, 21:19

da muss auch nicht rein :P

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)

 

ivanhoe

Eroberer

Dabei seit: 09.06.2009

Beiträge: 69

 

4 Zum Seitenanfang

Donnerstag, 30. September 2010, 21:20

Doch müssen sie, es sei denn du gehst davon aus, dass immer der letzte case eintritt.
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)

 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

5 Zum Seitenanfang

Donnerstag, 30. September 2010, 21:47

da es so oder so kein von diesen geräten bei mir vorhanden ist !
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)

 

ivanhoe

Eroberer

Dabei seit: 09.06.2009

Beiträge: 69

 

6 Zum Seitenanfang

Donnerstag, 30. September 2010, 21:58

Das break nach dem case bewirkt das beim Eintreten des entsprechenden Falls die switch Anweisung verlassen wird.
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)

 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

7 Zum Seitenanfang

Donnerstag, 30. September 2010, 22:02

jop habe ich gemacht

hier ist der projekt
smbus.7z

hier bisschen besser

  Spoiler 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)

 

ivanhoe

Eroberer

Dabei seit: 09.06.2009

Beiträge: 69

 

8 Zum Seitenanfang

Donnerstag, 30. September 2010, 22:13

Das ist aber wohl nicht das Problem. Was ist mit Zeile 125, welchen Sinn hat es auf 'value && 2' zu prüfen? Die 2 ist immer wahr.


Quellcode

1
2
3
value = PortIn(SMBus_port);

		if(value && 2)
 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

9 Zum Seitenanfang

Donnerstag, 30. September 2010, 22:27

hast du irgen wo tutorial wo man auf smbus zugreifen kann?
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)

 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

10 Zum Seitenanfang

Freitag, 1. Oktober 2010, 12:42

hab jezt abfrage auf busy bit gemacht 650000 zyklen. Müsste reichen eindlich und mal iodelay
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 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 :thumbsup:
В нас часто проявляется плебейство.Ну, что ж, один - атлет, другой - Атлант.Несовместимы Гений и Злодейство,Но совместимы зависть и талант.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »gen4ik« (1. Oktober 2010, 12:42)

 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

11 Zum Seitenanfang

Freitag, 1. Oktober 2010, 13:22

so weit so gut
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 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
В нас часто проявляется плебейство.Ну, что ж, один - атлет, другой - Атлант.Несовместимы Гений и Злодейство,Но совместимы зависть и талант.
 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

12 Zum Seitenanfang

Freitag, 1. Oktober 2010, 20:14

in assembler sieht das so aus

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 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)

 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

13 Zum Seitenanfang

Montag, 4. Oktober 2010, 11:48

kann es sein das compilier DELAY function optimiert?
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 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)

 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

14 Zum Seitenanfang

Montag, 4. Oktober 2010, 13:40

Mal ein Tipp am Rande:

C/C++-Quelltext

1
0b00000010 && 0x2
ist immer true...
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...
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

15 Zum Seitenanfang

Montag, 4. Oktober 2010, 23:11

und wenn das in if() anweisung steht?

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)

 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

16 Zum Seitenanfang

Montag, 4. Oktober 2010, 23:36

neue version jetzt leuft alles

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 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)

 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

17 Zum Seitenanfang

Montag, 4. Oktober 2010, 23:41

da nicht alles in ein beitrag passt mache ich einfach hier rein

main.h

  Spoiler 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 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;
}

В нас часто проявляется плебейство.Ну, что ж, один - атлет, другой - Атлант.Несовместимы Гений и Злодейство,Но совместимы зависть и талант.
 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

18 Zum Seitenanfang

Dienstag, 5. Oktober 2010, 00:33

smbus.h

  Spoiler 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 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)

 

silence

König

Dabei seit: 28.02.2003

Beiträge: 981

 

19 Zum Seitenanfang

Dienstag, 5. Oktober 2010, 17:26

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)
evaluiert...

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...
Aktuell nutze ich: Windows, Linux, MacOS X, Solaris...weil die Welt nicht nur S/W ist!
Blog
 

gen4ik

Doppel-As

Dabei seit: 08.09.2010

Beiträge: 126

 

20 Zum Seitenanfang

Dienstag, 5. Oktober 2010, 22:44

optimirung ist aus. dawegen wird code nicht gekürzt .

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 start

so 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 |
+-----+---------------------------------+
»gen4ik« hat folgendes Bild angehängt:
  • smbus_error.JPG
В нас часто проявляется плебейство.Ну, что ж, один - атлет, другой - Атлант.Несовместимы Гений и Злодейство,Но совместимы зависть и талант.

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »gen4ik« (6. Oktober 2010, 20:12)

 

Ähnliche Themen