pureboot: the poll-cost lookup rides the baud parameter
usart_of<0> is an incomplete type on the USART-less chips, and a static member initializer with only non-dependent operands is checked when the template is parsed, not when it is instantiated — so the address probe broke every tiny build without hardware_link ever being named. The lookup moves into a member function template taking the link's own baud parameter, the dependence carrier that defers it to instantiation. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -177,7 +177,15 @@ struct hardware_link {
|
||||
// bit-addressable I/O (the classic megas), lds + skip (4) in extended
|
||||
// I/O. A uint32_t countdown pays one more sbci — window_polls() adds it
|
||||
// where the count forces the wide type. Held by the pureboot.window gate.
|
||||
static constexpr std::uint8_t poll_cycles = avr::hw::usart_of<usart_unit>::ucsra::addr < 0x40 ? 7 : 9;
|
||||
// The lookup rides the baud parameter so it stays dependent: the trait is
|
||||
// an incomplete type on the USART-less chips, which parse this template
|
||||
// without ever instantiating it.
|
||||
template <avr::baud_t Baud, typename U = avr::hw::usart_of<usart_unit>>
|
||||
static consteval std::uint8_t poll_cost()
|
||||
{
|
||||
return U::ucsra::addr < 0x40 ? 7 : 9;
|
||||
}
|
||||
static constexpr std::uint8_t poll_cycles = poll_cost<B>();
|
||||
|
||||
static void init()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user