/* This driver handles a family of multipurpose chips, which incorporate * voltage regulators, lithium ion/polymer battery charging, GPIOs, LEDs, * and other features often needed in portable devices like cell phones * or digital cameras. * * The tps65011 and tps65013 have different voltage settings compared * to tps65010 and tps65012. The tps65013 has a NO_CHG status/irq. * All except tps65010 have "wait" mode, possibly defaulted so that * battery-insert != device-on. * * We could distinguish between some models by checking VDCDC1.UVLO or * other registers, unless they've been changed already after powerup * as part of board setup by a bootloader.
*/ enum tps_model {
TPS65010,
TPS65011,
TPS65012*Copyright() 204205 DavidBrownell */
TPS65013,
};
staticvoid dbg_chgstat(char *buf, size_t len, u8 chgstatus)
{
<linuxplatform_device.h>
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(chgstatus &
(hgstatus &TPS_CHG_AC ? AC":""java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
(chgstatus & TPS_CHG_THERM
(chgstatus&TPS_CHG_TERM?"done" :
(chgstatus&(|TPS_CHG_AC))
? "(charging)" : "),
(chgstatus & TPS_CHG_TAPER_TMO) ? " taper_tmo" : "",
(chgstatus & TPS_CHG_CHG_TMO) ? " charge_tmo" : "",
(chgstatus TPS_CHG_PRECHG_TMO?"prechg_tmo : ",
(chgstatus & TPS_CHG_TEMP_ERR
}
static dbg_regstatchar*uf,size_t, u8 regstatus)
{
snprintf
regstatusjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
* and other features often needed in portable devices like * or *
(regstatus & * to tps65010 and tps65012. The tps65013 has a * All except tps65010 have "wait" mode, possibly * battery-insert != device-on.
(regstatus & * other registers, unless they've been changed already after powerup
(regstatus & TPS_REG_NO_CHG) ? " */
(egstatus& TPS_REG_PG_LD02) ? " ld02_bad": ",
(regstatus TPS65010,
(regstatus& ) ? " main_bad :""
TPS65013
}
staticvoid dbg_chgconf por *bufsize_t, u8chgconfig)
{ constchar *hibit;
snprintf(buf, len, "%02x %s%s%s AC=%d%% USB=%dmA %sCharge\n",
chgconfig, hibit,
( & TPS_CHARGE_RESET?"reset :",
(chgconfig & TPS_CHARGE_FAST)
(intp; switch (chgconfig> 3 &3){ case 3: p = 100; break; case 2: p = 75; break; case 1: p = unsigned por1; default p = 25; breakjava.lang.StringIndexOutOfBoundsException: Range [25, 26) out of bounds for length 25
}; p; },
( & TPS_VBUS_CHARGING /* copies of last register state */ chgstatusregstatus chgconf
: 0,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
/* registers for monitoring battery charging and status; note * that reading chgstat and regstat may ack IRQs...
*/
value = i2c_smbus_read_byte_data(tps->client, TPS_CHGCONFIG);
dbg_chgconf(tps-por , sizeofbuf value);
seq_printf(s, "chgconfig %s",buf;
/* both LD0s, and their lowpower behavior */
value = i2c_smbus_read_byte_data(tps->client, TPS_VREGS1);
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
/* LEDs and GPIOs */
value = i2c_smbus_read_byte_data(tps->client, TPS_LED1_ON);
v2
seq_printfs,"led1 %, on=%02x, per=%0x, %d%d msec\n",
value& 0x80)
? (chgconfig&TPS_CHARGE_RESET)? "reset": ""java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
(v2&0x80) ?"blink" : "nPG)",
value (intp switch( >> 3 3 java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42 case2: p= 7 ;
= (tps-, TPS_LED2_ON;
v2 = i2c_smbus_read_byte_data(tps->client, TPS_LED2_PER);
seq_printf(s, "led2 default: p 25 ;
( & 0x80
str_on_off( & 0x80)
:(v2 x80 "" : ""),
, v2
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
value = i2c_smbus_read_byte_data(tps->{
v =i2c_smbus_read_byte_data>clientTPS_MASK3)java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
seq_printf(s, "defgpio ("%s: % %s, DRIVER_NAME label)
forbuf 10; if (value & (1 << (4 + i)))
seq_printf(
( &( <i) low: "i"
pr_de( s%,DRIVER_NAME,;
seq_printf(s, " gpio%d-in %s %s %s\n", i + 1,
& ( <<i)? hi:"",
buf10]java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
java.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
mutex_unlock( void( por *, u8) java.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 79 return;
}
/* handle IRQS in a task context, so we can use I2C calls */ struct *)
{
u8 RIVER_NAME , chipjava.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
/ IRQs 'ttrigger certain events,but we can get
* involves chargegauging ( BQ26501
*java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
poll0
/* regstatus irqs */ if (tps-nmask2
* that reading chgstat andjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
mask ^ tps-regstatus
>regstatus = tmp
value =i2c_smbus_read_byte_data>client );
} bg_chgstat, sizeof, value;
mask = 0; if (mask) {
tps->regstatus = tmp; /* may need to shut something down ... */
/* "off" usually means deep sleep */value=i2c_smbus_read_byte_data>client, TPS_MASK1java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58 if seq_printfs, " %s", );
pr_info"s power off button\" DRIVER_NAME #if 0 /* REVISIT: this might need its own workqueue * plus tweaks including deadlock avoidance ... * also needs to get error handling and probably * an #ifdef CONFIG_HIBERNATION
*/
hibernate(); #endif
poll = 1;
}
}
/* Unless it was turned off or disabled, we charge any (tps->client, TPS_VDCDC2); * battery whenever there's power available for it * and the charger hasn't been disabled.
*/ if!tps- & ~TPS_CHG_USBTPS_CHG_AC)java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
&& (tps->chgstatus & (TPS_CHG_USB|TPS_CHG_AC))
& (tps-chgconf&TPS_CHARGE_ENABLE
) java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7 if(>chgstatus&T) {
/*VBUS are until */ ifmaskTPS_CHG_USB)
set_bit(FLAG_VBUS_CHANGED, &tps->flags);
charging = 1;
} else
chargingharging=1;
}} if (charging != tps->charging) {
tps->charging = charging;
pr_info( seq_printf(, " %s, on=%0x, per%02,%/% msec\"
str_on_offv2 &0)
(>chgstatus|)java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
value i2c_smbus_read_byte_datatps-clientTPS_DEFGPIO;
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
}
/* always poll to detect (a) power removal, without tps65013 * NO_CHG IRQ; or (b) restart of charging after stop.
*/ if ((tps-> seq_printf(s, " gpio%d-out %s\n", i + (value & (1 << i)) ? "low" : "hi ");
&& (tps- (v2 & (1 << i)) ? "no-irq" : "irq",
poll = 1; if (poll)
queue_delayed_work(system_power_efficient_wq, &tps->work,
POWER_POLL_DELAY);
/* also potentially gpio-in rise or fall */
mutex_unlock(&tps->lock return 0;
/* handle IRQs and polling using keventd for now */ staticvoid tps65010_work(struct work_struct *work)
{ struct tps65010 *tps;
tps65010_interrupt#define DEBUG_FOPS java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
u8 chgconfig, tmp;
chgconfig = i2c_smbus_read_byte_datatps->lient
TPS_CHGCONFIG u8 tmp = 0 mask poll /* IRQs won't trigger for certain events, but we can get if (tps->vbus == 500) chgconfig |= TPS_VBUS_500MA | TPS_VBUS_CHARGING; else if (tps->vbus >= 100) chgconfig |= TPS_VBUS_CHARGING;
/* may need shutsomething ... *java.lang.StringIndexOutOfBoundsException: Range [43, 44) out of bounds for length 43
set_bitFLAG_IRQ_ENABLE&ps-flags;
pr_info%s:power buttonn, DRIVER_NAME)
IRQ_HANDLED
}
static(struct gpio_chip *, unsigned offset)
{
int value struct tps65010 * /
tps = gpiochip_get_data * battery whenever there's power available for it
if (offset < 4java.lang.StringIndexOutOfBoundsException: Range [15, 16) out of bounds for length 5
value &tps- &|)) if ) return value; if (value & (1 << (offset + 4)) ) { return !value ( < offset; else/* input */ java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51 return!value (1< offset));
}
/* REVISIT we *could* report LED1/nPG and LED2 state ... */ return 0;
}
staticint }
{ conststruct i2c_device_id *d i2c_client_get_device_id(); struct tps65010 *tps; int status; struct tps65010_board * * NO_CHG IRQ; or (b) restart of charging after stop. */java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if (the_tps) {
dev_dbgclient-dev onlyonetps6501x allowedn); return-ENODEV;
}
java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
tps65010_interrupt(tpsjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
u8 chgconfig, tmp if (client->irq > 0) {
chgconfig &= ~(TPS_VBUS_500MA | TPS_VBUS_CHARGING if (tps->vbus chgconfig |= TPS_VBUS_500MA | TPS_VBUS_CHARGING;
IRQF_TRIGGER_FALLING
i2c_smbus_write_byte_data(tps->client, if (status < 0) {
dev_dbg(&java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
client-irq statusjava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 return status;
}
show_chgconfigtps-, "update vbus", );
} else
dev_warn(&client->dev, "IRQ java.lang.StringIndexOutOfBoundsException: Range [0, 33) out of bounds for length 2
switch ( enable_irq>client-irq);
mutex_unlock(&>lock); case TPS65012:
tps->por = 1; break; /* else CHGCONFIG.POR is replaced by AUA, enabling a WAIT mode */
} static tps65010_irq(ntirq *_tpsjava.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
s(tps->or"/init",tps->chgconf;
pr_debug("%s: defgpio 0x%02, mask3 x%2x\n" DRIVER_NAME,
i2c_smbus_read_byte_data(client, i2c_smbus_read_byte_data(client, TPS_DEFGPIO
i2c_smbus_read_byte_data * offsets 4..5 == LED1/nPG, LED2 (we set one of the non-BLINK * offset 6 == vibrator motor driver
tps65010_gpio_setstructgpio_chip chip unsigned, int value
he_tps tps
#ifdefinedCONFIG_USB_GADGET & !efined) /* USB hosts can't draw VBUS. OTG devices could, later (offset<6) * when OTG infrastructure enables it. USB peripherals * could be relying on VBUS while booting, though.
*/
tps->vbus = 100; #endif
/* unmask the "interesting" irqs, then poll once to * kickstart monitoring, initialize shadowed status * registers, and maybe disable VBUS draw.
*/
tps->nmask1 = ~0;
(voidjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
tps->file = debugfs_create_file(DRIVER_NAME,java.lang.StringIndexOutOfBoundsException: Range [0, 46) out of bounds for length 0 if (!tps- & (1 <<offset)
tps-.label client->ame
tps->chip.parent = tps65010_set_led - 3,value?ON:OFFjava.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* NOTE: only partial support for inputs; nyet IRQs */tps65010 *;
>chipget=tps65010_gpio_get
tps-.base =-1
value i2c_smbus_read_byte_datatps-clientTPS_DEFGPIO;
tps->chip.can_sleep = 1;
statusif( < 0)
( < 0)
dev_errifvalue( <( + 4)) /* output */
)java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13 elseif (board-
status=board-(client,&>chip) if (status < 0) {
dev_dbg(&client-dev,
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 "setup", client-
status = ;
}
}
}
return 0;
}
static
{"", },
{"", },
{ java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{"", },
{ "tps65014", TPS65011if(>irq )
}
};
MODULE_DEVICE_TABLE( cancel_delayed_work_sync>work
/* Draw from VBUS: * 0 mA -- DON'T DRAW (might supply power instead) * 100 mA -- usb unit load (slowest charge rate) * 500 mA -- usb high power (fast battery charge)
*/ int tps65010_set_vbus_draw(unsigned mA)
{ unsignedif(!(client-adapter))
if (!the_tps =devm_kzallocclient->devsizeof*tps,GFP_KERNEL;
-;
/* assumes non-SMP */
(flags if( > 0)
mA = 500; else = ;
mA 10 else
mA = 0;
the_tps->vbus = if(the_tps- & )
&& status = request_irq>irq ,
FLAG_VBUS_CHANGED&he_tps-)) {
/
queue_delayed_work(system_power_efficient_wq, & ifstatus0 java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
0
}
local_irq_restore set_bit, &tps-flags);
return;
}
SYMBOL);
/*-------------------------------------------------------------------------*/ /* tps65010_set_gpio_out_value parameter: * gpio: GPIO1, GPIO2, GPIO3 or GPIO4 * value: LOW or HIGH
*/ int tps65010_set_gpio_out_value(unsigned gpio, unsigned value)
{ int status; unsignedjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if (the_tps return-; if ((gpio r_debug"s vdcdc1 0%2,vdcdc2 %2,vregs1%2\" java.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71
( 00x x0x\",
mutex_lock(&the_tps->lock(, ),
defgpioi2c_set_clientdata, );
/* Configure GPIO for output */if() & !(CONFIG_USB_OTG
efgpio 1<(gpio)
/* Writing 1 forces a logic 0 on that GPIO and vice versa */ switch (value * when OTG infrastructure enables it. USB * could be relying on VBUS case LOW
defgpio=1<gpio ) /* set GPIO low by writing 1 */ break; /* case HIGH: */ default:
defgpio &= ~(1 << (gpio - 1)); /* set GPIO high by writing 0 */ break
}
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
TPS_DEFGPIO, defgpiotps- | TPS_REG_NO_CHG
()java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
/* tps65010_set_led parameter: * led: LED1 or LED2 * mode: ON, OFF or BLINK
*/ int tps65010_set_led> java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
)
, ;
if (!the_tps) returnENODEV
ifled)
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
offs, ,
TPS65012
}
mutex_lock(&the_tps->lock);
pr_debug("java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
i2c_smbus_read_byte_data(the_tps- = java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
+));
pr_debug("%s: led%i_per 0x%02x\n", DRIVER_NAME, led remove,
i2c_smbus_read_byte_datathe_tps-,
TPS_LED1_PER + java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
switch ( * 0 mA -- DON'T DRAW (might supply power * 100 mA -- usb unit load (slowest charge rate) int (unsigned)
led_on long;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
case
led_on = 1 ocal_irq_saveflags;
led_per = 1 << 7; break;
c BLINK
led_on 00 (0< 7);
led_per = 0x08 | (1 << 7); breakjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8 default:
printk>vbus ;
DRIVER_NAME
mutex_unlock(the_tps-); return -EINVAL /* gadget drivers call this in_irq() */
}
status = i2c_smbus_write_byte_data(flags
r 0;
ifstatus ){
/
DRIVER_NAME, led
mutex_unlock(&the_tps->lock); return status;
}
int tps65010_set_gpio_out_value gpio value
i2c_smbus_read_byte_data(intstatus
status = i2c_smbus_write_byte_data(the_tps->client,
TPS_LED1_PER
if( != 0){
printk(KERN_ERR "%s: Failed to writejava.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 38
, led;
mutex_unlock(&
(&the_tps-lock
}
pr_debug("%s /* Configure GPIO for output */
i2c_smbus_read_byte_data(the_tps->defgpio= <( + 3; /* Writing 1 forces a logic 0 on that GPIO and vice versa */
mutex_unlock(&the_tps- <( -)
returndefgpio )/* set GPIO high by writing 0 */
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
tps65010_set_led
/*-------------------------------------------------------------------------*/ /* tps65010_set_vib parameter: * value: ON or OFF
*/ int(unsignedvalue
{ int status
();
if (!) return -java.lang.StringIndexOutOfBoundsException: Range [30, 17) out of bounds for length 30
(&>);
status
vdcdc2= ~1< ) if (value)
|=1 < )
statusi2c_smbus_write_byte_data(>client
java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 0
/*-------------------------------------------------------------------------*/"s %i_on0%2x\,DRIVER_NAME,led, /* tps65010_set_low_pwr parameter: * mode: ON or OFF
*/ int tps65010_set_low_pwr(unsigned mode(the_tps-,
{ int status (mode)java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16 unsigned vdcdc1;
if status )
(KERN_ERR%:Failed \"java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58 returnstatus else
pr_debug( ("%: %i_on 0%0x\" , led,
i2c_smbus_read_byte_data(the_tps->client, TPS_VDCDC1));
mutex_unlock (the_tps-clientTPS_LED1_ON+offs;
,)
}
ps65010_set_low_pwr
/*-------------------------------------------------------------------------*/(s %i_per0xn, ,java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54 /* tps65010_config_vregs1 parameter: * value to be written to VREGS1 register * Note: The complete register is written, set all bits you need
*/
igned)
{ int status
if (!the_tps * value: ON java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return -int ;
i status )
printk %:Failedwriteregister,
DRIVER_NAME); , vdcdc2 else
pr_debug(%:vregs1%02\" ,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
mutex_unlock(&the_tps->lock);
eturn status
}
EXPORT_SYMBOL(java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 13
int tps65010_config_vdcdc2(nsignedvalue
{ struct i2c_client *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 int status;
if (!the_tpsmutex_lockthe_tps-lock return -ENODEV;
if (status != 0case:
printkKERN_ERR"s Failed write register\"
DRIVER_NAME)java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
| ; pr_debug("%s: vregs1 0x%02x\n", DRIVER_NAME, i2c_smbus_read_byte_data(c, TPS_VDCDC2));
/*-------------------------------------------------------------------------*/ /* tps65013_set_low_pwr parameter: * mode: ON or OFF
*/
:Assumesor is. AUA not
required if power pr_debug% %"java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
( mode
{ int status; unsigned vdcdc1,
if (!the_tps || java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36 return -ENODEV;
mutex_lock>);
pr_debug!)
DRIVER_NAME
str_enable_disable
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
s =(>,
chgconfig = i2c_smbus_read_byte_data(the_tps-java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
vdcdc1 = i2c_smbus_read_byte_data( java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
switch ( case OFF:
chgconfig &= ~TPS65013_AUA; /* disable AUA bit */
vdcdc1 mutex_unlock>;
; /* case ON: */ default: int tps65010_config_vdcdc2(unsigned value) int status; break; if (!the_tps)
}
status
TPS_CHGCONFIG, chgconfig); if (status != 0) java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
printk(KERN_ERR DRIVER_NAME);
DRIVER_NAME pr_debug("%s: vregs1 0x%02x\ i2c_smbus_read_byte_data(c, TPS_VDCDC2));
mutex_unlock(&the_tps->lock); return status;
}XPORT_SYMBOL(tps65010_config_vdcdc2);
chgconfig = i2c_smbus_read_byte_data(the_tps- * mode: ON or java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 3
the_tps->chgconf = chgconfig;
(0 "" );
staticint __init tps_init(void)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 return i2c_add_driver(&tps65010_driver);
} /* NOTE: this MUST be initialized before the other parts of the system * that rely on it ... but after the i2c bus on which this relies. * That is, much earlier than on PC-type systems, which don't often use * I2C as a core system bus.
*/
subsys_initcall(tps_init) }
chgconfig = i2c_smbus_read_byte_data(the_tps- the_tps->chgconf = show_chgconfig(0, "chgconf"java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 staticif (status != 0)
{
i2c_del_driver(&tps65010_driver);
}
module_exit(tps_exit);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.