libgpiod v2.3
=============

New features:
- replace autotools with meson & ninja as the build system
- provide libgpiotools: a new shared library exposing a public API for
  line name lookup and other high-level helpers previously only available
  internally to gpio-tools
- add initial-state option to gpiomon to display line states before
  waiting for events
- provide comprehensive sphinx-based documentation for all components:
  core C API, C++ bindings, Python bindings, GLib bindings, D-Bus API,
  gpio-tools, and libgpiotools
- extend libgpiosim with new routines allowing to use the new functionality
  provided in more recent versions of the gpio-sim module in the kernel

Improvements:
- make tests work with newer coreutils by removing cases checking tools'
  behavior on SIGINT which stopped working due to changes in behavior of the
  timeout tool
- decouple the libgpiod core C library API version from the global libgpiod
  project version as the former is now quite stable and no longer changes
  with every release
- extend libgpiosim self-tests

Bug fixes:
- allow modifying settings for existing offsets in a full line-config
- fix signed/unsigned type mismatch in gpiod_line_request_get_value()
- add explicit NUL-termination after strncpy() calls in core library
- fix consumer string in line_info stream operator in C++ bindings
- use get_mapped_value() for all enum mappings in line_info in C++ bindings
- move g_tree_remove() out of g_assert() in gpiodbus_id_free() to avoid
  resource exhaustion when assertions are disabled
- return 0 when zero events are requested in edge-event API
- fix gpionotify watching lines on the wrong chip
- reject trailing garbage in parse_period() in gpio-tools
- store interactive sleep period in a long long in gpioset to avoid overflow
- use gpiod_line_settings_free() to release settings in line-config
- fix buffer over-read bugs when translating uAPI structs to library types
- fix variable and argument types where necessary
- sanitize values returned by the kernel to avoid potential buffer overflows
- fix memory leaks in gpio-tools
- add missing return value checks in gpio-tools
- fix period parsing in gpio-tools
- use correct loop counter in error path in gpio-manager
- don't try to export the same chip object twice in gpio-manager on duplicate
  uevents
- use the "add"/"remove" uevents when watching for GPIO chips in the system as
  the "bind"/"unbind" pair is only emitted by linux for controllers which don't
  have a firmware node attached
- don't allow clearing hogs on active devices in tests
- don't install uneeded files
- fix a pkgconfig check in configure
- fix a return type check in test harness
- don't implicity unquote unnamed lines in gpioinfo
- remove useless variable in reconfigure example
- don't let struct line_config balloon out of control and trigger an OOM
- drop python3-config check from configure.ac
- fix potential PyDict_Next() crash in python bindings
- disable the GPIO simulator before releasing it in C++, rust and python
  bindings tests
- fix the way we wait for simulated chips to appear in D-Bus command-line
  client tests
- make read_edge_events lifetimes more explicit in rust bindings
- make waiting for info events more reliable in GLib bindings tests
- defer removal of bank entries when device is not disabled in libgpiosim
- add missing LineInfo import to __init__.py in python bindings

libgpiod v2.2
=============

New features:
- add GObject bindings with introspection
- add a D-Bus interface to libgpiod together with a daemon implementing it and
  a command-line client
- split out the common shell test code for gpio-tools into a reusable test
  harness for GPIO command-line tools
- add minutes as a new supported time unit for tools and allow longer periods
  for timeouts, line holding, etc.
- add a script for generating sdist and wheels for python bindings
- migrate C++ tests to using Catch2 v3

Improvements:
- relicense C++ bindings under LGPL-2.1-or-later in order to make the project
  more attractive to users with GPL-3.0 restrictions
- remove dependency on grep from tools' tests
- make shell scripts pass shellcheck treewide
- use ppoll() in tools to actually achieve the advertised microsecond
  granularity of timeouts
- documentation improvements
- improve typing info in python bindings
- improve __repr__() implementations in python bindings
- make reconfiguring lines more flexible in python bindings by relaxing the
  requirement to carry the ordering of the config entries from the request
- support casting of line.Value to bool in python bindings
- various new test-cases for improved coverage treewide
- align the test cases with the current kernel requirement for specifying
  direction explicitly when reconfiguring lines

Bug fixes:
- fix C++ bindings build using slibtool
- accept the new style automatic GPIO chip labels from gpio-sim in bash tests
- fix C++ tests with recent kernels which introduced stricter reconfigure
  behavior
