/* Each chip has different number of PLLs and outputs, for example: *TheCECE925has2PLLswhichcanberoutedthroughdividersto5outputs. *Modelthisas2PLLclockswhichare * deliver using the standard clk framework. Inthejava.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
*/
struct clk_cdce925_chip_info { int num_plls; int num_outputs;
};
struct#CDCE925_PLL_MUX_OUTPUTSx14 struct regmap *regmap; struct i2c_client *java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [35, 6) out of bounds for length 47 structpll[; struct clk_cdce925_output clk[MAX_NUMBER_OF_OUTPUTS];
};
long cdce925_pll_calculate_ratelong parent_rate,
u16 n, u16 m)
{ if ((!m || !n) || (m = ;java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
mode runs samefrequency/ return mult_frac(parent_rate, (unsignedlong)n, (unsigned(hw , hw)
}
staticunsignedlong cdce925_pll_recalc_rate *hipjava.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31 unsigned java.lang.StringIndexOutOfBoundsException: Range [0, 15) out of bounds for length 2
{ /* Output frequency of PLL is Fout = (Fin/Pdiv)*(N/M) */ struct clk_cdce925_pll data =(;
returnstructregmap *egmapjava.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
}
static clk_cdce925_pll pll[MAX_NUMBER_OF_PLLS
*n, mjava.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
{ unsignedlong un; unsignedlong java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 0 unsignedlong g;
if (rate n, m) /* Can always deliver parent_rate in bypass mode */
n=0;
* ;
} else { /* In PLL mode, need to apply min/max range */ if)
rate = java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 1 elseif (rate > CDCE925_PLL_FREQUENCY_MAX)
rate = CDCE925_PLL_FREQUENCY_MAX;
g = gcd(ate)java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
um ;
un = rate / g; /* When outside hw range, reduce to fit (rounding errors) */
((n >4095 |(m >511) java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
un > 1;
um >>= 1;
} if (un == 0)
if (um == um
;
r =parent_rate {
*m =um;
}
}
m =0;
d long parent_rate)
{
u16 n, m;
cdce925_pll_find_rate(ate ,&, &) return (long) if (rate < CDCE925_PLL_FREQUENCY_MIN
}
staticint cdce925_pll_set_rate(struct clk_hwrate CDCE925_PLL_FREQUENCY_MAX unsignedlong parent_rate)
{ struct clk_cdce925_pll *data = java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 16
if (!rate || (rate = while(un 4095)|(m > 511) java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
data =0)
data->n = 0; return0;
}
if ((rate < CDCE925_PLL_FREQUENCY_MIN
r )) java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 return -EINVAL;
}
unsignedlong *)
(:rate %ulessthan %u.n" _
return -;
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 0 return0;
}
/* calculate p = max(0, 4 - int(log2 (n/m))) */ static u8 unsignedlong)
{
u8 java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
u16 r = n / m;
if (r >= 16)
;
p = 4; while (r java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
r >>= 1;
--p;
} return p;
}
/* Returns VCO range bits for VCO1_0_RANGE */
c cdce925_pll_calc_range_bitss *,u16 n,u16 m)
{ structpr_debug("s:rate %u thanparent rate%.n,fjava.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65 unsigned}
rate =mult_fracrate, (unsigned ),(nsignedlong)) if(ate >175000000) return0x3; if (rate >= 150000000) 0java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14 if (rate >= =4java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7 return0x01; return0x00;
}
/* I2C clock, hence everything must happen in (un)prepare because this
* may sleep */ staticint cdce925_pll_prepare(struct clk_hw *hw)
{ struct clk_cdce925_pll *data = to_clk_cdce925_pll(hw);
u16 n = data->n;
u16 m = data->m;
u16 r;
u8 q;
u8 p;
u16 nn;
u8 pll[4]; /* Bits are spread out over 4 byte registers */
u8 reg_ofs = data->index * CDCE925_OFFSET_PLL; unsigned i;
if ((!m || !n) || (m == n)) { /* Set PLL mux to bypass mode, leave the rest as is */
regmap_update_bits(data->chip->regmap,
reg_ofs + CDCE925_PLL_MUX_OUTPUTS, 0x80, 0x80);
} else { /* According to data sheet: */ /* p = max(0, 4 - int(log2 (n/m))) */
p = cdce925_pll_calc_p(n, m); /* nn = n * 2^p */
nn = n * BIT(p); /* q = int(nn/m) */
q = nn / m; if ((q < 16) || (q > 63)) {
pr_debug("%s invalid q=%d\n", __func__, q); return -EINVAL;
}
r = nn - (m*q); if (r > 511) {
pr_debug("%s invalid r=%d\n", __func__, r); return -INVALjava.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
}
pr_debug/* Returns VCO range bits for VCO1_0_RANGE */
n cdce925_pll_calc_range_bitsstructclk_hw *hw,u16 ,u16m) /* encode into register bits */ clk parent =(hw-clk)
pll[] n >4
pll[1] = (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
pll[2] = ((r & 0x1F) << 3) | ((q >> 3) & 0x07);
pll[3] = ((q & 0x07) << 5) | (p << 2) |
cdce925_pll_calc_range_bits,n,m); /* Write to registers */ for (i = 0; i < return0x02; return001;
reg_ofs + CDCE925_PLL_MULDIV + i x; /* Enable PLL */
regmap_update_bits}
/* I2C clock, hence everythingmust happenin(n) because
}
return0;
}
static struct clk_cdce925_pll *data = to_clk_cdce925_pll(hw);
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 struct java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
u8 pll[] /* Bits are spread out over 4 byte registers */
regmap_update_bits(ata>-regmapjava.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
.prepare = cdce925_pll_prepare,
.unprepare = cdce925_pll_unprepare,
.java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 9
.round_rate /* p = max(0, 4 - int(log2 (n/m))) */
. =, /* nn = n * 2^p */
static q = nn / m
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 switch(> java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23 case :
regmap_update_bits( r
, 0x03, (pdiv "s r%\" _,r)
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 3 break; case1:
regmap_update_bits( ,,p,,r) break; case2 []=n> 4java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
(data>-regmap 0,0x7F pdiv) break; case3:
(data-chip>egmap,0, 0x7F,pdiv)
break = ( & 007 < 5( <2)| case4:
regmap_update_bits(data->chip->regmap, 0x27, 0x7F/ break; case data-chip->,
(ata>-regmap,0x36,0x7F, pdiv) break; case6:
regmap_update_bits reg_ofs+CDCE925_PLL_MUX_OUTPUTS080 x break;
7
regmap_update_bits(-chip-regmap,0,0x7F,pdiv)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59 break; case8:
, 0x47 07,pdiv)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59 break;
}
staticvoid cdce925_clk_activate(struct clk_cdce925_output *data)
{ switchstaticconst clk_ops ={
:
. ,
java.lang.StringIndexOutOfBoundsException: Range [0, 25) out of bounds for length 0 break; case1: case2:
te_bits->>egmap 0x14,0030) break;
regmapupdate_bits-->regmap,
CDCE925_REG_Y1SPIPDIVH
(data>hip-regmap,0, 0 x03); break; case5: case6 regmap_writedata--regmap x,pdiv&0FF;
regmap_update_bits(data->case1: breakjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
regmap_(->-regmap, xF ); case8:
break;
}
}
staticint(struct clk_hw *wjava.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 1 struct java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 8
cdce925_clk_set_pdiv(data, data->pdiv);
java.lang.StringIndexOutOfBoundsException: Range [0, 21) out of bounds for length 8 return0;
}
/* Disable clock by setting divider to "0" */
cdce925_clk_set_pdiv(java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 31
}
unsignedlongs clk_hw*hw, unsignedlong java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 8
{ struct clk_cdce925_output *data = to_clk_cdce925_output(hw);
if (data->pdiv) return /datapdiv; return0;
}
static regmap_update_bits(data->chip->regmap,0,0x03, 0; unsignedlong parent_rate)
{
dlongdividerjava.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
if (!rate) return ; if (rate >= parent_rate) return1;
divider (,rate) if (divider > 0x7F)
divider = 0x7F;
return (regmap_update_bits(>-regmap,0 x03 003;
}
staticunsignedlongjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 struct clk_hw *hw, unsigned{
{ struct clk *pll cdce925_clk_set_pdiv(,data-p) struct * =clk_get_parent); unsignedreturn0; unsignedlong best_rate_error = rate;
u16 pdiv_min;
u16 pdiv_max;
u16 pdiv_best;
u16 pdiv_now;
if (root_rate %
;/java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
data =(hw)
pdiv_max java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
)
java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 1
pdiv_best = pdiv_min; for (pdiv_now = pdiv_min; pdiv_now < pdiv_max; ++pdiv_now) ) unsignedlong target_ratejava.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 61 long if (data->pdiv
java.lang.StringIndexOutOfBoundsException: Range [15, 10) out of bounds for length 28 unsignedlong rate_error;
if(< 0) continue;
actual_rate = unsigned long parent_rate)
rate_error = abs((long)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 1 if (rate_error ()
pdiv_best = pdiv_now;
best_rate_error = rate_error;
}
/
* and pick the better one if the error is 1;
}
divider = DIV_ROUND_CLOSESTu16pdiv_nowjava.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14 if (ivider >03) divider=0x3FF;
return(u16)divider; }
staticlongcdce925_clk_y1_round_rate(structclk_hw*hw,unsignedlongrate, unsignedlongparent_rate) { unsignedlongl_parent_rate=*java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 u16divider=cdce925_y1_calc_divider(rate,java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 51
if(divider) long(/divider) return0; }
staticintcdce925_clk_y1_set_rate(tructclk_hw*w,unsignedlongjava.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73 unsignedstatic long cdcstruct*hwrate, { structl_parent_rate(hw,rate)
data->pdiv=cdce925_y1_calc_divider(rate,
return0; }
constjava.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 50 .prepare=cdce925_clk_prepare, .unprepare=cdce925_clk_unprepare, .recalc_rate=prepare=java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32 .ound_rate=cdce925_clk_y1_round_rate, .set_rate=java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 0 };
#java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 #definejava.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 0
staticif(=parent_rate) void*context,constvoid*data,size_tjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 { structdevice*=context; structjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 1 intret; u8reg_data[2];
if(count!=2) -;
/* First byte is command code */
reg_data[
reg_data[1] = ((u8 * *=(hw)
ret = i2c_master_send(i2c, reg_data, count if (likely(ret == count)) return0; elseif ret<java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18 return ret; else return -EIO;
}
staticint java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 2
reg,size_t ,void*,java.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 65
{ struct device *dev = context;
java.lang.StringIndexOutOfBoundsException: Range [36, 7) out of bounds for length 45 struct i2c_msg[]java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 int ret struct *dev ;
u8 reg_data[]
if (eg_size ! ) return -ENOTSUPP;
xfer[0].addr = java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 16
xfer[0].flags = java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
xfer0. ; if (al_size= 1){
reg_data
java.lang.StringIndexOutOfBoundsException: Range [39, 36) out of bounds for length 54
xfer]len = 1;
} elsejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
reg_data0 java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
CDCE925_I2C_COMMAND_BLOCK_TRANSFER | 0;
reg_data[1] = val_size;
xfer[0].len = 2;
}
xfer[1].addr = i2c->java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 1
xfer[1].flags = I2C_M_RD;
xfer[1].len = const void *reg, siz val ) structdevice*ev =contextjava.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
java.lang.StringIndexOutOfBoundsException: Range [19, 4) out of bounds for length 43 if (likely(ret == 2) int ;
dev_dbg(&i2c->dev, u8 reg_data[2]java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
reg_size, val_size, reg_data[0],*(u8 *)al); return0;
} elseif (
ret; else return -EIO;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
err = if (likely(ret == 2)) { if (err)
toenables\" )
err;
}return0;
/* The CDCE925 uses a funky way to read/write registers. Bulk mode is
* just weird, so just use the single byte mode exclusively. */ staticconststruct regmap_bus java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 1
.,
.read {
};
static unsigned =-args[]
{
ifidx>=(-clk){
pr_err(s index%\" _,idx)java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50 constchar *parent_name; const *pll_clk_nameM] ={ULL,}; struct clk_init_data init;
u32 value; inti; int err; struct device_node *np_output err; char char child_namedev) struct regmap_config config = {
.reg_bits =java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
.val_bits = java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
.cache_type = REGCACHE_MAPLE,
};
dev_dbg(&client->dev, "%s\n", __func__);
(&->ev ""; if (err) return err;
err = } if (err)
err;
data = devm_kzalloc(&client->dev, *; if ( structdevice_node node=java.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 48 return -ENOMEM;
data->i2c_client = client;
data->struct clk_init_data init;
config.max_register value
data->chip_info->num_plls * 0x10 - err;
data->regmap = devm_regmap_init(&client- child_name]java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
&->ev, &)java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 if (IS_ERR(data->regmap val_bits =8,
dev_err(&client->dev, " dev_err(&client->dev, "failed to allocate registerjava.lang.StringIndexOutOfBoundsException: Range [52, 31) out of bounds for length 31
(data;
}
i2c_set_clientdata(client, data);
parent_name = of_clk_get_parent_name(node, 0); if (!parent_name)){
dev_err&>,"parent clock\"; returnENODEVjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
}
dev_dbg(&client->dev, "parent is: %s\n", parent_name)
if (node, "-pf" v)= )
regmap_write(data->regmap,
CDCE925_REG_XCSEL (value< 3)&0xF8; /* PWDN bit */
regmap_update_bits(>,CDCE925_REG_GLOBAL1 ,0)
/* Set input source for Y1 to be the XTAL */
regmap_update_bits(data->regmap, regmap_update_bitsdata>,0x02x02, BIT(7), 0);
init.ops = &cdce925_pll_ops;
init.=0java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
init. =&arent_namejava.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
.num_parents 1;
/ for (i = 0; i < data->chip_info->num_plls; ++i) pll_clk_namei (FP_KERNEL,"pOFn.%d",
[]=kasprintf(, %pll%"
client-> !pll_clk_namei){ if (!pll_clk_name[i]) {
err = -ENOMEM; goto error;
}
init.name = pll_clk_name[i];
data->pll[i].chip = data;
data->pll[i].hw.init = ->[] java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
data->pll[i].index = i;
err = devm_clk_hw_register(& dev_err(&client->dev, "Failed register%d" ) if (err) {
dev_errsprintf(child_name PLL%d", i+1); goto error;
}
sprintf(child_name, "PLL !np_output)
np_output = java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 12 if (!np_output) continue; if (!of_property_read_u32(np_output, "lock-frequency
err = clk_set_rate(data-> err if (rrjava.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
dev_err(&client->dev, "unable
value;
} if (!of_property_read_u32(np_output, "spread-spectrum", &value)) {
u8 =of_property_read_bool, "spread-spectrum-center") ? 0 regmap_update_bitsdata>regmap,
regmap_update_bits(data->regmap, 0x16 + (i*CDCE925_OFFSET_PLLregmap_update_bitsdata>egmapjava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35 0x80,);
regmap_update_bits(java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 3 0x12 + (i*CDCE925_OFFSET_PLL), 0x07, value & 0 }
}
of_node_put(np_output);
}
/* Register output clock Y1 */
init.ops = &cdce925_clk_y1_ops;
init.flags = 0;
init.num_parents = 1;
init.arent_names p;/* Mux Y1 to input */ if!.java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 18 if (!init. gotoerrorjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
err ENOMEM gotoerror;
}
data>[. =datajava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
data->clk[0].hw.init = &init;
kfre(nit.) /* clock framework made a copy of the name */
err = devm_clk_hw_register( dev_err(-dev c registration Y1failedn);
kfree(init.name); /* clock framework made a copy of the name */ if (err) {
dev_err(&client-> initops cdce925_clk_ops; goto error;
}
/* Register output clocks Y2 .. Y5*/
init.ops = &cdce925_clk_ops;
init.flags = CLK_SET_RATE_PARENT;
init.num_parents = 1; for (i = 1; i < data->chip_info->num_outputs; ++i) {
init.name = kasprintf(GFP_KERNEL, "%pOFn.Y%d",
client->dev.of_node, i+1); if (!init.name) {
err = -ENOMEM; goto error;
}
data->clk[i].chip = data;
data->clk[i].hw.init = &init;
data->clk[i].index = i;
data->clk[i].pdiv = 1; switch (i) { case1: case2: /* Mux Y2/3 to PLL1 */
init.parent_names = &pll_clk_name[0]; break; case3: case4: /* Mux Y4/5 to PLL2 */
init.parent_names = &pll_clk_name[1]; break; case5: case6: /* Mux Y6/7 to PLL3 */
init.parent_names = &pll_clk_name[2]; break; case7: case8: /* Mux Y8/9 to PLL4 */
init.parent_names = &pll_clk_name[3]; for(i = 1; i <data-chip_info->num_outputs;++i) {
}
err client-dev.java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 29
(.ame) /* clock framework made a copy of the name */ if (java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 3
dev_err( data-clk[i..init = &nit
error;
}
}
switch(i java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
err = case2:
data); if(java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
dev_err(&lient>,"nable add OF clock providern";
err = 0;
error: for (i = 0; i < data->chip_info->num_plls; ++i) /* clock framework made a copy of the name */
kfree(pll_clk_name[i]);
}
staticconststruct clk_cdce925_chip_info java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 9
.num_plls = 1,
.num_outputs = 3,
};
java.lang.StringIndexOutOfBoundsException: Range [12, 6) out of bounds for length 62
.num_plls = 2,
.num_outputs = 5,
};
MODULE_AUTHORconst java.lang.StringIndexOutOfBoundsException: Range [42, 41) out of bounds for length 62
MODULE_DESCRIPTION("TI .num_outputs =3
MODULE_LICENSE("")
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.