#!/usr/bin/env python # This file is part of the libopencm3 project. # # Copyright (C) 2012 chrysn # # This library is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library. If not, see . import sys import yaml template = '''\ /* This file is part of the libopencm3 project. * * It was generated by the irq2nvic_h script. */ #ifndef {includeguard} #define {includeguard} /** @defgroup CM3_nvic_defines_{partname_doxygen} User interrupts for {partname_humanreadable} @ingroup CM3_nvic_defines @{{*/ {irqdefinitions} #define NVIC_IRQ_COUNT {irqcount} /**@}}*/ #define WEAK __attribute__ ((weak)) /** @defgroup CM3_nvic_isrprototypes_{partname_doxygen} User interrupt service routines (ISR) prototypes for {partname_humanreadable} @ingroup CM3_nvic_isrprototypes @{{*/ {isrprototypes} /**@}}*/ /** @defgroup CM3_nvic_isrpragmas_{partname_doxygen} User interrupt service routines (ISR) defaults for {partname_humanreadable} @ingroup CM3_nvic_isrpragmas @{{*/ {isrpragmas} /**@}}*/ /* Initialization template for the interrupt vector table. This definition is * used by the startup code generator (vector.c) to set the initial values for * the interrupt handling routines to the chip family specific _isr weak * symbols. */ #define IRQ_HANDLERS \\ {vectortableinitialization} #endif /* {includeguard} */ ''' def convert(infile, outfile): data = yaml.load(infile) irq2name = list(enumerate(data['irqs']) if isinstance(data['irqs'], list) else data['irqs'].items()) irqnames = [v for (k,v) in irq2name] data['irqdefinitions'] = "\n".join('#define NVIC_%s_IRQ %d'%(v.upper(),k) for (k,v) in irq2name) data['irqcount'] = len(irq2name) # FIXME: what if it's a sparse dictionary? data['isrprototypes'] = "\n".join('void WEAK %s_isr(void);'%name.lower() for name in irqnames) data['isrpragmas'] = "\n".join('#pragma weak %s_isr = blocking_handler'%name.lower() for name in irqnames) data['vectortableinitialization'] = ', \\\n '.join('[NVIC_%s_IRQ] = %s_isr'%(name.upper(), name.lower()) for name in irqnames) outfile.write(template.format(**data)) def main(): convert(open('irq.yaml'), open('nvic.h', 'w')) if __name__ == "__main__": main()