- fix a use-after-free bug in python bindings
- fix passing the event clock property to line requests in python bindings
- fix a memory leak in tools
- make sure the string buffers in line-info and chip-info are big enough to not
  truncate the strings they hold below the size accepted by the kernel
- remove buggy and unnecessary flags sanitization from line-config
- fix python bindings installation with Makefile build
- sanitize the return values of GPIO ioctl()s which in some cases may be
  erroneously positive
- fix requesting lines by name with multiple entries in python bindings

libgpiod v2.1
=============

New features:
- port tests to shunit2
- add a sample Android build file
- add code examples to the core library and replace existing reimplementations
  of gpio-tools with dedicated examples in bindings
- don't install test executables
- add idle-timeout option to gpiomon and gpionotify
- provide gpiod_line_request_get_chip_name() and respective wrappers in
  bindings

Improvements:
- add more tests for various corner-cases and improve coverage
- documentation improvements
- drop dependencies that make it impossible to build libgpiod with bionic libc
- remove dead code
- use AM_V_GEN where applicable in build

Bug fixes:
- fix a segfault in the GLib wrapper around libgpiosim
- fix a race condition in libgpiosim
- remove an implicit dependency on ncurses in gpio-tools tests
- make value toggling in gpio-tools tests more reliable by removing hard-coded
  sleeps in favor of actively waiting for value changes
- sanitize the arguments in gpiod_line_config_set_output_values()
- make the chip file descriptor blocking in the core library so that calls to
  gpiod_chip_read_info_event() behave as advertised in the docs
- fix setting the event clock type in gpiomon
- fix the regex pattern for version strings
- fix some test cases
- drop profiling flags from tests' Makefile
- don't use the same chip from different threads

libgpiod v2.0
=============

This is a major release that breaks compatiblity with the v1.6.x series. The
entire data model has been overhauled in order to make using the library more
intuitive and less cumbersome, while also making the code future-proof and
extensible. Please refer to the documentation for details.

New features:
- rework the entire API: core C library as well as C++ and Python bindings
- rework the command-line tools in order to make them more line-name-oriented
- drop gpiofind as tools can now resolve line names on their own
- add the interactive mode to gpioset
- add Rust bindings
- make tests work with the gpio-sim kernel module

libgpiod v1.6
=============

New features:
- add a standardized '__version__' module attribute in Python bindings
- print the bias flags info (if set) in gpioinfo

Improvements:
- remove unnecessary indirection in free_dirs() in iterator code
- put all ABI versions next to one another in configure.ac
- improve std namespace resolution in C++ bindings
- add more checks for non-standard functions in configure.ac
- various code size improvements
- enforce gnu89 C standard in makefiles
- many documentation improvements
- unduplicate signalfd() handling in tools
- fix a forward declaration for line_event in C++ bindings

Bug fixes:
- relax is_gpiochip_cdev() for symbolic links
- make gpiod_line_get_value_bulk() work for bulks of lines requested for
  events, not only those requested for values
- fix regex patterns for timestamps in gpiomon test cases
- remove leftover asserts from tests
- fix unit conversion in event timestamp calculation in C++ bindings
- fix reading subset of available events in core library

libgpiod v1.5
=============

New features:
- switched to using the GLib testing framework for core library tests and BATS
  (Bash Automated Testing System) for command-line tools
- used Catch2 C++ testing framework to implement a proper test-suite for C++
  bindings while also reusing the API provided by libgpiomockup
- used Python's unittest package to implement a proper test suite for Python
  bindings and reused libgpiockup again
- provided line::update() and Line.update() routines for C++ and Python
  bindings respectively allowing to update the line info from bindings as well
- added support for bias flags which are a new functionality first available in
  linux v5.5; subsequently the library now requires v5.5 kernel headers to
  build; the new flags are supported in the core library, C++ and Python
  bindings as well as the command-line tools
- added support for the new SET_CONFIG ioctl(): this too is a new functionality
  added in linux v5.5; both features have been implemented in the library by
  Kent Gibson
- added routines for reading multiple line events at once to the core library,
  C++ and Python bindings

Improvements:
- constified function arguments where applicable in libgpiomockup
- fixed the name of the test exeucutable displayed at build time
- improved the function pointer casting in Python bindings to avoid warnings
  emitted by GCC8
- switched to using the KERNEL_VERSION() macro in tests instead of handcoded
  version parsing
- improved the setup ordering in tests (setup libgpiomockup before checking
  the kernel version
- add 'extern "c"' to the libgpiomockup header to make it usable from C++
- add chip index validation to libgpiomockup functions
- check if the debugfs directory used by libgpiomockup is writable before
  using it to set the pull of dummy lines
- add several new test cases
- improved Python example programs (made gpiomon's output similar to the
  original tool, make gpioset wait for an ENTER pres by default)
- fixed the major:minor number comparison between the device and sysfs
- deprecated the gpiod_line_needs_update() function and removed the logic
  behind it from the library
- shrank the Python bindings a bit by directly returning the value from
  PyErr_SetFromErrno()
- dropped noexcept from methods which can throw in C++ bindings
- switched to initializing the bitset with integers instead of strings in C++
  bindings
- allowed gpiod_line_set_value_bulk() to accept null pointers
- when building Python bindings: check for the existence of python-config
- improved the readability of help text messages for command-line tools
- reworked the .gitignore file: added libtool scripts generated during
  cross-compilation and split the main .gitignore into several fine-grained
  files
- fixed several misspellings
- other minor tweaks and improvements

Bug fixes:
- fixed memory leaks in libgpiomockup
- fixed memory leaks in the testing framework
- fixed a segfault in error path in tests
- make gpioinfo show lines claimed by the kernel as used even if they have no
  named consumer
- fixed the test cases validating the '--active-low' switch in gpiomon and
  the GPIOHANDLE_REQUEST_ACTIVE_LOW flag in the core library after a fix
  for incorrect behavior was merged in linux v5.2.7
- stopped failing at init-time of libgpiomockup if gpio-mockup is already
  loaded
- added a missing throw keyword in error path in C++ bindings
- fixed a segfault in Python bindings when calling Line.request() without
  the consumer argument

libgpiod v1.4
=============

New features:
- updated the testing framework to work with linux v5.1 in which the debugfs
  interface of the GPIO testing module changed in a backward incompatible way
- factored out the code controlling the GPIO testing module into a separate
  shared library that may be reused by future testing executables for different
  language bindings
- removed the --enable-install-tests build option and the make check target as
  they were redundant, subsequently tests are now installed as a normal program
  whenever they're enabled with --enable-tests

Improvements:
- removed unnecessary std::move calls from C++ bindings
- added the explicit keyword to bool() operators in C++ bindings

Bug fixes:
- fix out of source build of man pages

libgpiod v1.3
=============

New features:
- the gpio-tools now have automatically generated (using help2man) man pages
  that are bundled with the release tarball
- support a singular 'default_val' argument in Line.request() in python
  bindings
- the test executable can now be installed to the bindir along with the
  gpio-tools and the testing framework will look for the binaries in standard
  locations if it's not run from the top source directory
- gpiomon now supports line buffered output

Improvements:
- tweaks to the C API documentation
- treewide unification of the naming of local variables
- extended helptest in gpioset (explanation of the way the character device
  works aimed at reducing user confusion when a GPIO line reverts to its
  default value after gpioset exits)
- the source directories have been rearranged and the src/ directory was
  dropped, lib/ and tools/ now live in the top source directory
- minor coding style fixes in python bindings, ctxless functions and tools
- automatically generated documentation is now removed by 'make clean'
- all Makefiles now use top_builddir instead of relative paths
- code shrink in configure.ac
- add a brief section about API documentation to README

Bug fixes:
- fix a segfault causing bug in C++ bindings
- make bitset_cmp::operator() const as this is required by C++17
- ignore 'remove' events from udev in the testing framework
- don't segfault on num_lines = 0 in ctxless functions

libgpiod v1.2
=============

New features:
- new contextless event monitor that should replace the previous event loop
  which caused problems on hardware that doesn't allow to watch both rising
  and falling edge events
- port gpiomon to the new event monitor
- deprecate event loop routines

Improvements:
- many minor improvements and tweaks in the python module
- new test cases for python bindings
- add much more detailed documentation for python bindings
- coding style improvements in gpio-tools
- remove unicode characters from build scripts
- improve the help text messages in gpio-tools
- make gpiod_chip_open() and its variants verify that we're really trying to
  open a character device associated with a GPIO chip

Bug fixes:
- fix memory leaks in python bindings
- fix a memory corruption bug in python bindings
- fix the default_vals argument in line request implementation in python
  bindings
- fix a compilation warning in python bindings
- fix gpiod_Chip_find_lines() for nonexistent lines (python bindings)
- add a missing include in C++ bindings examples
- correctly display the version string in gpio-tools

libgpiod v1.1
=============

New features:
- add object-oriented C++ bindings
- add object-oriented Python3 bindings
- add several new helpers to the C API

Improvements:
- start using separate versioning schemes for API and ABI
- use SPDX license identifiers and remove LGPL boilerplate
- check for unexpanded macros in configure.ac

Bug fixes:
- include Doxyfile in the release tarball
- fix the implicit-fallthrough warnings
- make tests work together with gpio-mockup post v4.16 linux kernel
- use reference counting for line file descriptors
- correctly handle POLLNVAL when polling for events
- fix the copyright notice in tools

libgpiod v1.0
=============

NOTE: This is a major release - it breaks the API compatibility with
      the 0.x.y series.

New features:
- remove custom error handling in favor of errnos
- merge the two separate interfaces for event requests and regular line
  requests
- redesign the simple API
- change the prefix of the high-level API from 'simple' to 'ctxless' (for
  contextless) which better reflects its purpose
- redesign the iterator API
- make use of prefixes more consistent
- rename symbols all over the place
- various minor tweaks
- add support for pkg-config

Improvements:
- add a bunch of helpers for line requests
- split the library code into multiple source files by functionality
- re-enable a test case previously broken by a bug in the kernel

Bug fixes:
- correctly handle signal interrupts when polling in gpiod_simple_event_loop()
- fix the linking order when building with static libraries
- pass the correct consumer string to gpiod_simple_get_value_multiple() in
  gpioget
- fix a line test case: don't use open-drain or open-source flags for input
  mode
- fix the flags passed to ar in order to supress a build warning
- set the last error code in gpiod_chip_open_by_label() to ENOENT if a chip
  can't be found
- fix checking the kernel version in the test suite
- fix various coding style issues
- initialize the active low variable in gpiomon

libgpiod v0.3
=============

New features:
- gpiomon can now watch multiple lines at the same time and supports custom
  output formats which can be specified using the --format argument
- testing framework can now test external programs: test cases for gpio-tools
  have been added

Improvements:
- improve error messages
- improve README examples
- configure script improvements

Bug fixes:
- use correct UAPI flags when requesting line events
- capitalize 'GPIO' in error messages in gpioset, gpioget & gpiomon
- tweak the error message on invalid arguments in gpiofind
- don't ignore superfluous arguments and fix the displayed name for falling
  edge events in gpiomon

libgpiod v0.2
=============

New features:
- relicensed under LGPLv2.1
- implemented a unit testing framework together with a comprehensive
  set of test cases
- added a non-closing variant of the gpiochip iterator and foreach
  macro [by Clemens Gruber]
- added gpiod_chip_open_by_label()

Improvements:
- Makefiles & build commands have been reworked [by Thierry Reding]
- documentation updates
- code shrinkage here and there
- coding style fixes
- removed all designated initializers from the header for better standards
  compliance

Bug fixes:
- fix the return value of gpiod_simple_event_loop()
- don't try to process docs if doxygen is not installed
- pass the O_CLOEXEC flag to open() when opening the GPIO chip device file
- include <poll.h> instead of <sys/poll.h> in gpioset
- fix a formatting issue in gpioinfo for chips with >100 GPIO lines
- fix a bug when requesting both-edges event notifications
- fix short options in gpiomon (short opt for --silent was missing)
- correct the kernel headers requirements in README
- include <time.h> for struct timespec
- include <poll.h> instead of <sys/poll.h>
- detect the version of strerror_r()

libgpiod v0.1
=============

First version of libgpiod.

It's currently possible to:
- get and set the values of multiple GPIO lines with a single function call
- monitor a GPIO line for events
- enumerate all GPIO chips present in the system
- enumerate all GPIO lines exposed by a chip
- extract information about GPIO chips (label, name, number of lines)
- extract information about GPIO lines (name, flags, state, user)

Tools provided with the library are:
- gpioget - read values from GPIO lines
- gpioset - set values of GPIO lines
- gpiodetect - list GPIO chips
- gpioinfo - print info about GPIO lines exposed by a chip
- gpiomon - monitor a GPIO line for events
- gpiofind - find a GPIO line by name
